* fix deadlock in signal add code. Should not call the event_loop from
a function that has the lock. Instead, recalculate the pending events directly. Same effect, but less deadlock. This commit was SVN r6720.
Этот коммит содержится в:
родитель
aa0525da98
Коммит
124850d1c5
@ -60,6 +60,8 @@
|
|||||||
#include "opal/util/output.h"
|
#include "opal/util/output.h"
|
||||||
|
|
||||||
extern struct opal_event_list opal_signalqueue;
|
extern struct opal_event_list opal_signalqueue;
|
||||||
|
extern const struct opal_eventop *opal_evsel;
|
||||||
|
extern void *opal_evbase;
|
||||||
|
|
||||||
static short opal_evsigcaught[NSIG];
|
static short opal_evsigcaught[NSIG];
|
||||||
static int opal_needrecalc;
|
static int opal_needrecalc;
|
||||||
@ -119,11 +121,16 @@ opal_evsignal_add(sigset_t *evsigmask, struct opal_event *ev)
|
|||||||
errx(1, "%s: OPAL_EV_SIGNAL incompatible use", __func__);
|
errx(1, "%s: OPAL_EV_SIGNAL incompatible use", __func__);
|
||||||
evsignal = OPAL_EVENT_SIGNAL(ev);
|
evsignal = OPAL_EVENT_SIGNAL(ev);
|
||||||
|
|
||||||
#if OMPI_ENABLE_PROGRESS_THREADS
|
/* force a recalc of the events we are waiting for, otherwise
|
||||||
if (!opal_using_threads()) opal_event_loop(OPAL_EVLOOP_NONBLOCK);
|
events aren't recalculated until the next time event_loop
|
||||||
#else
|
is called. Since that might not be for some time, that
|
||||||
opal_event_loop(OPAL_EVLOOP_NONBLOCK);
|
gives a window where a signal handler *should* be installed
|
||||||
#endif
|
but actually is not. */
|
||||||
|
if (opal_evsel->recalc && opal_evsel->recalc(opal_evbase, 0) == -1) {
|
||||||
|
opal_output(0, "opal_event_loop: opal_evsel->recalc() failed.");
|
||||||
|
opal_mutex_unlock(&opal_event_lock);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
sigaddset(evsigmask, evsignal);
|
sigaddset(evsigmask, evsignal);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user