projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix pointer tagging bug in removeIndirections (fixes stableptr003)
[ghc-hetmet.git]
/
rts
/
Stable.c
diff --git
a/rts/Stable.c
b/rts/Stable.c
index
2c4157b
..
a6b8ddf
100644
(file)
--- a/
rts/Stable.c
+++ b/
rts/Stable.c
@@
-19,6
+19,7
@@
#include "RtsFlags.h"
#include "OSThreads.h"
#include "Trace.h"
#include "RtsFlags.h"
#include "OSThreads.h"
#include "Trace.h"
+#include "Stable.h"
/* Comment from ADR's implementation in old RTS:
/* Comment from ADR's implementation in old RTS:
@@
-169,10
+170,16
@@
exitStablePtrTable(void)
stgFree(stable_ptr_table);
stable_ptr_table = NULL;
SPT_size = 0;
stgFree(stable_ptr_table);
stable_ptr_table = NULL;
SPT_size = 0;
+#ifdef THREADED_RTS
+ closeMutex(&stable_mutex);
+#endif
}
/*
* get at the real stuff...remove indirections.
}
/*
* get at the real stuff...remove indirections.
+ * It untags pointers before dereferencing and
+ * retags the real stuff with its tag (if there
+ * is any) when returning.
*
* ToDo: move to a better home.
*/
*
* ToDo: move to a better home.
*/
@@
-180,7
+187,8
@@
static
StgClosure*
removeIndirections(StgClosure* p)
{
StgClosure*
removeIndirections(StgClosure* p)
{
- StgClosure* q = p;
+ StgWord tag = GET_CLOSURE_TAG(p);
+ StgClosure* q = UNTAG_CLOSURE(p);
while (get_itbl(q)->type == IND ||
get_itbl(q)->type == IND_STATIC ||
while (get_itbl(q)->type == IND ||
get_itbl(q)->type == IND_STATIC ||
@@
-188,8
+196,11
@@
removeIndirections(StgClosure* p)
get_itbl(q)->type == IND_PERM ||
get_itbl(q)->type == IND_OLDGEN_PERM ) {
q = ((StgInd *)q)->indirectee;
get_itbl(q)->type == IND_PERM ||
get_itbl(q)->type == IND_OLDGEN_PERM ) {
q = ((StgInd *)q)->indirectee;
+ tag = GET_CLOSURE_TAG(q);
+ q = UNTAG_CLOSURE(q);
}
}
- return q;
+
+ return TAG_CLOSURE(tag,q);
}
static StgWord
}
static StgWord