1 #ifndef _EVENT_QUEUE_H_ 2 #define _EVENT_QUEUE_H_ 3 /* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; version 2 of the License. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ 17 18 /** 19 20 @addtogroup Event_Scheduler 21 @{ 22 23 @file event_queue.h 24 25 Queue of events awaiting execution. 26 */ 27 28 #ifdef HAVE_PSI_INTERFACE 29 extern PSI_mutex_key key_LOCK_event_queue; 30 extern PSI_cond_key key_COND_queue_state; 31 #endif /* HAVE_PSI_INTERFACE */ 32 33 #include "queues.h" // QUEUE 34 #include "sql_string.h" /* LEX_CSTRING */ 35 #include "my_time.h" /* my_time_t, interval_type */ 36 37 class Event_basic; 38 class Event_queue_element; 39 class Event_queue_element_for_exec; 40 41 class THD; 42 43 /** 44 Queue of active events awaiting execution. 45 */ 46 47 class Event_queue 48 { 49 public: 50 Event_queue(); 51 ~Event_queue(); 52 53 bool 54 init_queue(THD *thd); 55 56 /* Methods for queue management follow */ 57 58 bool 59 create_event(THD *thd, Event_queue_element *new_element, 60 bool *created); 61 62 void 63 update_event(THD *thd, const LEX_CSTRING *dbname, const LEX_CSTRING *name, 64 Event_queue_element *new_element); 65 66 void 67 drop_event(THD *thd, const LEX_CSTRING *dbname, const LEX_CSTRING *name); 68 69 void 70 drop_schema_events(THD *thd, const LEX_CSTRING *schema); 71 72 void 73 recalculate_activation_times(THD *thd); 74 75 bool 76 get_top_for_execution_if_time(THD *thd, 77 Event_queue_element_for_exec **event_name); 78 79 80 void 81 dump_internal_status(); 82 83 private: 84 void 85 empty_queue(); 86 87 void 88 deinit_queue(); 89 /* helper functions for working with mutexes & conditionals */ 90 void 91 lock_data(const char *func, uint line); 92 93 void 94 unlock_data(const char *func, uint line); 95 96 void 97 cond_wait(THD *thd, struct timespec *abstime, const PSI_stage_info *stage, 98 const char *src_func, const char *src_file, uint src_line); 99 100 void 101 find_n_remove_event(const LEX_CSTRING *db, const LEX_CSTRING *name); 102 103 104 void 105 drop_matching_events(THD *thd, const LEX_CSTRING *pattern, 106 bool (*)(const LEX_CSTRING*, Event_basic *)); 107 108 109 void 110 dbug_dump_queue(my_time_t now); 111 112 /* LOCK_event_queue is the mutex which protects the access to the queue. */ 113 mysql_mutex_t LOCK_event_queue; 114 mysql_cond_t COND_queue_state; 115 116 /* The sorted queue with the Event_queue_element objects */ 117 QUEUE queue; 118 119 my_time_t next_activation_at; 120 121 uint mutex_last_locked_at_line; 122 uint mutex_last_unlocked_at_line; 123 uint mutex_last_attempted_lock_at_line; 124 const char* mutex_last_locked_in_func; 125 const char* mutex_last_unlocked_in_func; 126 const char* mutex_last_attempted_lock_in_func; 127 bool mutex_queue_data_locked; 128 bool mutex_queue_data_attempting_lock; 129 bool waiting_on_cond; 130 }; 131 /** 132 @} (End of group Event_Scheduler) 133 */ 134 135 #endif /* _EVENT_QUEUE_H_ */ 136