Pass an exception from a python event through the event queue
authorNathan Binkert <binkertn@umich.edu>
Sun, 18 Feb 2007 04:27:11 +0000 (20:27 -0800)
committerNathan Binkert <binkertn@umich.edu>
Sun, 18 Feb 2007 04:27:11 +0000 (20:27 -0800)
back into python so we don't just silently ignore those errors

--HG--
extra : convert_revision : e2f5566a4681f1b8ea80af50071119118afa7d8a

src/python/swig/pyevent.cc
src/sim/async.hh
src/sim/main.cc

index 6fb7d3f17a00e5b6ac740e94134fd5a35ca74384..7f23b88746b95d33b037770ea74b3088cb8ce109 100644 (file)
@@ -31,6 +31,7 @@
 #include <Python.h>
 
 #include "python/swig/pyevent.hh"
+#include "sim/async.hh"
 
 PythonEvent::PythonEvent(PyObject *obj, Tick when, Priority priority)
     : Event(&mainEventQueue, priority), object(obj)
@@ -52,9 +53,9 @@ PythonEvent::~PythonEvent()
 void
 PythonEvent::process()
 {
-    PyObject *result;
-
-    result = PyObject_CallMethod(object, "process", "");
+    PyObject *args = PyTuple_New(0);
+    PyObject *result = PyObject_Call(object, args, NULL);
+    Py_DECREF(args);
 
     if (result) {
         // Nothing to do just decrement the reference count
@@ -62,5 +63,7 @@ PythonEvent::process()
     } else {
         // Somethign should be done to signal back to the main interpreter
         // that there's been an exception.
+        async_event = true;
+        async_exception = true;
     }
 }
index 50ae73040e39488a71cf440e5c3cd3a97595afc4..6ee5eb46a1902174fcbb093c6e4cfe9e0be5d973 100644 (file)
@@ -47,6 +47,7 @@ extern volatile bool async_dump;      ///< Async request to dump stats.
 extern volatile bool async_exit;       ///< Async request to exit simulator.
 extern volatile bool async_io;         ///< Async I/O request (SIGIO).
 extern volatile bool async_alarm;      ///< Async alarm event (SIGALRM).
+extern volatile bool async_exception;   ///< Python exception.
 //@}
 
 #endif // __ASYNC_HH__
index 9f9a564506de7e1b9d939e5ce23e0bf8a0f0ab0a..13850f2550baa949d099d5573d9ff46dab6cac9b 100644 (file)
@@ -82,6 +82,7 @@ volatile bool async_dumpreset = false;
 volatile bool async_exit = false;
 volatile bool async_io = false;
 volatile bool async_alarm = false;
+volatile bool async_exception = false;
 
 /// Stats signal handler.
 void
@@ -371,6 +372,11 @@ simulate(Tick num_cycles = MaxTick)
                 async_alarm = false;
                 pollQueue.service();
             }
+
+            if (async_exception) {
+                async_exception = false;
+                return NULL;
+            }
         }
     }