Added a hack that restores CINT state if macro execution ends with an exception.
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 4 Dec 2006 11:26:35 +0000 (11:26 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 4 Dec 2006 11:26:35 +0000 (11:26 +0000)
EVE/Reve/RMacro.cxx
EVE/Reve/RMacro.h

index 3e99f28919b49e4fe1c5f37b6152476c65f977a8..cf88e71005aa38f6f7a915180f38d208231ee7b2 100644 (file)
@@ -38,6 +38,8 @@ RMacro::RMacro(const char* name) :
 
 /**************************************************************************/
 
+#include <TTimer.h>
+
 void RMacro::Exec(const char* params)
 {
   if(Reve::CheckMacro(fTitle.Data()))
@@ -60,7 +62,8 @@ void RMacro::Exec(const char* params)
     if (p == "") p = fParams;
     if (p != "")
       exec += "(" + p + ")";
-    gROOT->ProcessLine(exec);
+    Int_t exit;
+    gROOT->ProcessLine(exec, &exit);
     //enable gROOT->Reset
     gROOT->SetExecutingMacro(kFALSE);
     //delete the temporary file
@@ -68,4 +71,17 @@ void RMacro::Exec(const char* params)
   }
 
   G__unloadfile(fname);
+
+  // In case an exception was thrown (which i do not know how to detect
+  // the execution of next macros does not succeed.
+  // However strange this might seem, this solves the problem.
+  TTimer::SingleShot(100, "Reve::RMacro", this, "ResetRoot()");
+}
+
+#include <TApplication.h>
+
+void RMacro::ResetRoot()
+{
+  // printf ("RMacro::ResetRoot doing 'gROOT->Reset()'.\n");
+  gROOT->GetApplication()->ProcessLine("gROOT->Reset()");
 }
index c0b01c28166f3a5f2be07915a4bfcadf7855a53d..2eb401343484180c0556ba5d6085ee88e16957fb 100644 (file)
@@ -21,6 +21,8 @@ public:
 
   virtual void Exec(const char* params = "0");
 
+  void ResetRoot();
+
   ClassDef(RMacro, 1);
 }; // endclass RMacro