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