projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Template Haskell: improve lifting for strings
[ghc-hetmet.git]
/
rts
/
Weak.c
diff --git
a/rts/Weak.c
b/rts/Weak.c
index
a50a72e
..
17150f6
100644
(file)
--- a/
rts/Weak.c
+++ b/
rts/Weak.c
@@
-22,6
+22,9
@@
StgWeak *weak_ptr_list;
StgWeak *weak_ptr_list;
+// So that we can detect when a finalizer illegally calls back into Haskell
+rtsBool running_finalizers = rtsFalse;
+
void
runCFinalizer(StgVoid *fn, StgVoid *ptr, StgVoid *env, StgWord flag)
{
void
runCFinalizer(StgVoid *fn, StgVoid *ptr, StgVoid *env, StgWord flag)
{
@@
-36,6
+39,8
@@
runAllCFinalizers(StgWeak *list)
{
StgWeak *w;
{
StgWeak *w;
+ running_finalizers = rtsTrue;
+
for (w = list; w; w = w->link) {
StgArrWords *farr;
for (w = list; w; w = w->link) {
StgArrWords *farr;
@@
-47,6
+52,8
@@
runAllCFinalizers(StgWeak *list)
(StgVoid *)farr->payload[2],
farr->payload[3]);
}
(StgVoid *)farr->payload[2],
farr->payload[3]);
}
+
+ running_finalizers = rtsFalse;
}
/*
}
/*
@@
-72,6
+79,8
@@
scheduleFinalizers(Capability *cap, StgWeak *list)
StgMutArrPtrs *arr;
nat n;
StgMutArrPtrs *arr;
nat n;
+ running_finalizers = rtsTrue;
+
// count number of finalizers, and kill all the weak pointers first...
n = 0;
for (w = list; w; w = w->link) {
// count number of finalizers, and kill all the weak pointers first...
n = 0;
for (w = list; w; w = w->link) {
@@
-105,6
+114,8
@@
scheduleFinalizers(Capability *cap, StgWeak *list)
SET_HDR(w, &stg_DEAD_WEAK_info, w->header.prof.ccs);
}
SET_HDR(w, &stg_DEAD_WEAK_info, w->header.prof.ccs);
}
+ running_finalizers = rtsFalse;
+
// No finalizers to run?
if (n == 0) return;
// No finalizers to run?
if (n == 0) return;