mirror of https://github.com/Icinga/icinga2.git
Fixed deadlock in Process::WorkerThreadProc.
This commit is contained in:
parent
67aef452e5
commit
aa2322abbb
|
@ -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;
|
||||
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue