hopefully this fixes the looping gatling processes
This commit is contained in:
parent
45702476e7
commit
ff3a3410ec
@ -140,6 +140,20 @@ int64 io_waituntil2(int64 milliseconds) {
|
||||
if (e->wantwrite) y[i].events|=EPOLLOUT;
|
||||
}
|
||||
|
||||
newevents=0;
|
||||
if (!e->canread || e->wantread) {
|
||||
newevents|=EPOLLIN;
|
||||
e->kernelwantread=1;
|
||||
} else
|
||||
e->kernelwantread=0;
|
||||
if (!e->canwrite || e->wantwrite) {
|
||||
newevents|=EPOLLOUT;
|
||||
e->kernelwantwrite=1;
|
||||
} else
|
||||
e->kernelwantwrite=0;
|
||||
|
||||
/* if we think we can not read, but the kernel tells us that we
|
||||
* can, put this fd in the relevant data structures */
|
||||
if (!e->canread && (y[i].events&(EPOLLIN|EPOLLPRI|EPOLLRDNORM|EPOLLRDBAND))) {
|
||||
if (e->canread) {
|
||||
newevents &= ~EPOLLIN;
|
||||
@ -151,9 +165,22 @@ int64 io_waituntil2(int64 milliseconds) {
|
||||
}
|
||||
}
|
||||
}
|
||||
/* if the kernel says the fd is writable, ... */
|
||||
if (y[i].events&EPOLLOUT) {
|
||||
/* Usually, if the kernel says a descriptor is writable, we
|
||||
* note it and do not tell the kernel not to tell us again.
|
||||
* The idea is that once we notify the caller that the fd is
|
||||
* writable, and the caller handles the event, the caller will
|
||||
* just ask to be notified of future write events again. We
|
||||
* are trying to save the superfluous epoll_ctl syscalls.
|
||||
* If e->canwrite is set, then this gamble did not work out.
|
||||
* We told the caller, yet after the caller is done we still
|
||||
* got another write event. Clearly the user is implementing
|
||||
* some kind of throttling and we can tell the kernel to leave
|
||||
* us alone for now. */
|
||||
if (e->canwrite) {
|
||||
newevents &= ~EPOLLOUT;
|
||||
e->kernelwantwrite=0;
|
||||
} else {
|
||||
/* If !e->wantwrite: The laziness optimization in
|
||||
* io_dontwantwrite hit. We did not tell the kernel that we
|
||||
@ -168,17 +195,6 @@ int64 io_waituntil2(int64 milliseconds) {
|
||||
}
|
||||
}
|
||||
|
||||
newevents=0;
|
||||
if (!e->canread || e->wantread) {
|
||||
newevents|=EPOLLIN;
|
||||
e->kernelwantread=1;
|
||||
} else
|
||||
e->kernelwantread=0;
|
||||
if (!e->canwrite || e->wantwrite) {
|
||||
newevents|=EPOLLOUT;
|
||||
e->kernelwantwrite=1;
|
||||
} else
|
||||
e->kernelwantwrite=0;
|
||||
if (newevents != curevents) {
|
||||
#if 0
|
||||
printf("canread %d, wantread %d, kernelwantread %d, canwrite %d, wantwrite %d, kernelwantwrite %d\n",
|
||||
|
Loading…
x
Reference in New Issue
Block a user