watcher: Rebuild fdset when select() fails

This should make sure we refresh the fdset if a user closes an FD it just
removed. Some selects() seem to complain about the bad FD before signaling the
notification pipe.
This commit is contained in:
Martin Willi
2013-10-24 15:37:20 +02:00
parent 1a20a22d09
commit 5ce3c9b15a
+12 -1
View File
@@ -44,6 +44,11 @@ struct private_watcher_t {
*/ */
linked_list_t *fds; linked_list_t *fds;
/**
* Pending update of FD list?
*/
bool pending;
/** /**
* Lock to access FD list * Lock to access FD list
*/ */
@@ -106,6 +111,7 @@ static void update(private_watcher_t *this)
{ {
char buf[1] = { 'u' }; char buf[1] = { 'u' };
this->pending = TRUE;
if (this->notify[1] != -1) if (this->notify[1] != -1)
{ {
ignore_result(write(this->notify[1], buf, sizeof(buf))); ignore_result(write(this->notify[1], buf, sizeof(buf)));
@@ -294,6 +300,7 @@ static job_requeue_t watch(private_watcher_t *this)
{ {
DBG2(DBG_JOB, "watcher got notification, rebuilding"); DBG2(DBG_JOB, "watcher got notification, rebuilding");
while (read(this->notify[0], buf, sizeof(buf)) > 0); while (read(this->notify[0], buf, sizeof(buf)) > 0);
this->pending = FALSE;
return JOB_REQUEUE_DIRECT; return JOB_REQUEUE_DIRECT;
} }
@@ -333,7 +340,11 @@ static job_requeue_t watch(private_watcher_t *this)
} }
else else
{ {
DBG1(DBG_JOB, "watcher select() error: %s", strerror(errno)); if (!this->pending)
{ /* complain only if no pending updates */
DBG1(DBG_JOB, "watcher select() error: %s", strerror(errno));
}
return JOB_REQUEUE_DIRECT;
} }
} }
} }