[pypy-commit] pypy reverse-debugger: emit the byte "release gil" before actually releasing the GIL

arigo pypy.commits at gmail.com
Sat Sep 10 13:12:29 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: reverse-debugger
Changeset: r86985:a82acaa0d692
Date: 2016-09-10 19:03 +0200
http://bitbucket.org/pypy/pypy/changeset/a82acaa0d692/

Log:	emit the byte "release gil" before actually releasing the GIL

diff --git a/rpython/translator/revdb/gencsupp.py b/rpython/translator/revdb/gencsupp.py
--- a/rpython/translator/revdb/gencsupp.py
+++ b/rpython/translator/revdb/gencsupp.py
@@ -92,10 +92,9 @@
         # reading the 0xFD or 0xFE, we switch to a different thread if needed
         # (actually implemented with stacklets).
         if call_code == 'RPyGilAcquire();':
-            byte = '0xFD'
+            return 'RPY_REVDB_CALL_GIL_ACQUIRE();'
         else:
-            byte = '0xFE'
-        return 'RPY_REVDB_CALL_GIL(%s, %s);' % (call_code, byte)
+            return 'RPY_REVDB_CALL_GIL_RELEASE();'
     #
     tp = funcgen.lltypename(v_result)
     if tp == 'void @':
diff --git a/rpython/translator/revdb/src-revdb/revdb.c b/rpython/translator/revdb/src-revdb/revdb.c
--- a/rpython/translator/revdb/src-revdb/revdb.c
+++ b/rpython/translator/revdb/src-revdb/revdb.c
@@ -1730,10 +1730,10 @@
 }
 
 RPY_EXTERN
-void rpy_reverse_db_bad_acquire_gil(void)
+void rpy_reverse_db_bad_acquire_gil(const char *name)
 {
     fprintf(stderr, "out of sync: unexpected byte in log "
-                    " (at acquire_gil or release_gil)\n");
+                    " (at %s_gil)\n", name);
     exit(1);
 }
 
diff --git a/rpython/translator/revdb/src-revdb/revdb_include.h b/rpython/translator/revdb/src-revdb/revdb_include.h
--- a/rpython/translator/revdb/src-revdb/revdb_include.h
+++ b/rpython/translator/revdb/src-revdb/revdb_include.h
@@ -151,23 +151,32 @@
             rpy_reverse_db_invoke_callback(_re);                        \
     }
 
-#define RPY_REVDB_CALL_GIL(call_code, byte)                             \
+#define RPY_REVDB_CALL_GIL_ACQUIRE()                                    \
     if (!RPY_RDB_REPLAY) {                                              \
-        call_code                                                       \
+        RPyGilAcquire();                                                \
         _RPY_REVDB_LOCK();                                              \
-        _RPY_REVDB_EMIT_RECORD_L(unsigned char _e, byte)                \
+        _RPY_REVDB_EMIT_RECORD_L(unsigned char _e, 0xFD)                \
         _RPY_REVDB_UNLOCK();                                            \
     }                                                                   \
     else {                                                              \
         unsigned char _re;                                              \
         _RPY_REVDB_EMIT_REPLAY(unsigned char _e, _re)                   \
-        if (_re != byte)                                                \
-            rpy_reverse_db_bad_acquire_gil();                           \
+        if (_re != 0xFD)                                                \
+            rpy_reverse_db_bad_acquire_gil("acquire");                  \
     }
 
-#define RPY_REVDB_CALL_GILCTRL(call_code)                               \
+#define RPY_REVDB_CALL_GIL_RELEASE()                                    \
     if (!RPY_RDB_REPLAY) {                                              \
-        call_code                                                       \
+        _RPY_REVDB_LOCK();                                              \
+        _RPY_REVDB_EMIT_RECORD_L(unsigned char _e, 0xFE)                \
+        _RPY_REVDB_UNLOCK();                                            \
+        RPyGilRelease();                                                \
+    }                                                                   \
+    else {                                                              \
+        unsigned char _re;                                              \
+        _RPY_REVDB_EMIT_REPLAY(unsigned char _e, _re)                   \
+        if (_re != 0xFE)                                                \
+            rpy_reverse_db_bad_acquire_gil("release");                  \
     }
 
 #define RPY_REVDB_CALLBACKLOC(locnum)                                   \
@@ -284,7 +293,7 @@
 RPY_EXTERN void rpy_reverse_db_invoke_callback(unsigned char);
 RPY_EXTERN void rpy_reverse_db_callback_loc(int);
 RPY_EXTERN void rpy_reverse_db_lock_acquire(bool_t lock_contention);
-RPY_EXTERN void rpy_reverse_db_bad_acquire_gil(void);
+RPY_EXTERN void rpy_reverse_db_bad_acquire_gil(const char *name);
 RPY_EXTERN void rpy_reverse_db_set_thread_breakpoint(int64_t tnum);
 RPY_EXTERN double rpy_reverse_db_strtod(RPyString *s);
 RPY_EXTERN RPyString *rpy_reverse_db_dtoa(double d);


More information about the pypy-commit mailing list