Handle zero timeout correctly
This commit is contained in:
parent
91e263cabb
commit
b1168f6c6c
@ -133,16 +133,18 @@ static PyObject *
|
|||||||
loop(ChildMonitor *self) {
|
loop(ChildMonitor *self) {
|
||||||
#define loop_doc "loop() -> The monitor loop."
|
#define loop_doc "loop() -> The monitor loop."
|
||||||
size_t i;
|
size_t i;
|
||||||
|
double interval;
|
||||||
int ret, timeout;
|
int ret, timeout;
|
||||||
bool has_more;
|
bool has_more;
|
||||||
PyObject *t;
|
PyObject *t;
|
||||||
while (LIKELY(!self->shutting_down)) {
|
while (LIKELY(!self->shutting_down)) {
|
||||||
for (i = 0; i < self->count + EXTRA_FDS; i++) self->fds[i].revents = 0;
|
for (i = 0; i < self->count + EXTRA_FDS; i++) self->fds[i].revents = 0;
|
||||||
for (i = EXTRA_FDS; i < EXTRA_FDS + self->count; i++) self->fds[i].events = self->children[i - EXTRA_FDS].needs_write ? POLLOUT | POLLIN : POLLIN;
|
for (i = EXTRA_FDS; i < EXTRA_FDS + self->count; i++) self->fds[i].events = self->children[i - EXTRA_FDS].needs_write ? POLLOUT | POLLIN : POLLIN;
|
||||||
timeout = (int)(timers_timeout(self->timers) * 1000);
|
interval = timers_timeout(self->timers);
|
||||||
// Sub-millisecond interval will become 0, so round up to 1ms as this is the resolution of poll()
|
|
||||||
if (timeout == 0) timeout = 1;
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
|
if (interval < 0) timeout = -1;
|
||||||
|
else if (interval == 0) timeout = 0;
|
||||||
|
else timeout = MAX(1, (int)(interval * 1000)); // Sub-millisecond interval will become 0, so round up to 1ms as this is the resolution of poll()
|
||||||
ret = poll(self->fds, self->count + EXTRA_FDS, timeout);
|
ret = poll(self->fds, self->count + EXTRA_FDS, timeout);
|
||||||
Py_END_ALLOW_THREADS;
|
Py_END_ALLOW_THREADS;
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user