Commit c483c5ca authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

MDEV-33627 preparation - tpool fix

Fix tpool to not use maintenance timer for fixed pool size.
parent 59167c56
...@@ -441,7 +441,7 @@ class thread_pool_generic : public thread_pool ...@@ -441,7 +441,7 @@ class thread_pool_generic : public thread_pool
disarm(); disarm();
} }
}; };
timer_generic m_maintenance_timer; timer_generic* m_maintenance_timer=nullptr;
timer* create_timer(callback_func func, void *data) override timer* create_timer(callback_func func, void *data) override
{ {
return new timer_generic(func, data, this); return new timer_generic(func, data, this);
...@@ -751,9 +751,16 @@ bool thread_pool_generic::add_thread() ...@@ -751,9 +751,16 @@ bool thread_pool_generic::add_thread()
reset the flag in thread_pool_generic::worker_main in new thread created. The reset the flag in thread_pool_generic::worker_main in new thread created. The
flag must be reset back in case we fail to create the thread. If this flag is flag must be reset back in case we fail to create the thread. If this flag is
not reset all future attempt to create thread for this pool would not work as not reset all future attempt to create thread for this pool would not work as
we would return from here. */ we would return from here.
if (m_thread_creation_pending.test_and_set())
return false; Do not use this flag for pool of fixed size.
(since they lack maintenence that would rectify the pool size, if it is too small)
*/
if (m_min_threads != m_max_threads)
{
if (m_thread_creation_pending.test_and_set())
return false;
}
worker_data *thread_data = m_thread_data_cache.get(); worker_data *thread_data = m_thread_data_cache.get();
m_active_threads.push_back(thread_data); m_active_threads.push_back(thread_data);
...@@ -820,13 +827,16 @@ thread_pool_generic::thread_pool_generic(int min_threads, int max_threads) : ...@@ -820,13 +827,16 @@ thread_pool_generic::thread_pool_generic(int min_threads, int max_threads) :
m_min_threads(min_threads), m_min_threads(min_threads),
m_max_threads(max_threads), m_max_threads(max_threads),
m_last_thread_count(), m_last_thread_count(),
m_last_activity(), m_last_activity()
m_maintenance_timer(thread_pool_generic::maintenance_func, this, nullptr)
{ {
set_concurrency(); set_concurrency();
// start the timer // start the timer
m_maintenance_timer.set_time(0, (int)m_timer_interval.count()); if (m_min_threads != m_max_threads)
{
m_maintenance_timer= new timer_generic(thread_pool_generic::maintenance_func, this, nullptr);
m_maintenance_timer->set_time(0, (int)m_timer_interval.count());
}
} }
...@@ -933,7 +943,8 @@ void thread_pool_generic::switch_timer(timer_state_t state) ...@@ -933,7 +943,8 @@ void thread_pool_generic::switch_timer(timer_state_t state)
long long period= (state == timer_state_t::OFF) ? long long period= (state == timer_state_t::OFF) ?
m_timer_interval.count()*10: m_timer_interval.count(); m_timer_interval.count()*10: m_timer_interval.count();
m_maintenance_timer.set_period((int)period); if (m_maintenance_timer)
m_maintenance_timer->set_period((int)period);
} }
...@@ -951,7 +962,8 @@ thread_pool_generic::~thread_pool_generic() ...@@ -951,7 +962,8 @@ thread_pool_generic::~thread_pool_generic()
m_aio.reset(); m_aio.reset();
/* Also stop the maintanence task early. */ /* Also stop the maintanence task early. */
m_maintenance_timer.disarm(); if (m_maintenance_timer)
m_maintenance_timer->disarm();
std::unique_lock<std::mutex> lk(m_mtx); std::unique_lock<std::mutex> lk(m_mtx);
m_in_shutdown= true; m_in_shutdown= true;
...@@ -967,6 +979,7 @@ thread_pool_generic::~thread_pool_generic() ...@@ -967,6 +979,7 @@ thread_pool_generic::~thread_pool_generic()
} }
lk.unlock(); lk.unlock();
delete m_maintenance_timer;
} }
thread_pool *create_thread_pool_generic(int min_threads, int max_threads) thread_pool *create_thread_pool_generic(int min_threads, int max_threads)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment