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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user