diff options
Diffstat (limited to 'src/ManualTerminationFile.c')
-rw-r--r-- | src/ManualTerminationFile.c | 89 |
1 files changed, 77 insertions, 12 deletions
diff --git a/src/ManualTerminationFile.c b/src/ManualTerminationFile.c index 342ac3f..7e10a38 100644 --- a/src/ManualTerminationFile.c +++ b/src/ManualTerminationFile.c @@ -1,14 +1,68 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> #include "cctk.h" #include "cctk_Arguments.h" #include "cctk_Parameters.h" #include "cctk_Termination.h" -#include "cctk_Timers.h" -#include "ManualTermination.h" +enum{ BUFLEN = 128 }; +/* On first call, pass parameter terminate_filename. + If it is null will construct file name in /tmp based on PBS_JOBID. + Subsequent calls ignore the argument, and return a static buffer. +*/ +const char * MT_get_terminate_filename (CCTK_STRING terminate_filename) +{ + static char buf[BUFLEN]; + + if (strlen (buf) != 0) + return buf; + + if (strlen (terminate_filename) == 0) + { + const char * pbs_jobid = getenv ("MANUAL_TERMINATION_JOB_ID"); + if (pbs_jobid == NULL) + pbs_jobid = getenv ("PBS_JOBID"); + + if (pbs_jobid == NULL) + CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, "ManualTermination", + "Could not find environment variable " + "'MANUAL_TERMINATION_JOB_ID' or 'PBS_JOBID'" + ); + else + snprintf (buf, BUFLEN, "/tmp/cactus_terminate.%s", pbs_jobid); + } + else + { + snprintf (buf, BUFLEN, "%s", terminate_filename); + } + return buf; +} + +int ManualTermination_Init (CCTK_ARGUMENTS) +{ + DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS; + + if (termination_from_file) + { + FILE *termfile = fopen (MT_get_terminate_filename (termination_file), "w"); + if (termfile != NULL) + { + fprintf (termfile, "%d", 0); + fclose (termfile); + } + else + { + CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, "ManualTermination", + "Could not open termination file '%s'. Error: %d", + MT_get_terminate_filename (NULL), strerror (errno)); + } + } + return 0; +} int ManualTerminationFile (CCTK_ARGUMENTS) { @@ -20,29 +74,40 @@ int ManualTerminationFile (CCTK_ARGUMENTS) /* only one processor needs to query the elapsed runtime */ if (CCTK_MyProc (cctkGH) != 0) { - return (0); + return 0; } - if ( ((cctkGH->cctk_iteration-1) % check_file_every*1.0e0) != 0) + if (((cctkGH->cctk_iteration- 1) % check_file_every * 1.0e0) != 0) { - return(0); + return 0; } - terminationfile = fopen(MT_get_terminate_filename(NULL),"r"); + terminationfile = fopen (MT_get_terminate_filename (NULL), "r"); - if(terminationfile!=NULL) + if (terminationfile != NULL) { - terminate=0; - fscanf(terminationfile,"%d",&terminate); - fclose(terminationfile); + terminate = 0; + fscanf (terminationfile, "%d", &terminate); + fclose (terminationfile); - if (terminate==1) + if (terminate == 1) { + CCTK_INFO ("------------------------------------------------------"); CCTK_VInfo (CCTK_THORNSTRING, "OH MY GOD! Found termination signal " "in termination file! TERMINATION NOW!!!!"); + CCTK_INFO ("------------------------------------------------------"); CCTK_TerminateNext (cctkGH); } } - return (retval); + return retval; +} + +int ManualTermination_Cleanup (CCTK_ARGUMENTS) +{ + DECLARE_CCTK_PARAMETERS; + + if (termination_from_file && MT_get_terminate_filename (NULL)) + remove (MT_get_terminate_filename (NULL)); + return 0; } |