From 71c53ba004520ff093b9852acd20f46c79baaf32 Mon Sep 17 00:00:00 2001 From: Matthias Diener Date: Thu, 19 Jul 2018 16:14:07 -0500 Subject: [PATCH] AMPI: correct exit code on exit() Change-Id: I4f363bd7c0c1aa0a03ae710691e8f13d3f9c60b8 --- src/libs/ck-libs/ParFUM/ParFUM.C | 2 +- src/libs/ck-libs/ampi/ampi.C | 7 +------ src/libs/ck-libs/armci/armci_api.C | 2 +- src/libs/ck-libs/fem/fem.C | 2 +- src/libs/ck-libs/tcharm/tcharm.C | 19 +++++++++++-------- src/libs/ck-libs/tcharm/tcharm_impl.h | 2 +- src/libs/ck-libs/tcharm/tcharmc.h | 2 +- src/util/ckstandalone.C | 4 ++-- tests/ampi/exit/Makefile | 7 +++---- 9 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/libs/ck-libs/ParFUM/ParFUM.C b/src/libs/ck-libs/ParFUM/ParFUM.C index a9959ea863..2510f96aa3 100644 --- a/src/libs/ck-libs/ParFUM/ParFUM.C +++ b/src/libs/ck-libs/ParFUM/ParFUM.C @@ -675,7 +675,7 @@ FEM_Async_Migrate(void) CDECL void FEM_Done(void) { - TCHARM_Done(); + TCHARM_Done(0); } CDECL int diff --git a/src/libs/ck-libs/ampi/ampi.C b/src/libs/ck-libs/ampi/ampi.C index 083c6c7250..2671d15546 100644 --- a/src/libs/ck-libs/ampi/ampi.C +++ b/src/libs/ck-libs/ampi/ampi.C @@ -3867,14 +3867,9 @@ void AMPI_Exit(int exitCode) // application with ampicc), exit cleanly when the application calls exit(). AMPI_API_INIT("AMPI_Exit"); CkpvAccess(msgPool).clear(); - if (exitCode) { - char err[64]; - sprintf(err, "Application terminated with exit code %d.\n", exitCode); - CkAbort(err); - } if (!atexit_called) - TCHARM_Done(); + TCHARM_Done(exitCode); } FDECL diff --git a/src/libs/ck-libs/armci/armci_api.C b/src/libs/ck-libs/armci/armci_api.C index 17c96df805..5420b0038d 100644 --- a/src/libs/ck-libs/armci/armci_api.C +++ b/src/libs/ck-libs/armci/armci_api.C @@ -29,7 +29,7 @@ CDECL int ARMCI_Init(void) { CDECL int ARMCI_Finalize(void) { TCHARM_API_TRACE("ARMCI_Finalize", "armci"); - TCHARM_Done(); + TCHARM_Done(0); return 0; } diff --git a/src/libs/ck-libs/fem/fem.C b/src/libs/ck-libs/fem/fem.C index 520e612729..7d4d1c821a 100644 --- a/src/libs/ck-libs/fem/fem.C +++ b/src/libs/ck-libs/fem/fem.C @@ -604,7 +604,7 @@ FEM_Async_Migrate(void) CDECL void FEM_Done(void) { - TCHARM_Done(); + TCHARM_Done(0); } CDECL int diff --git a/src/libs/ck-libs/tcharm/tcharm.C b/src/libs/ck-libs/tcharm/tcharm.C index 210133a833..e4f76e8561 100644 --- a/src/libs/ck-libs/tcharm/tcharm.C +++ b/src/libs/ck-libs/tcharm/tcharm.C @@ -174,7 +174,7 @@ static void startTCharmThread(TCharmInitMsg *msg) TCHARM_Thread_data_start_fn threadFn = getTCharmThreadFunction(msg->threadFn); threadFn(msg->data); TCharm::deactivateThread(); - CtvAccess(_curTCharm)->done(); + CtvAccess(_curTCharm)->done(0); } TCharm::TCharm(TCharmInitMsg *initMsg_) @@ -634,13 +634,15 @@ void TCharm::atBarrier(void){ } //Called when the thread is done running -void TCharm::done(void) { +void TCharm::done(int exitcode) { //CmiPrintStackTrace(0); DBG("TCharm thread "<setCallback(cb); + contribute(exitmsg); } isSelfDone = true; stop(); @@ -649,13 +651,14 @@ void TCharm::done(void) { void TCharm::atExit(CkReductionMsg* msg) { DBGX("TCharm::atExit1> exiting"); //thisProxy.unsetFlags(); + int exitcode = *(int*)msg->getData(); // NOTE: We use an explicit message rather than a [reductiontarget] entry method // here so that we can delete the msg explicitly *before* calling CkExit(), // otherwise the underlying message is leaked (and valgrind reports it). delete msg; - CkExit(); + CkExit(exitcode); //CkPrintf("After CkExit()!!!!!!!\n"); } @@ -951,14 +954,14 @@ CDECL void TCHARM_Barrier(void) } FORTRAN_AS_C(TCHARM_BARRIER,TCHARM_Barrier,tcharm_barrier,(void),()) -CDECL void TCHARM_Done(void) +CDECL void TCHARM_Done(int exitcode) { TCHARMAPI("TCHARM_Done"); TCharm *c=TCharm::getNULL(); - if (!c) CkExit(); - else c->done(); + if (!c) CkExit(exitcode); + else c->done(exitcode); } -FORTRAN_AS_C(TCHARM_DONE,TCHARM_Done,tcharm_done,(void),()) +FORTRAN_AS_C(TCHARM_DONE,TCHARM_Done,tcharm_done,(int *exitcode),(*exitcode)) CDECL double TCHARM_Wall_timer(void) diff --git a/src/libs/ck-libs/tcharm/tcharm_impl.h b/src/libs/ck-libs/tcharm/tcharm_impl.h index 9b9a820547..159e5e9742 100644 --- a/src/libs/ck-libs/tcharm/tcharm_impl.h +++ b/src/libs/ck-libs/tcharm/tcharm_impl.h @@ -197,7 +197,7 @@ class TCharm: public CBase_TCharm #endif //Thread finished running - void done(void); + void done(int exitcode); //Register user data to be packed with the thread int add(const UserData &d); diff --git a/src/libs/ck-libs/tcharm/tcharmc.h b/src/libs/ck-libs/tcharm/tcharmc.h index 076f9a3b83..98ed89e24f 100644 --- a/src/libs/ck-libs/tcharm/tcharmc.h +++ b/src/libs/ck-libs/tcharm/tcharmc.h @@ -51,7 +51,7 @@ void TCHARM_Migrate_to(int destPE); void TCHARM_Evacuate(); int TCHARM_System(const char *shell_command); -void TCHARM_Done(void); +void TCHARM_Done(int exitcode); void TCHARM_Yield(void); /* Set/get thread-private ("thread global") data. */ diff --git a/src/util/ckstandalone.C b/src/util/ckstandalone.C index aafdbfcf4d..1c548e91dc 100644 --- a/src/util/ckstandalone.C +++ b/src/util/ckstandalone.C @@ -76,8 +76,8 @@ FORTRAN_AS_C_RETURN(int,TCHARM_REGISTER,TCHARM_Register,tcharm_register, CDECL void *TCHARM_Get_userdata(int id) {return 0;} -CDECL void TCHARM_Done(void) { /* fallthrough */ } -FORTRAN_AS_C(TCHARM_DONE,TCHARM_Done,tcharm_done,(void),()) +CDECL void TCHARM_Done(int exitcode) { /* fallthrough */ } +FORTRAN_AS_C(TCHARM_DONE,TCHARM_Done,tcharm_done,(int *exitcode),(*exitcode)) CDECL void TCHARM_Barrier(void) { /* fallthrough */ } FORTRAN_AS_C(TCHARM_BARRIER,TCHARM_Barrier,tcharm_barrier,(void),()) diff --git a/tests/ampi/exit/Makefile b/tests/ampi/exit/Makefile index 0e0ab384db..0ef55ec40f 100644 --- a/tests/ampi/exit/Makefile +++ b/tests/ampi/exit/Makefile @@ -4,12 +4,11 @@ CHARMC=../../../bin/ampicxx $(OPTS) $(MOPTS) all: test_exit test_exit: test_exit.C - $(CHARMC) -o $@ test_exit.C + $(CHARMC) -o $@ $< # Check that application exits correctly with exit code 42. -test: clean test_exit - $(call run, test_exit 2>&1)| tee tmp.out; grep -q "Application terminated with exit code 42" tmp.out && echo "Exit test passed." || (echo "Exit test failed."; false) - @rm -f tmp.out +test: test_exit + $(call run, test_exit 2>&1); [ $$? -eq 42 ] && echo "Exit test passed." || (echo "Exit test failed."; false) clean: rm -f *.o test_exit charmrun ampirun -- 2.11.4.GIT