mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
MDEV-33627 preparation - tpool fix
Fix tpool to not use maintenance timer for fixed pool size.
This commit is contained in:
parent
59167c567b
commit
c483c5ca56
1 changed files with 22 additions and 9 deletions
|
@ -441,7 +441,7 @@ public:
|
|||
disarm();
|
||||
}
|
||||
};
|
||||
timer_generic m_maintenance_timer;
|
||||
timer_generic* m_maintenance_timer=nullptr;
|
||||
timer* create_timer(callback_func func, void *data) override
|
||||
{
|
||||
return new timer_generic(func, data, this);
|
||||
|
@ -751,9 +751,16 @@ bool thread_pool_generic::add_thread()
|
|||
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
|
||||
not reset all future attempt to create thread for this pool would not work as
|
||||
we would return from here. */
|
||||
if (m_thread_creation_pending.test_and_set())
|
||||
return false;
|
||||
we would return from here.
|
||||
|
||||
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();
|
||||
m_active_threads.push_back(thread_data);
|
||||
|
@ -820,13 +827,16 @@ thread_pool_generic::thread_pool_generic(int min_threads, int max_threads) :
|
|||
m_min_threads(min_threads),
|
||||
m_max_threads(max_threads),
|
||||
m_last_thread_count(),
|
||||
m_last_activity(),
|
||||
m_maintenance_timer(thread_pool_generic::maintenance_func, this, nullptr)
|
||||
m_last_activity()
|
||||
{
|
||||
set_concurrency();
|
||||
|
||||
// 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)
|
|||
long long period= (state == timer_state_t::OFF) ?
|
||||
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()
|
|||
m_aio.reset();
|
||||
|
||||
/* 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);
|
||||
m_in_shutdown= true;
|
||||
|
@ -967,6 +979,7 @@ thread_pool_generic::~thread_pool_generic()
|
|||
}
|
||||
|
||||
lk.unlock();
|
||||
delete m_maintenance_timer;
|
||||
}
|
||||
|
||||
thread_pool *create_thread_pool_generic(int min_threads, int max_threads)
|
||||
|
|
Loading…
Reference in a new issue