mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#14549809 LINKING PROBLEM IN 5.5.28 BUILDS WITH THREADPOOL PLUGIN
The use of Thread_iterator did not work on windows (linking problems). Solution: Change the interface between the thread_pool and the server to only use simple free functions. This patch is for 5.5 only (mimicks similar solution in 5.6)
This commit is contained in:
@ -62,24 +62,8 @@ void thd_set_mysys_var(THD *thd, st_my_thread_var *mysys_var);
|
|||||||
ulong thd_get_net_wait_timeout(THD *thd);
|
ulong thd_get_net_wait_timeout(THD *thd);
|
||||||
my_socket thd_get_fd(THD *thd);
|
my_socket thd_get_fd(THD *thd);
|
||||||
|
|
||||||
/* Interface class for global thread list iteration */
|
THD *first_global_thread();
|
||||||
class Thread_iterator
|
THD *next_global_thread(THD *thd);
|
||||||
{
|
|
||||||
public:
|
|
||||||
Thread_iterator() : m_iterator(threads) {}
|
|
||||||
THD* next()
|
|
||||||
{
|
|
||||||
THD* tmp = m_iterator++;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
/*
|
|
||||||
Don't allow copying of this class.
|
|
||||||
*/
|
|
||||||
Thread_iterator(const Thread_iterator&);
|
|
||||||
void operator=(const Thread_iterator&);
|
|
||||||
I_List_iterator<THD> m_iterator;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Print to the MySQL error log */
|
/* Print to the MySQL error log */
|
||||||
void sql_print_error(const char *format, ...);
|
void sql_print_error(const char *format, ...);
|
||||||
|
@ -601,6 +601,21 @@ I_List<THD> threads;
|
|||||||
Rpl_filter* rpl_filter;
|
Rpl_filter* rpl_filter;
|
||||||
Rpl_filter* binlog_filter;
|
Rpl_filter* binlog_filter;
|
||||||
|
|
||||||
|
THD *first_global_thread()
|
||||||
|
{
|
||||||
|
if (threads.is_empty())
|
||||||
|
return NULL;
|
||||||
|
return threads.head();
|
||||||
|
}
|
||||||
|
|
||||||
|
THD *next_global_thread(THD *thd)
|
||||||
|
{
|
||||||
|
if (threads.is_last(thd))
|
||||||
|
return NULL;
|
||||||
|
struct ilink *next= thd->next;
|
||||||
|
return static_cast<THD*>(next);
|
||||||
|
}
|
||||||
|
|
||||||
struct system_variables global_system_variables;
|
struct system_variables global_system_variables;
|
||||||
struct system_variables max_system_variables;
|
struct system_variables max_system_variables;
|
||||||
struct system_status_var global_status_var;
|
struct system_status_var global_status_var;
|
||||||
|
@ -585,6 +585,9 @@ public:
|
|||||||
inline void empty() { first= &last; last.prev= &first; }
|
inline void empty() { first= &last; last.prev= &first; }
|
||||||
base_ilist() { empty(); }
|
base_ilist() { empty(); }
|
||||||
inline bool is_empty() { return first == &last; }
|
inline bool is_empty() { return first == &last; }
|
||||||
|
// Returns true if p is the last "real" object in the list,
|
||||||
|
// i.e. p->next points to the sentinel.
|
||||||
|
inline bool is_last(ilink *p) { return p->next == NULL || p->next == &last; }
|
||||||
inline void append(ilink *a)
|
inline void append(ilink *a)
|
||||||
{
|
{
|
||||||
first->prev= &a->next;
|
first->prev= &a->next;
|
||||||
@ -660,6 +663,7 @@ class I_List :private base_ilist
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
I_List() :base_ilist() {}
|
I_List() :base_ilist() {}
|
||||||
|
inline bool is_last(T *p) { return base_ilist::is_last(p); }
|
||||||
inline void empty() { base_ilist::empty(); }
|
inline void empty() { base_ilist::empty(); }
|
||||||
inline bool is_empty() { return base_ilist::is_empty(); }
|
inline bool is_empty() { return base_ilist::is_empty(); }
|
||||||
inline void append(T* a) { base_ilist::append(a); }
|
inline void append(T* a) { base_ilist::append(a); }
|
||||||
|
Reference in New Issue
Block a user