summaryrefslogtreecommitdiff
path: root/rts/Schedule.h
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-03-11 09:57:44 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-03-11 09:57:44 +0000
commit7408b39235bccdcde48df2a73337ff976fbc09b7 (patch)
treecf20c372fdc5787170d53df36fc24ecf8113c89e /rts/Schedule.h
parent12cfec943127f0c81e1ffa1ca5ce46e888e3027c (diff)
downloadhaskell-7408b39235bccdcde48df2a73337ff976fbc09b7.tar.gz
Use message-passing to implement throwTo in the RTS
This replaces some complicated locking schemes with message-passing in the implementation of throwTo. The benefits are - previously it was impossible to guarantee that a throwTo from a thread running on one CPU to a thread running on another CPU would be noticed, and we had to rely on the GC to pick up these forgotten exceptions. This no longer happens. - the locking regime is simpler (though the code is about the same size) - threads can be unblocked from a blocked_exceptions queue without having to traverse the whole queue now. It's a rare case, but replaces an O(n) operation with an O(1). - generally we move in the direction of sharing less between Capabilities (aka HECs), which will become important with other changes we have planned. Also in this patch I replaced several STM-specific closure types with a generic MUT_PRIM closure type, which allowed a lot of code in the GC and other places to go away, hence the line-count reduction. The message-passing changes resulted in about a net zero line-count difference.
Diffstat (limited to 'rts/Schedule.h')
-rw-r--r--rts/Schedule.h28
1 files changed, 0 insertions, 28 deletions
diff --git a/rts/Schedule.h b/rts/Schedule.h
index af322d804f..76138b68f3 100644
--- a/rts/Schedule.h
+++ b/rts/Schedule.h
@@ -105,7 +105,6 @@ extern Mutex sched_mutex;
void interruptStgRts (void);
void resurrectThreads (StgTSO *);
-void performPendingThrowTos (StgTSO *);
/* -----------------------------------------------------------------------------
* Some convenient macros/inline functions...
@@ -179,25 +178,6 @@ appendToBlockedQueue(StgTSO *tso)
}
#endif
-#if defined(THREADED_RTS)
-// Assumes: my_cap is owned by the current Task. We hold
-// other_cap->lock, but we do not necessarily own other_cap; another
-// Task may be running on it.
-INLINE_HEADER void
-appendToWakeupQueue (Capability *my_cap, Capability *other_cap, StgTSO *tso)
-{
- ASSERT(tso->_link == END_TSO_QUEUE);
- if (other_cap->wakeup_queue_hd == END_TSO_QUEUE) {
- other_cap->wakeup_queue_hd = tso;
- } else {
- // my_cap is passed to setTSOLink() because it may need to
- // write to the mutable list.
- setTSOLink(my_cap, other_cap->wakeup_queue_tl, tso);
- }
- other_cap->wakeup_queue_tl = tso;
-}
-#endif
-
/* Check whether various thread queues are empty
*/
INLINE_HEADER rtsBool
@@ -212,14 +192,6 @@ emptyRunQueue(Capability *cap)
return emptyQueue(cap->run_queue_hd);
}
-#if defined(THREADED_RTS)
-INLINE_HEADER rtsBool
-emptyWakeupQueue(Capability *cap)
-{
- return emptyQueue(cap->wakeup_queue_hd);
-}
-#endif
-
#if !defined(THREADED_RTS)
#define EMPTY_BLOCKED_QUEUE() (emptyQueue(blocked_queue_hd))
#define EMPTY_SLEEPING_QUEUE() (emptyQueue(sleeping_queue))