Skip to content

Commit

Permalink
Revert "Address a race condition in libevent select."
Browse files Browse the repository at this point in the history
We do not want to be patching upstream components anymore.
The proper method is to get this merged upstream, then
pull it in the next upstream release.

This reverts commit c39fb57.

Signed-off-by: Austen Lauria <[email protected]>
  • Loading branch information
awlauria committed Jul 14, 2020
1 parent aa8f7f4 commit 67d9016
Showing 1 changed file with 5 additions and 24 deletions.
29 changes: 5 additions & 24 deletions opal/mca/event/libevent2022/libevent/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>

#include "event-internal.h"
#include "evsignal-internal.h"
Expand Down Expand Up @@ -167,30 +166,12 @@ select_dispatch(struct event_base *base, struct timeval *tv)
check_selectop(sop);

if (res == -1) {
if (errno == EINTR) {
return (0);
if (errno != EINTR) {
event_warn("select");
return (-1);
}
/* There seems to be a very subtle race condition between the
* event_del and the select, where the fd is still active on the
* event_readset_in but no libevent structure make reference
* to it so it. Thus, any call to progress will no nothing more
* than print a warning and do nothing, leading to deadlocks.
* If we force remove the problematic fd, we get the warning only
* once, and things work as expected.
*/
event_warn("select");
for (j = 0; j < nfds; ++j) {
if (FD_ISSET(j, sop->event_readset_in) ||
FD_ISSET(j, sop->event_writeset_in)) {
res = fcntl(j, F_GETFL);
if( res == -1 ) {
event_warn("bad file descriptor %d/%d\n", j, nfds);
FD_CLR(j, sop->event_readset_in);
FD_CLR(j, sop->event_writeset_in);
}
}
}
return (-1);

return (0);
}

event_debug(("%s: select reports %d", __func__, res));
Expand Down

0 comments on commit 67d9016

Please sign in to comment.