Fixed deadlock in Process::WorkerThreadProc.

This commit is contained in:
Gunnar Beutner 2013-02-10 21:53:08 +01:00
parent 67aef452e5
commit aa2322abbb
1 changed files with 25 additions and 10 deletions

View File

@ -136,6 +136,8 @@ void Process::WorkerThreadProc(int taskFd)
int nfds = 0;
FD_ZERO(&readfds);
if (tasks.size() < MaxTasksPerThread)
FD_SET(taskFd, &readfds);
if (taskFd > nfds)
@ -149,23 +151,36 @@ void Process::WorkerThreadProc(int taskFd)
FD_SET(fd, &readfds);
}
timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
select(nfds + 1, &readfds, NULL, NULL, &tv);
int rc = select(nfds + 1, &readfds, NULL, NULL, NULL);
if (rc < 0 && errno != EINTR)
BOOST_THROW_EXCEPTION(PosixException("select() failed.", errno));
if (rc == 0)
continue;
#else /* _MSC_VER */
Utility::Sleep(1);
#endif /* _MSC_VER */
#ifndef _MSC_VER
if (FD_ISSET(taskFd, &readfds)) {
/* clear pipe */
char buffer[512];
int rc = read(taskFd, buffer, sizeof(buffer));
assert(rc >= 1);
#endif /* _MSC_VER */
/* Figure out how many tasks we'd ideally want. */
int tasknum = MaxTasksPerThread - tasks.size();
#ifndef _MSC_VER
/* Read one byte for every task we take from the pending tasks list. */
char buffer[MaxTasksPerThread];
tasknum = read(taskFd, &buffer, tasknum);
if (tasknum < 0)
BOOST_THROW_EXCEPTION(PosixException("read() failed.", errno));
assert(tasknum >= 1);
#endif /* _MSC_VER */
while (tasks.size() < MaxTasksPerThread) {
for (int i = 0; i < tasknum; i++) {
Process::Ptr task;
{