mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 20:43:04 +01:00
Fixed unregistred bug (rc3 vs rc2 regression) - races when closing touchThread
This commit is contained in:
parent
16f7504427
commit
7067fb4862
@ -131,7 +131,7 @@ ConfigStorage::ConfigStorage() :
|
|||||||
if (gds__thread_start(touchThread, (void*) this, THREAD_medium, 0, NULL))
|
if (gds__thread_start(touchThread, (void*) this, THREAD_medium, 0, NULL))
|
||||||
gds__log("Trace facility: can't start touch thread");
|
gds__log("Trace facility: can't start touch thread");
|
||||||
else
|
else
|
||||||
m_touchStartSem.enter();
|
m_touchStartStop.tryEnter(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,6 +139,7 @@ ConfigStorage::~ConfigStorage()
|
|||||||
{
|
{
|
||||||
// signal touchThread to finish
|
// signal touchThread to finish
|
||||||
m_touchSemaphore->Semaphore::release();
|
m_touchSemaphore->Semaphore::release();
|
||||||
|
m_touchStartStop.tryEnter(3);
|
||||||
|
|
||||||
::close(m_cfg_file);
|
::close(m_cfg_file);
|
||||||
m_cfg_file = -1;
|
m_cfg_file = -1;
|
||||||
@ -317,6 +318,10 @@ THREAD_ENTRY_DECLARE ConfigStorage::touchThread(THREAD_ENTRY_PARAM arg)
|
|||||||
{
|
{
|
||||||
ConfigStorage* storage = (ConfigStorage*) arg;
|
ConfigStorage* storage = (ConfigStorage*) arg;
|
||||||
storage->touchThreadFunc();
|
storage->touchThreadFunc();
|
||||||
|
|
||||||
|
// release start/stop semaphore only here to avoid problems
|
||||||
|
// with dtors of local varoables in touchThreadFunc()
|
||||||
|
storage->m_touchStartStop.release();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,7 +331,7 @@ void ConfigStorage::touchThreadFunc()
|
|||||||
AnyRef<Semaphore>* semaphore = m_touchSemaphore;
|
AnyRef<Semaphore>* semaphore = m_touchSemaphore;
|
||||||
Reference semRef(*semaphore);
|
Reference semRef(*semaphore);
|
||||||
|
|
||||||
m_touchStartSem.release();
|
m_touchStartStop.release();
|
||||||
|
|
||||||
int delay = TOUCH_INTERVAL / 2;
|
int delay = TOUCH_INTERVAL / 2;
|
||||||
while (!semaphore->tryEnter(delay))
|
while (!semaphore->tryEnter(delay))
|
||||||
|
@ -127,7 +127,7 @@ private:
|
|||||||
struct mtx* m_mutex;
|
struct mtx* m_mutex;
|
||||||
int m_cfg_file;
|
int m_cfg_file;
|
||||||
bool m_dirty;
|
bool m_dirty;
|
||||||
Firebird::Semaphore m_touchStartSem;
|
Firebird::Semaphore m_touchStartStop;
|
||||||
Firebird::AnyRef<Firebird::Semaphore>* m_touchSemaphore;
|
Firebird::AnyRef<Firebird::Semaphore>* m_touchSemaphore;
|
||||||
Firebird::Reference m_touchSemRef;
|
Firebird::Reference m_touchSemRef;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user