Ouch - opal_progress calls event_loop with a NO_BLOCK flag. So when run without progress threads, the ORTE tools were not blocking in the event lib as they should be. Avoid calling opal_progress inside ORTE by directly using the event_loop call instead of ORTE_WAIT_FOR_COMPLETION as parts of the OMPI layer are using that macro.
Thanks to George for spotting the problem. This commit was SVN r27815.
Этот коммит содержится в:
родитель
e30d9a2bfb
Коммит
5b8de0b9f4
@ -821,7 +821,19 @@ int orte_daemon(int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* loop the event lib until an exit event is detected */
|
||||
ORTE_WAIT_FOR_COMPLETION(orte_event_base_active);
|
||||
#if ORTE_ENABLE_PROGRESS_THREADS
|
||||
while (orte_event_base_active) {
|
||||
/* provide a very short quiet period so we
|
||||
* don't hammer the cpu while
|
||||
*/
|
||||
struct timespec tp = {0, 100};
|
||||
nanosleep(&tp, NULL);
|
||||
}
|
||||
#else
|
||||
while (orte_event_base_active) {
|
||||
opal_event_loop(orte_event_base, OPAL_EVLOOP_ONCE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ensure all local procs are dead */
|
||||
orte_odls.kill_local_procs(NULL);
|
||||
|
@ -1020,7 +1020,19 @@ int orterun(int argc, char *argv[])
|
||||
rc = orte_plm.spawn(jdata);
|
||||
|
||||
/* loop the event lib until an exit event is detected */
|
||||
ORTE_WAIT_FOR_COMPLETION(orte_event_base_active);
|
||||
#if ORTE_ENABLE_PROGRESS_THREADS
|
||||
while (orte_event_base_active) {
|
||||
/* provide a very short quiet period so we
|
||||
* don't hammer the cpu while
|
||||
*/
|
||||
struct timespec tp = {0, 100};
|
||||
nanosleep(&tp, NULL);
|
||||
}
|
||||
#else
|
||||
while (orte_event_base_active) {
|
||||
opal_event_loop(orte_event_base, OPAL_EVLOOP_ONCE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ensure all local procs are dead */
|
||||
orte_odls.kill_local_procs(NULL);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user