watcher: Prevent race condition spawning multiple watcher threads
If file descriptors get added and removed in rapid succession, the active watcher thread might not take notice of it and continues running. However, add() spawns a watcher thread whenever a file descriptor is added to an empty set. This could result in multiple watcher threads, which is fixed by a proper check for running watchers.
This commit is contained in:
1 parent
23750961d5
commit
bc1139480f
1 file changed
+3
-1
@@ -260,8 +260,10 @@ static job_requeue_t watch(private_watcher_t *this)
|
||||
FD_ZERO(&ex);
|
||||
|
||||
this->mutex->lock(this->mutex);
|
||||
|
||||
if (this->fds->get_count(this->fds) == 0)
|
||||
{
|
||||
this->running = FALSE;
|
||||
this->mutex->unlock(this->mutex);
|
||||
return JOB_REQUEUE_NONE;
|
||||
}
|
||||
@@ -405,7 +407,7 @@ METHOD(watcher_t, add, void,
|
||||
|
||||
this->mutex->lock(this->mutex);
|
||||
this->fds->insert_last(this->fds, entry);
|
||||
if (this->fds->get_count(this->fds) == 1)
|
||||
if (!this->running)
|
||||
{
|
||||
this->running = TRUE;
|
||||
lib->processor->queue_job(lib->processor,
|
||||
|
||||
Reference in new issue
Block a user