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