aboutsummaryrefslogtreecommitdiff
path: root/src/ManualTerminationFile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ManualTerminationFile.c')
-rw-r--r--src/ManualTerminationFile.c89
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;
}