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.
 
    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
    -------------------------------------------------------------------------- */
 
    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:
       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;
 
       removeThreadFromQueue(cap, &blackhole_queue, tso);
       goto done;