diff options
author | Gabor Greif <ggreif@gmail.com> | 2014-08-08 18:01:19 +0200 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2014-08-08 18:01:19 +0200 |
commit | 5f003d228340c3ce8e500f9053f353c58dc1dc94 (patch) | |
tree | a855b0f173ff635b48354e1136ef6cbb2a1214a4 /rts/Messages.c | |
parent | ff9c5570395bcacf8963149b3a8475f5644ce694 (diff) | |
parent | dff0623d5ab13222c06b3ff6b32793e05b417970 (diff) | |
download | haskell-wip/generics-propeq.tar.gz |
Merge branch 'master' into wip/generics-propeqwip/generics-propeq
Conflicts:
compiler/typecheck/TcGenGenerics.lhs
Diffstat (limited to 'rts/Messages.c')
-rw-r--r-- | rts/Messages.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/rts/Messages.c b/rts/Messages.c index c5988f8b25..2f03ae60c0 100644 --- a/rts/Messages.c +++ b/rts/Messages.c @@ -25,7 +25,7 @@ void sendMessage(Capability *from_cap, Capability *to_cap, Message *msg) { ACQUIRE_LOCK(&to_cap->lock); -#ifdef DEBUG +#ifdef DEBUG { const StgInfoTable *i = msg->header.info; if (i != &stg_MSG_THROWTO_info && @@ -44,7 +44,7 @@ void sendMessage(Capability *from_cap, Capability *to_cap, Message *msg) recordClosureMutated(from_cap,(StgClosure*)msg); if (to_cap->running_task == NULL) { - to_cap->running_task = myTask(); + to_cap->running_task = myTask(); // precond for releaseCapability_() releaseCapability_(to_cap,rtsFalse); } else { @@ -73,7 +73,7 @@ loop: if (i == &stg_MSG_TRY_WAKEUP_info) { StgTSO *tso = ((MessageWakeup *)m)->tso; - debugTraceCap(DEBUG_sched, cap, "message: try wakeup thread %ld", + debugTraceCap(DEBUG_sched, cap, "message: try wakeup thread %ld", (W_)tso->id); tryWakeupThread(cap, tso); } @@ -89,7 +89,7 @@ loop: goto loop; } - debugTraceCap(DEBUG_sched, cap, "message: throwTo %ld -> %ld", + debugTraceCap(DEBUG_sched, cap, "message: throwTo %ld -> %ld", (W_)t->source->id, (W_)t->target->id); ASSERT(t->source->why_blocked == BlockedOnMsgThrowTo); @@ -144,10 +144,10 @@ loop: This is called from two places: either we just entered a BLACKHOLE (stg_BLACKHOLE_info), or we received a MSG_BLACKHOLE in our - cap->inbox. + cap->inbox. We need to establish whether the BLACKHOLE belongs to - this Capability, and + this Capability, and - if so, arrange to block the current thread on it - otherwise, forward the message to the right place @@ -166,8 +166,8 @@ nat messageBlackHole(Capability *cap, MessageBlackHole *msg) StgClosure *bh = UNTAG_CLOSURE(msg->bh); StgTSO *owner; - debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on blackhole %p", - (W_)msg->tso->id, msg->bh); + debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on " + "blackhole %p", (W_)msg->tso->id, msg->bh); info = bh->header.info; @@ -175,8 +175,8 @@ nat messageBlackHole(Capability *cap, MessageBlackHole *msg) // BLACKHOLE has already been updated, and GC has shorted out the // indirection, so the pointer no longer points to a BLACKHOLE at // all. - if (info != &stg_BLACKHOLE_info && - info != &stg_CAF_BLACKHOLE_info && + 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 @@ -210,7 +210,8 @@ loop: #ifdef THREADED_RTS if (owner->cap != cap) { sendMessage(cap, owner->cap, (Message*)msg); - debugTraceCap(DEBUG_sched, cap, "forwarding message to cap %d", owner->cap->no); + debugTraceCap(DEBUG_sched, cap, "forwarding message to cap %d", + owner->cap->no); return 1; } #endif @@ -219,15 +220,15 @@ loop: // BLACKHOLE, so we first create a BLOCKING_QUEUE object. bq = (StgBlockingQueue*)allocate(cap, sizeofW(StgBlockingQueue)); - + // initialise the BLOCKING_QUEUE object SET_HDR(bq, &stg_BLOCKING_QUEUE_DIRTY_info, CCS_SYSTEM); bq->bh = bh; bq->queue = msg; bq->owner = owner; - + msg->link = (MessageBlackHole*)END_TSO_QUEUE; - + // All BLOCKING_QUEUES are linked in a list on owner->bq, so // that we can search through them in the event that there is // a collision to update a BLACKHOLE and a BLOCKING_QUEUE @@ -254,12 +255,12 @@ loop: ((StgInd*)bh)->indirectee = (StgClosure *)bq; recordClosureMutated(cap,bh); // bh was mutated - debugTraceCap(DEBUG_sched, cap, "thread %d blocked on thread %d", + debugTraceCap(DEBUG_sched, cap, "thread %d blocked on thread %d", (W_)msg->tso->id, (W_)owner->id); return 1; // blocked } - else if (info == &stg_BLOCKING_QUEUE_CLEAN_info || + else if (info == &stg_BLOCKING_QUEUE_CLEAN_info || info == &stg_BLOCKING_QUEUE_DIRTY_info) { StgBlockingQueue *bq = (StgBlockingQueue *)p; @@ -273,7 +274,8 @@ loop: #ifdef THREADED_RTS if (owner->cap != cap) { sendMessage(cap, owner->cap, (Message*)msg); - debugTraceCap(DEBUG_sched, cap, "forwarding message to cap %d", owner->cap->no); + debugTraceCap(DEBUG_sched, cap, "forwarding message to cap %d", + owner->cap->no); return 1; } #endif @@ -287,7 +289,7 @@ loop: recordClosureMutated(cap,(StgClosure*)bq); } - debugTraceCap(DEBUG_sched, cap, "thread %d blocked on thread %d", + debugTraceCap(DEBUG_sched, cap, "thread %d blocked on thread %d", (W_)msg->tso->id, (W_)owner->id); // See above, #3838 @@ -297,7 +299,7 @@ loop: return 1; // blocked } - + return 0; // not blocked } @@ -313,7 +315,7 @@ StgTSO * blackHoleOwner (StgClosure *bh) info = bh->header.info; if (info != &stg_BLACKHOLE_info && - info != &stg_CAF_BLACKHOLE_info && + info != &stg_CAF_BLACKHOLE_info && info != &__stg_EAGER_BLACKHOLE_info && info != &stg_WHITEHOLE_info) { return NULL; @@ -333,14 +335,20 @@ loop: { return (StgTSO*)p; } - else if (info == &stg_BLOCKING_QUEUE_CLEAN_info || + else if (info == &stg_BLOCKING_QUEUE_CLEAN_info || info == &stg_BLOCKING_QUEUE_DIRTY_info) { StgBlockingQueue *bq = (StgBlockingQueue *)p; return bq->owner; } - + return NULL; // not blocked } - +// Local Variables: +// mode: C +// fill-column: 80 +// indent-tabs-mode: nil +// c-basic-offset: 4 +// buffer-file-coding-system: utf-8-unix +// End: |