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
-------------------------------------------------------------------------- */
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;