add comments and an ASSERT_LOCK_HELD()
authorSimon Marlow <marlowsd@gmail.com>
Wed, 8 Oct 2008 11:26:27 +0000 (11:26 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 8 Oct 2008 11:26:27 +0000 (11:26 +0000)
rts/RaiseAsync.c

index d411c41..10d91a7 100644 (file)
@@ -575,6 +575,12 @@ performBlockedException (Capability *cap, StgTSO *source, StgTSO *target)
 
    This is for use when we raise an exception in another thread, which
    may be blocked.
+
+   Precondition: we have exclusive access to the TSO, which entails
+   holding a lock on the object that owns the queue, if the TSO is
+   blocked.  e.g. if the thread is blocked on an MVar, we must hold a
+   lock on the MVar before calling removeFromQueues().
+
    This has nothing to do with the UnblockThread event in GranSim. -- HWL
    -------------------------------------------------------------------------- */
 
@@ -752,6 +758,9 @@ removeFromQueues(Capability *cap, StgTSO *tso)
       goto done;
 
   case BlockedOnBlackHole:
+      // we have exclusive access to this TSO, which implies that we
+      // must hold sched_mutex:
+      ASSERT_LOCK_HELD(&sched_mutex);
       removeThreadFromQueue(cap, &blackhole_queue, tso);
       goto done;