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:
Martin Willi
2014-06-17 15:19:47 +02:00
parent 23750961d5
commit bc1139480f
+3 -1
View File
@@ -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,