Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r86127:a0e97b020056
Date: 2016-08-10 08:43 +0200
http://bitbucket.org/pypy/pypy/changeset/a0e97b020056/

Log:    fix locking logic

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
@@ -331,11 +331,11 @@
 }
 
 RPY_EXTERN
-void rpy_reverse_db_lock_acquire(void)
+void rpy_reverse_db_lock_acquire(bool_t lock_contention)
 {
     uint64_t pself;
     assert(!RPY_RDB_REPLAY);
-    while (1) {
+    while (lock_contention) {
         if (rpy_revdb.lock == 0) {
             if (pypy_lock_test_and_set(&rpy_revdb.lock, 1) == 0)
                 break;   /* done */
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
@@ -65,10 +65,11 @@
    single-threaded during replaying: the lock is only useful during
    recording. */
 #define _RPY_REVDB_LOCK()                                               \
-    if (!rpy_active_thread ||                                           \
-            pypy_lock_test_and_set(&rpy_revdb.lock, 1) != 0)            \
-        rpy_reverse_db_lock_acquire();
-
+    {                                                                   \
+        bool_t _lock_contention = pypy_lock_test_and_set(&rpy_revdb.lock, 1); \
+        if (_lock_contention || !rpy_active_thread)                     \
+            rpy_reverse_db_lock_acquire(_lock_contention);              \
+    }
 #define _RPY_REVDB_UNLOCK()                                             \
     pypy_lock_release(&rpy_revdb.lock)
 
@@ -221,6 +222,6 @@
 RPY_EXTERN void rpy_reverse_db_call_destructor(void *obj);
 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(void);
+RPY_EXTERN void rpy_reverse_db_lock_acquire(bool_t lock_contention);
 
 /* ------------------------------------------------------------ */
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to