Replace TCharmGetArgv (which only worked during startup on processor 0)
authorOrion Lawlor <olawlor@acm.org>
Tue, 16 Jul 2002 22:21:08 +0000 (22:21 +0000)
committerOrion Lawlor <olawlor@acm.org>
Tue, 16 Jul 2002 22:21:08 +0000 (22:21 +0000)
with the new CkGetArgv, which works all the time on every processor.

Also added Fortran (quasi-standard) "iargc" and "getarg" routines,
which are used to extract the command-line arguments.

src/libs/ck-libs/tcharm/tcharm.C
src/libs/ck-libs/tcharm/tcharmc.h
src/libs/ck-libs/tcharm/tcharmf.h

index 0b1e03e7469028ace87de44d5e64388ab1c44da7..488f5f859621e6ce2da29d569367b915653037c5 100644 (file)
@@ -582,27 +582,11 @@ FDECL void FTN_NAME(TCHARM_CREATE_DATA,tcharm_create_data)
 { TCharmCreateData(*nThreads,threadFn,threadData,*threadDataLen); }
 
 
-/*Get the unconsumed command-line arguments*/
-CDECL char **TCharmArgv(void)
-{
-       TCHARMAPI("TCharmArgv");
-       if (TCharm::getState()!=inInit)
-               CkAbort("TCharm> Can only get arguments from in init!\n");
-       return cookie.getArgv();
-}
-CDECL int TCharmArgc(void)
-{
-       TCHARMAPI("TCharmArgc");
-       if (TCharm::getState()!=inInit)
-               CkAbort("TCharm> Can only get arguments from in init!\n");
-       return CmiGetArgc(cookie.getArgv());
-}
-
 CDECL int TCharmGetNumChunks(void)
 {
        TCHARMAPI("TCharmGetNumChunks");
        int nChunks=CkNumPes();
-       char **argv=TCharmArgv();
+       char **argv=CkGetArgv();
        CmiGetArgInt(argv,"-vp",&nChunks);
        CmiGetArgInt(argv,"+vp",&nChunks);
        lastNumChunks=nChunks;
@@ -708,6 +692,27 @@ CDECL double TCharmWallTimer(void)
   }
 }
 
+#if 1
+/*Include Fortran-style "iargc" and "getarg" routines.
+These are needed to get access to the command-line arguments from Fortran.
+*/
+FDECL int FTN_NAME(IARGC,iargc)(void) {
+  TCHARMAPI("iargc");
+  return CkGetArgc()-1;
+}
+
+FDECL void FTN_NAME(GETARG,getarg)(int *i_p,char *dest,int destLen) {
+  TCHARMAPI("getarg");
+  int i=*i_p;
+  if (i<0) CkAbort("getarg called with negative argument!");
+  if (i>=CkGetArgc()) CkAbort("getarg called with argument > iargc!");
+  const char *src=CkGetArgv()[i];
+  strcpy(dest,src);
+  for (i=strlen(dest);i<destLen;i++) dest[i]=' ';
+}
+
+#endif
+
 //These silly routines are used for serial startup:
 extern void _initCharm(int argc, char **argv);
 CDECL void TCharmInit(int *argc,char ***argv) {
index f3a3cf29b4c36ff2040bb3c133934c6995f8b72b..e4d73893d387d2c447b7575c992822213269580e 100644 (file)
@@ -38,10 +38,6 @@ typedef void (*TCharmThreadDataStartFn)(void *threadData);
 void TCharmCreateData(int nThreads,TCharmThreadDataStartFn threadFn,
                  void *threadData,int threadDataLen);
 
-/*Get the unconsumed command-line arguments (C only; no Fortran)*/
-char **TCharmArgv(void);
-int TCharmArgc(void);
-
 /*Get the number of chunks we expect based on the command line*/
 int TCharmGetNumChunks(void);
 
@@ -57,9 +53,12 @@ void *TCharmGetUserdata(int id);
 void TCharmMigrate(void);
 void TCharmDone(void);
 
-/*Get the local wall clock*/
+/*Get the local wall clock.  Unlike CkWalltimer, is
+  monotonically increasing, even with migration and 
+  unsynchronized clocks. */
 double TCharmWallTimer(void);
 
+
 /*Standalone startup routine*/
 void TCharmInit(int *argc,char ***argv);
 
index f029eddcd2ffb7bb628ddedf46c3a752ad543be5..331bb92318eae50b5a12d8a6e3fc6fb88416976e 100644 (file)
@@ -15,3 +15,5 @@
        external tcharm_readonly_globals
        external tcharm_init
 
+       integer, external :: iargc
+       external getarg