| 1 | #ifndef SCHEDULER_INCLUDED |
| 2 | #define SCHEDULER_INCLUDED |
| 3 | |
| 4 | /* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. |
| 5 | Copyright (c) 2012, Monty Program Ab |
| 6 | |
| 7 | This program is free software; you can redistribute it and/or modify |
| 8 | it under the terms of the GNU General Public License as published by |
| 9 | the Free Software Foundation; version 2 of the License. |
| 10 | |
| 11 | This program is distributed in the hope that it will be useful, |
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | GNU General Public License for more details. |
| 15 | |
| 16 | You should have received a copy of the GNU General Public License |
| 17 | along with this program; if not, write to the Free Software |
| 18 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 19 | |
| 20 | /* |
| 21 | Classes for the thread scheduler |
| 22 | */ |
| 23 | |
| 24 | #ifdef USE_PRAGMA_INTERFACE |
| 25 | #pragma interface |
| 26 | #endif |
| 27 | |
| 28 | class THD; |
| 29 | |
| 30 | /* Functions used when manipulating threads */ |
| 31 | |
| 32 | struct scheduler_functions |
| 33 | { |
| 34 | uint max_threads, *connection_count; |
| 35 | ulong *max_connections; |
| 36 | bool (*init)(void); |
| 37 | bool (*init_new_connection_thread)(void); |
| 38 | void (*add_connection)(CONNECT *connect); |
| 39 | void (*thd_wait_begin)(THD *thd, int wait_type); |
| 40 | void (*thd_wait_end)(THD *thd); |
| 41 | void (*post_kill_notification)(THD *thd); |
| 42 | bool (*end_thread)(THD *thd, bool cache_thread); |
| 43 | void (*end)(void); |
| 44 | }; |
| 45 | |
| 46 | |
| 47 | /** |
| 48 | Scheduler types enumeration. |
| 49 | |
| 50 | The default of --thread-handling is the first one in the |
| 51 | thread_handling_names array, this array has to be consistent with |
| 52 | the order in this array, so to change default one has to change the |
| 53 | first entry in this enum and the first entry in the |
| 54 | thread_handling_names array. |
| 55 | |
| 56 | @note The last entry of the enumeration is also used to mark the |
| 57 | thread handling as dynamic. In this case the name of the thread |
| 58 | handling is fetched from the name of the plugin that implements it. |
| 59 | */ |
| 60 | enum scheduler_types |
| 61 | { |
| 62 | /* |
| 63 | The default of --thread-handling is the first one in the |
| 64 | thread_handling_names array, this array has to be consistent with |
| 65 | the order in this array, so to change default one has to change |
| 66 | the first entry in this enum and the first entry in the |
| 67 | thread_handling_names array. |
| 68 | */ |
| 69 | SCHEDULER_ONE_THREAD_PER_CONNECTION=0, |
| 70 | SCHEDULER_NO_THREADS, |
| 71 | SCHEDULER_TYPES_COUNT |
| 72 | }; |
| 73 | |
| 74 | void one_thread_per_connection_scheduler(scheduler_functions *func, |
| 75 | ulong *arg_max_connections, uint *arg_connection_count); |
| 76 | void one_thread_scheduler(scheduler_functions *func); |
| 77 | |
| 78 | extern void scheduler_init(); |
| 79 | extern void post_kill_notification(THD *); |
| 80 | /* |
| 81 | To be used for pool-of-threads (implemeneted differently on various OSs) |
| 82 | */ |
| 83 | struct thd_scheduler |
| 84 | { |
| 85 | public: |
| 86 | /* |
| 87 | Thread instrumentation for the user job. |
| 88 | This member holds the instrumentation while the user job is not run |
| 89 | by a thread. |
| 90 | |
| 91 | Note that this member is not conditionally declared |
| 92 | (ifdef HAVE_PSI_INTERFACE), because doing so will change the binary |
| 93 | layout of THD, which is exposed to plugin code that may be compiled |
| 94 | differently. |
| 95 | */ |
| 96 | PSI_thread *m_psi; |
| 97 | void *data; /* scheduler-specific data structure */ |
| 98 | }; |
| 99 | |
| 100 | #ifdef HAVE_POOL_OF_THREADS |
| 101 | void pool_of_threads_scheduler(scheduler_functions* func, |
| 102 | ulong *arg_max_connections, |
| 103 | uint *arg_connection_count); |
| 104 | #else |
| 105 | #define pool_of_threads_scheduler(A,B,C) \ |
| 106 | one_thread_per_connection_scheduler(A, B, C) |
| 107 | #endif /*HAVE_POOL_OF_THREADS*/ |
| 108 | |
| 109 | #endif /* SCHEDULER_INCLUDED */ |
| 110 | |