summaryrefslogtreecommitdiff
path: root/sql/event.h
diff options
context:
space:
mode:
authorunknown <andrey@lmy004.>2006-03-16 13:14:40 +0100
committerunknown <andrey@lmy004.>2006-03-16 13:14:40 +0100
commit06dd976419b982f6ee8bf044c1114b30670e1698 (patch)
treeac4adde9d6982bfc3a9ef73f04804de1e4dc7fe6 /sql/event.h
parent28109fed62ef78e035ecb90cc191597a7b2bb1d5 (diff)
downloadmariadb-git-06dd976419b982f6ee8bf044c1114b30670e1698.tar.gz
fix for bug 16408 (Events: crash for an event in a procedure)
(one patch) mysql-test/r/events_bugs.result: fix for bug 16408 mysql-test/t/events_bugs.test: fix for bug 16408 sql/event.h: fix for bug 16408 sql/event_timed.cc: fix for bug 16408 sql/sql_parse.cc: fix for bug 16408 sql/sql_yacc.yy: fix for bug 16408
Diffstat (limited to 'sql/event.h')
-rw-r--r--sql/event.h48
1 files changed, 43 insertions, 5 deletions
diff --git a/sql/event.h b/sql/event.h
index d070f93c575..27de8b46e32 100644
--- a/sql/event.h
+++ b/sql/event.h
@@ -40,7 +40,6 @@
#define EVENT_EXEC_NO_MORE (1L << 0)
#define EVENT_NOT_USED (1L << 1)
-
extern ulong opt_event_executor;
enum enum_event_on_completion
@@ -122,6 +121,39 @@ public:
bool free_sphead_on_delete;
uint flags;//all kind of purposes
+ static void *operator new(size_t size)
+ {
+ void *p;
+ DBUG_ENTER("Event_timed::new(size)");
+ p= my_malloc(size, MYF(0));
+ DBUG_PRINT("info", ("alloc_ptr=0x%lx", p));
+ DBUG_RETURN(p);
+ }
+
+ static void *operator new(size_t size, MEM_ROOT *mem_root)
+ { return (void*) alloc_root(mem_root, (uint) size); }
+
+ static void operator delete(void *ptr, size_t size)
+ {
+ DBUG_ENTER("Event_timed::delete(ptr,size)");
+ DBUG_PRINT("enter", ("free_ptr=0x%lx", ptr));
+ TRASH(ptr, size);
+ my_free((gptr) ptr, MYF(0));
+ DBUG_VOID_RETURN;
+ }
+
+ static void operator delete(void *ptr, MEM_ROOT *mem_root)
+ {
+ /*
+ Don't free the memory it will be done by the mem_root but
+ we need to call the destructor because we free other resources
+ which are not allocated on the root but on the heap, or we
+ deinit mutexes.
+ */
+ DBUG_ASSERT(0);
+ }
+
+
Event_timed():in_spawned_thread(0),locked_by_thread_id(0),
running(0), status_changed(false),
last_executed_changed(false), expression(0), created(0),
@@ -136,15 +168,21 @@ public:
}
~Event_timed()
- {
- pthread_mutex_destroy(&this->LOCK_running);
+ {
+ deinit_mutexes();
+
if (free_sphead_on_delete)
- free_sp();
+ free_sp();
}
-
void
init();
+
+ void
+ deinit_mutexes()
+ {
+ pthread_mutex_destroy(&this->LOCK_running);
+ }
int
init_definer(THD *thd);