Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85400:ec1166e69eea
Date: 2016-06-27 16:53 +0200
http://bitbucket.org/pypy/pypy/changeset/ec1166e69eea/

Log:    Reloading finalizers

diff --git a/rpython/translator/c/src/mem.c b/rpython/translator/c/src/mem.c
--- a/rpython/translator/c/src/mem.c
+++ b/rpython/translator/c/src/mem.c
@@ -106,7 +106,7 @@
 }
 #else
 /* see revdb.c */
-RPY_EXTERN void rpy_reverse_db_next_dead(void *);
+RPY_EXTERN void *rpy_reverse_db_next_dead(void *);
 RPY_EXTERN int rpy_reverse_db_fq_register(void *);
 #endif
 
@@ -154,7 +154,7 @@
     else
         result = NULL;
 #ifdef RPY_REVERSE_DEBUGGER
-    rpy_reverse_db_next_dead(result);
+    result = rpy_reverse_db_next_dead(result);
 #endif
     return result;
 }
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
@@ -204,6 +204,13 @@
     rpy_revdb.stop_point_break = rpy_revdb.stop_point_seen + 1;
 }
 
+static void fq_trigger(void)
+{
+    int i = 0;
+    while (boehm_fq_trigger[i])
+        boehm_fq_trigger[i++]();
+}
+
 static void record_stop_point(void)
 {
     /* Invoke the finalizers now.  This will call boehm_fq_callback(),
@@ -216,9 +223,7 @@
     rpy_reverse_db_flush();
 
     GC_invoke_finalizers();
-    i = 0;
-    while (boehm_fq_trigger[i])
-        boehm_fq_trigger[i++]();
+    fq_trigger();
 
     /* This should all be done without emitting anything to the rdb
        log.  We check that, and emit just a ASYNC_FINALIZER_TRIGGER.
@@ -235,13 +240,6 @@
 }
 
 RPY_EXTERN
-void rpy_reverse_db_next_dead(void *result)
-{
-    int64_t uid = result ? ((struct pypy_header0 *)result)->h_uid : -1;
-    RPY_REVDB_EMIT(/* nothing */, int64_t _e, uid);
-}
-
-RPY_EXTERN
 Signed rpy_reverse_db_identityhash(struct pypy_header0 *obj)
 {
     /* Boehm only */
@@ -950,7 +948,9 @@
 static void replay_stop_point(void)
 {
     if (finalizer_trigger_saved_break != 0) {
-        abort();
+        rpy_revdb.stop_point_break = finalizer_trigger_saved_break;
+        finalizer_trigger_saved_break = 0;
+        fq_trigger();
     }
 
     while (rpy_revdb.stop_point_break == rpy_revdb.stop_point_seen) {
@@ -1098,13 +1098,46 @@
         return 0;     /* recording */
     }
     else {
-        void *added = tsearch(obj, &finalizer_tree, _ftree_compare);
-        if (added != obj) {
-            fprintf(stderr, "tsearch: duplicate object\n");
+        /* add the object into the finalizer_tree, keyed by the h_uid */
+        void **item = tsearch(obj, &finalizer_tree, _ftree_compare);
+        if (item == NULL) {
+            fprintf(stderr, "fq_register: out of memory\n");
+            exit(1);
+        }
+        if (*item != obj) {
+            fprintf(stderr, "fq_register: duplicate object\n");
             exit(1);
         }
         return 1;     /* replaying */
     }
 }
 
+RPY_EXTERN
+void *rpy_reverse_db_next_dead(void *result)
+{
+    int64_t uid;
+    RPY_REVDB_EMIT(uid = result ? ((struct pypy_header0 *)result)->h_uid : -1;,
+                   int64_t _e, uid);
+    if (RPY_RDB_REPLAY) {
+        if (uid == -1) {
+            result = NULL;
+        }
+        else {
+            /* fetch and remove the object from the finalizer_tree */
+            void **item;
+            struct pypy_header0 dummy;
+            dummy.h_uid = uid;
+            item = tfind(&dummy, &finalizer_tree, _ftree_compare);
+            if (item == NULL) {
+                fprintf(stderr, "next_dead: object not found\n");
+                exit(1);
+            }
+            result = *item;
+            assert(((struct pypy_header0 *)result)->h_uid == uid);
+            tdelete(result, &finalizer_tree, _ftree_compare);
+        }
+    }
+    return result;
+}
+
 /* ------------------------------------------------------------ */
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
@@ -128,6 +128,6 @@
 RPY_EXTERN void *rpy_reverse_db_weakref_deref(void *weakref);
 //RPY_EXTERN void rpy_reverse_db_call_destructor(void *obj);
 RPY_EXTERN int rpy_reverse_db_fq_register(void *obj);
-RPY_EXTERN void rpy_reverse_db_next_dead(void *result);
+RPY_EXTERN void *rpy_reverse_db_next_dead(void *result);
 
 /* ------------------------------------------------------------ */
diff --git a/rpython/translator/revdb/test/test_weak.py 
b/rpython/translator/revdb/test/test_weak.py
--- a/rpython/translator/revdb/test/test_weak.py
+++ b/rpython/translator/revdb/test/test_weak.py
@@ -1,4 +1,4 @@
-import weakref
+import py, weakref
 from rpython.rlib import revdb, rgc
 from rpython.rlib.debug import debug_print
 from rpython.rlib.objectmodel import keepalive_until_here
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to