Hi,
I'm writing mariadb daemon type plugin.
I hava a question.
In a daemon thread, I want to use THD instance. for example,
-----------------------------------------------------------------------------------
class THD;
static int plugin_init() {
...
pthread_create(&id,&attr,my_func,...);
}
void my_func(void* p)
{
THD* thd = new THD;
thd->thread_stack= (char*) &thd;
thd->store_globals();
tables.init_one_table("performance_schema", 18, "events_statements_current", 25, "events_statements_current", TL_READ);
open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT);
...
}
--------------------------------------------------------------------------------------------
but In my_func(), new THD cause error. I guess thread problem.
So I moved that code to plugin_init() for test as below
--------------------------------------------------------------
class THD;
static int plugin_init() {
...
pthread_create(&id,&attr,my_func,...);
THD* thd = new THD;
thd->thread_stack= (char*) &thd;
thd->store_globals();
tables.init_one_table("performance_schema", 18, "events_statements_current", 25, "events_statements_current", TL_READ);
open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT);
...
}
-----------------------------------------------------------------------------
and then there is no problem. but I need a daemon thread.
I think that the reason of this error is assertion of thread. So I changed my code as below.
---------------------------------------------------------------------------------
class THD;
THD* thd;
static int plugin_init() {
...
pthread_create(&id,&attr,my_func,...);
THD* thd = new THD; // moved here from my_func() for avoiding error.
}
void my_func(void* p)
{
thd->thread_stack= (char*) &thd;
thd->store_globals();
tables.init_one_table("performance_schema", 18, "events_statements_current", 25, "events_statements_current", TL_READ);
open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT);
...
}
-----------------------------------------------------------------------------------------
At this time, thd->store_globals() cause error.
In sql_class.cc , mysys_var->id= thread_id cause error because mysys_var is null.
Let me know how to use THD instance in daemon thread.
Regards,
Kyungnam