Added support for making system calls via TCHARM.
authorOrion Lawlor <olawlor@acm.org>
Wed, 25 Aug 2004 18:58:14 +0000 (18:58 +0000)
committerOrion Lawlor <olawlor@acm.org>
Wed, 25 Aug 2004 18:58:14 +0000 (18:58 +0000)
This is needed to work around a bug in pre-glibc 2.3
ia32 LinuxThreads where fork() results in the child
process SEGV'ing if called from a user-level thread.

The fix is to pass the system() (and hence fork())
call up to the main thread, which can run it OK.

src/libs/ck-libs/tcharm/tcharm.C
src/libs/ck-libs/tcharm/tcharm.ci
src/libs/ck-libs/tcharm/tcharm_impl.h
src/libs/ck-libs/tcharm/tcharmc.h

index 707ce2d9879999e97b71899c27100bbc7ce460f3..7563e0b833bf7c0041fff4dfbb755aea57f34458 100644 (file)
@@ -872,4 +872,39 @@ void *TCharm::semaPeek(int id) {
        return s->data;
 }
 
+/****** System Call support ******/
+/*
+TCHARM_System exists to work around a bug where Linux ia32
+glibc2.2.x with pthreads crashes at the fork() site when 
+called from a user-levelthread. 
+
+The fix is to call system from the main thread, by 
+passing the request out of the thread to our array element 
+before calling system().
+*/
+
+CDECL int 
+TCHARM_System(const char *shell_command)
+{
+       return TCharm::get()->system(shell_command);
+}
+int TCharm::system(const char *cmd)
+{
+       int ret=-1778;
+       callSystemStruct s;
+       s.cmd=cmd;
+       s.ret=&ret;
+       thisProxy[thisIndex].callSystem(s);
+       suspend();
+       return ret;
+}
+
+void TCharm::callSystem(const callSystemStruct &s)
+{
+       *s.ret = ::system(s.cmd);
+       resume();
+}
+
+
+
 #include "tcharm.def.h"
index a1e973f3a6504b1dccc763cf6349c27b000033aa..e168af46fb35877c4e0c7b04c951dd1bf81234c3 100644 (file)
@@ -8,6 +8,7 @@ module tcharm {
     entry void atExit(CkReductionMsg *);
     entry void migrateDelayed(int destPE);
     entry void start(void);
+    entry void callSystem(callSystemStruct s);
     initproc void procInit(void);
     initnode void nodeInit(void);
   };
index db9eaafb7536339e0e3ce30ce8d89e13b7a3e9a0..ea050204058970cfb59ee709a525ae718868f818 100644 (file)
@@ -19,6 +19,15 @@ Orion Sky Lawlor, olawlor@acm.org, 11/19/2001
 
 class TCharmTraceLibList;
 
+/// Used to ship around system calls.
+class callSystemStruct {
+public:
+       const char *cmd; ///< Shell command to execute.
+       int *ret; ///< Place to store command's return value.
+};
+PUPbytes(callSystemStruct);
+
+
 #include "tcharm.decl.h"
 
 class TCharm;
@@ -149,7 +158,6 @@ class TCharm: public CBase_TCharm
        void migrateDelayed(int destPE);
        void atBarrier(CkReductionMsg *);
        void atExit(CkReductionMsg *);
-
        void clear();
 
        //Pup routine packs the user data and migrates the thread
@@ -221,6 +229,10 @@ class TCharm: public CBase_TCharm
                CmiIsomallocBlockListActivate(NULL);
                CtgInstall(NULL);               
        }
+       
+       /// System() call emulation:
+       int system(const char *cmd);
+       void callSystem(const callSystemStruct &s);
 };
 
 
index 06e9f54d4c29529898fd02d6a571bfd60f1a728b..47a6ae77ab4c83286ef1d105f8bd1e312b2a17f3 100644 (file)
@@ -47,6 +47,7 @@ void TCHARM_Migrate(void);
 void TCHARM_Async_Migrate(void);
 void TCHARM_Allow_Migrate(void);
 void TCHARM_Migrate_to(int destPE);
+int TCHARM_System(const char *shell_command);
 void TCHARM_Done(void);
 void TCHARM_Yield(void);