projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add OSTYPE build-system variable, and use it
[ghc-hetmet.git]
/
rts
/
Messages.c
diff --git
a/rts/Messages.c
b/rts/Messages.c
index
5a1e5bd
..
1730278
100644
(file)
--- a/
rts/Messages.c
+++ b/
rts/Messages.c
@@
-98,11
+98,13
@@
loop:
r = throwToMsg(cap, t);
switch (r) {
r = throwToMsg(cap, t);
switch (r) {
- case THROWTO_SUCCESS:
+ case THROWTO_SUCCESS: {
// this message is done
// this message is done
- unlockClosure((StgClosure*)m, &stg_MSG_NULL_info);
- tryWakeupThread(cap, t->source);
+ StgTSO *source = t->source;
+ doneWithMsgThrowTo(t);
+ tryWakeupThread(cap, source);
break;
break;
+ }
case THROWTO_BLOCKED:
// unlock the message
unlockClosure((StgClosure*)m, &stg_MSG_THROWTO_info);
case THROWTO_BLOCKED:
// unlock the message
unlockClosure((StgClosure*)m, &stg_MSG_THROWTO_info);
@@
-161,7
+163,7
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
const StgInfoTable *info;
StgClosure *p;
StgBlockingQueue *bq;
const StgInfoTable *info;
StgClosure *p;
StgBlockingQueue *bq;
- StgClosure *bh = msg->bh;
+ StgClosure *bh = UNTAG_CLOSURE(msg->bh);
StgTSO *owner;
debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on blackhole %p",
StgTSO *owner;
debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on blackhole %p",
@@
-175,6
+177,7
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
// all.
if (info != &stg_BLACKHOLE_info &&
info != &stg_CAF_BLACKHOLE_info &&
// all.
if (info != &stg_BLACKHOLE_info &&
info != &stg_CAF_BLACKHOLE_info &&
+ info != &__stg_EAGER_BLACKHOLE_info &&
info != &stg_WHITEHOLE_info) {
// if it is a WHITEHOLE, then a thread is in the process of
// trying to BLACKHOLE it. But we know that it was once a
info != &stg_WHITEHOLE_info) {
// if it is a WHITEHOLE, then a thread is in the process of
// trying to BLACKHOLE it. But we know that it was once a
@@
-183,9
+186,12
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
return 0;
}
return 0;
}
- // we know at this point that the closure
+ // The blackhole must indirect to a TSO, a BLOCKING_QUEUE, an IND,
+ // or a value.
loop:
loop:
- p = ((StgInd*)bh)->indirectee;
+ // NB. VOLATILE_LOAD(), because otherwise gcc hoists the load
+ // and turns this into an infinite loop.
+ p = UNTAG_CLOSURE((StgClosure*)VOLATILE_LOAD(&((StgInd*)bh)->indirectee));
info = p->header.info;
if (info == &stg_IND_info)
info = p->header.info;
if (info == &stg_IND_info)
@@
-199,7
+205,7
@@
loop:
else if (info == &stg_TSO_info)
{
else if (info == &stg_TSO_info)
{
- owner = deRefTSO((StgTSO *)p);
+ owner = (StgTSO*)p;
#ifdef THREADED_RTS
if (owner->cap != cap) {
#ifdef THREADED_RTS
if (owner->cap != cap) {
@@
-261,7
+267,7
@@
loop:
ASSERT(bq->bh == bh);
ASSERT(bq->bh == bh);
- owner = deRefTSO(bq->owner);
+ owner = bq->owner;
ASSERT(owner != END_TSO_QUEUE);
ASSERT(owner != END_TSO_QUEUE);