Skip to content

Commit 1368793

Browse files
committed
Add ESMF_RUNTIME_LOGMSGABORT ESMF_RUNTIME_ABORT
* use ESMF_RUNTIME_LOGMSGABORT to set logMsgAbort for ESMF logs * use ESMF_RUNTIME_ABORT to call sigquit for ESMF_Abort
1 parent 22a2e3d commit 1368793

File tree

6 files changed

+161
-1
lines changed

6 files changed

+161
-1
lines changed

src/Infrastructure/Util/src/ESMF_LogErr.F90

+56-1
Original file line numberDiff line numberDiff line change
@@ -1804,6 +1804,10 @@ end subroutine f_ESMF_VMGlobalGet
18041804
type(ESMF_LogEntry), dimension(:), pointer :: localbuf
18051805
character(len=ESMF_MAXPATHLEN) :: fname
18061806
character(ESMF_MAXSTR) :: petNumChar
1807+
integer :: msgAbortCnt
1808+
type(ESMF_LogMsg_Flag) :: msgAbortLst(6)
1809+
character(ESMF_MAXSTR) :: envRtAbort
1810+
integer :: idxRtAbort
18071811
character(8) :: position
18081812
integer :: petCount
18091813
integer :: digits
@@ -1864,7 +1868,58 @@ end subroutine f_ESMF_VMGlobalGet
18641868
alog%flushed = ESMF_FALSE
18651869
alog%dirty = ESMF_FALSE
18661870
alog%FileIsOpen=ESMF_FALSE
1867-
alog%logmsgAbort => null ()
1871+
if (associated (alog%logmsgAbort)) deallocate (alog%logmsgAbort)
1872+
call c_ESMC_VMGetEnv("ESMF_RUNTIME_LOGMSGABORT", envRtAbort, localrc)
1873+
if (localrc /= ESMF_SUCCESS) then
1874+
write (ESMF_UtilIOStderr,*) ESMF_METHOD, &
1875+
": VMGetEnv - ESMF_RUNTIME_LOGMSGABORT "
1876+
call ESMF_UtilIOUnitFlush(ESMF_UtilIOStderr, rc=rc)
1877+
if (present(rc)) rc=localrc
1878+
return
1879+
end if
1880+
msgAbortCnt = 0
1881+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_INFO")
1882+
if (idxRtAbort > 0) then
1883+
msgAbortCnt = msgAbortCnt + 1
1884+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_INFO
1885+
endif
1886+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_WARNING")
1887+
if (idxRtAbort > 0) then
1888+
msgAbortCnt = msgAbortCnt + 1
1889+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_WARNING
1890+
endif
1891+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_ERROR")
1892+
if (idxRtAbort > 0) then
1893+
msgAbortCnt = msgAbortCnt + 1
1894+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_ERROR
1895+
endif
1896+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_TRACE")
1897+
if (idxRtAbort > 0) then
1898+
msgAbortCnt = msgAbortCnt + 1
1899+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_TRACE
1900+
endif
1901+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_DEBUG")
1902+
if (idxRtAbort > 0) then
1903+
msgAbortCnt = msgAbortCnt + 1
1904+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_DEBUG
1905+
endif
1906+
idxRtAbort = index (envRtAbort, "ESMF_LOGMSG_JSON")
1907+
if (idxRtAbort > 0) then
1908+
msgAbortCnt = msgAbortCnt + 1
1909+
msgAbortLst(msgAbortCnt) = ESMF_LOGMSG_JSON
1910+
endif
1911+
if (msgAbortCnt > 6) then
1912+
write (ESMF_UtilIOStderr,*) ESMF_METHOD, &
1913+
": msgAbortLst overflow - ESMF_RUNTIME_LOGMSGABORT"
1914+
call ESMF_UtilIOUnitFlush(ESMF_UtilIOStderr, rc=rc)
1915+
if (present(rc)) rc=ESMF_RC_BUFFER_SHORT
1916+
return
1917+
elseif (msgAbortCnt == 0) then
1918+
alog%logmsgAbort => null ()
1919+
else
1920+
allocate(alog%logmsgAbort(msgAbortCnt))
1921+
alog%logmsgAbort=msgAbortLst(1:msgAbortCnt)
1922+
endif
18681923
nullify(alog%errorMask)
18691924
alog%errorMaskCount=0
18701925
if (present(logkindflag)) then

src/Infrastructure/VM/interface/ESMCI_VM_F.C

+33
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,39 @@ extern "C" {
12051205
if (rc!=NULL) *rc = ESMF_SUCCESS;
12061206
}
12071207

1208+
void FTN_X(c_esmc_vmgetenv)(char *name, char *value, int *rc,
1209+
ESMCI_FortranStrLenArg name_l, ESMCI_FortranStrLenArg value_l){
1210+
#undef ESMC_METHOD
1211+
#define ESMC_METHOD "c_esmc_vmgetenv()"
1212+
// Initialize return code; assume routine not implemented
1213+
if (rc!=NULL) *rc = ESMC_RC_NOT_IMPL;
1214+
try{
1215+
std::string nameStr(name, name_l);
1216+
std::string envVarStr;
1217+
char const *envVar = ESMCI::VM::getenv(nameStr.c_str());
1218+
if (envVar != NULL && strlen(envVar) > 0) {
1219+
envVarStr.assign(envVar);
1220+
}else{
1221+
envVarStr.assign("");
1222+
}
1223+
std::strncpy (value, envVarStr.c_str(), value_l);
1224+
}catch(int localrc){
1225+
if (ESMC_LogDefault.MsgFoundError(localrc, ESMCI_ERR_PASSTHRU,
1226+
ESMC_CONTEXT, rc))
1227+
return; // bail out
1228+
}catch(std::exception &x){
1229+
ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, x.what(), ESMC_CONTEXT,
1230+
rc);
1231+
return; // bail out
1232+
}catch(...){
1233+
ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, "- Caught exception",
1234+
ESMC_CONTEXT, rc);
1235+
return;
1236+
}
1237+
// return successfully
1238+
if (rc!=NULL) *rc = ESMF_SUCCESS;
1239+
}
1240+
12081241
void FTN_X(c_esmc_vmsetenv)(char *name, char *value, int *rc,
12091242
ESMCI_FortranStrLenArg name_l, ESMCI_FortranStrLenArg value_l){
12101243
#undef ESMC_METHOD

src/Infrastructure/VM/interface/ESMF_VM.F90

+44
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ subroutine c_ESMC_VMSendRecvNB(vm, sendData, sendSize, dst, recvData, &
458458
public ESMF_VMInitializePreMPI
459459
public ESMF_VMInitialize
460460
public ESMF_VMSet
461+
public ESMF_VMGetEnv
461462
public ESMF_VMSetEnv
462463
public ESMF_VMFinalize
463464
public ESMF_VMAbort
@@ -9398,6 +9399,49 @@ end subroutine ESMF_VMSet
93989399
!------------------------------------------------------------------------------
93999400

94009401

9402+
! -------------------------- ESMF-internal method -----------------------------
9403+
#undef ESMF_METHOD
9404+
#define ESMF_METHOD "ESMF_VMGetEnv()"
9405+
!BOPI
9406+
! !IROUTINE: ESMF_VMGetEnv - Get environment variable cached in the Global VM
9407+
9408+
! !INTERFACE:
9409+
subroutine ESMF_VMGetEnv(name, value, rc)
9410+
!
9411+
! !ARGUMENTS:
9412+
character(*), intent(in) :: name
9413+
character(*), intent(out) :: value
9414+
integer, intent(out), optional :: rc
9415+
!
9416+
! !DESCRIPTION:
9417+
! Get environment variable cached in the Global VM.
9418+
!
9419+
! The arguments are:
9420+
! \begin{description}
9421+
! \item [name]
9422+
! The name of the environment variable.
9423+
! \item [value]
9424+
! The value of the environment variable.
9425+
! \item[{[rc]}]
9426+
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
9427+
! \end{description}
9428+
!
9429+
!EOPI
9430+
!------------------------------------------------------------------------------
9431+
integer :: localrc ! local return code
9432+
9433+
! Call into the C++ interface.
9434+
call c_ESMC_VMGetEnv(name, value, localrc)
9435+
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
9436+
ESMF_CONTEXT, rcToReturn=rc)) return
9437+
9438+
! return successfully
9439+
if (present(rc)) rc = ESMF_SUCCESS
9440+
9441+
end subroutine ESMF_VMGetEnv
9442+
!------------------------------------------------------------------------------
9443+
9444+
94019445
! -------------------------- ESMF-internal method -----------------------------
94029446
#undef ESMF_METHOD
94039447
#define ESMF_METHOD "ESMF_VMSetEnv()"

src/Infrastructure/VM/src/ESMCI_VM.C

+12
Original file line numberDiff line numberDiff line change
@@ -3370,6 +3370,18 @@ VM *VM::initialize(
33703370
esmfRuntimeEnv.push_back(esmfRuntimeVarName);
33713371
esmfRuntimeEnvValue.push_back(esmfRuntimeVarValue);
33723372
}
3373+
esmfRuntimeVarName = "ESMF_RUNTIME_LOGMSGABORT";
3374+
esmfRuntimeVarValue = std::getenv(esmfRuntimeVarName);
3375+
if (esmfRuntimeVarValue){
3376+
esmfRuntimeEnv.push_back(esmfRuntimeVarName);
3377+
esmfRuntimeEnvValue.push_back(esmfRuntimeVarValue);
3378+
}
3379+
esmfRuntimeVarName = "ESMF_RUNTIME_ABORT";
3380+
esmfRuntimeVarValue = std::getenv(esmfRuntimeVarName);
3381+
if (esmfRuntimeVarValue){
3382+
esmfRuntimeEnv.push_back(esmfRuntimeVarName);
3383+
esmfRuntimeEnvValue.push_back(esmfRuntimeVarValue);
3384+
}
33733385

33743386
int count = esmfRuntimeEnv.size();
33753387
GlobalVM->broadcast(&count, sizeof(int), 0);

src/Infrastructure/VM/src/ESMCI_VMKernel.C

+13
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,19 @@ struct SpawnArg{
899899
void VMK::abort(){
900900
// abort default (all MPI) virtual machine
901901
int finalized;
902+
bool signal_quit;
903+
904+
signal_quit = false;
905+
char const *envRuntimeAbort = VM::getenv("ESMF_RUNTIME_ABORT");
906+
if (envRuntimeAbort != NULL && strlen(envRuntimeAbort) > 0) {
907+
string runtimeAbort(envRuntimeAbort);
908+
transform(runtimeAbort.begin(), runtimeAbort.end(),
909+
runtimeAbort.begin(), ::toupper);
910+
if (runtimeAbort.find("SIGQUIT") != string::npos) {
911+
signal_quit = true;
912+
}
913+
}
914+
if (signal_quit) raise (SIGQUIT);
902915
MPI_Finalized(&finalized);
903916
if (!finalized)
904917
MPI_Abort(default_mpi_c, EXIT_FAILURE);

src/Superstructure/ESMFMod/src/ESMF_Init.F90

+3
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,9 @@ subroutine ESMF_FrameworkInternalInit(lang, configFilenameFromArgNum, &
11071107
endif
11081108
endif
11091109

1110+
call ingest_environment_variable("ESMF_RUNTIME_LOGMSGABORT")
1111+
call ingest_environment_variable("ESMF_RUNTIME_ABORT")
1112+
11101113
endif ! have a default Config
11111114

11121115
if (present(configFilenameFromArgNum).or.present(configFilename)) &

0 commit comments

Comments
 (0)