#include "Task.h"
#include "Sparks.h"
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
struct Capability_ {
// State required by the STG virtual machine when running Haskell
// catching unsafe call-ins.
rtsBool in_haskell;
- // true if this Capability is currently in the GC
- rtsBool in_gc;
-
// The run queue. The Task owning this Capability has exclusive
// access to its run queue, so can wake up threads without
// taking a lock, and the common path through the scheduler is
// the suspended TSOs easily. Hence, when migrating a Task from
// the returning_tasks list, we must also migrate its entry from
// this list.
- Task *suspended_ccalling_tasks;
+ InCall *suspended_ccalls;
// One mutable list per generation, so we don't need to take any
// locks when updating an old-generation thunk. This also lets us
bdescr **mut_lists;
bdescr **saved_mut_lists; // tmp use during GC
+ // block for allocating pinned objects into
+ bdescr *pinned_object_block;
+
// Context switch flag. We used to have one global flag, now one
// per capability. Locks required : none (conflicts are harmless)
int context_switch;
Task *returning_tasks_hd; // Singly-linked, with head/tail
Task *returning_tasks_tl;
- // A list of threads to append to this Capability's run queue at
- // the earliest opportunity. These are threads that have been
- // woken up by another Capability.
- StgTSO *wakeup_queue_hd;
- StgTSO *wakeup_queue_tl;
+ // Messages, or END_TSO_QUEUE.
+ Message *inbox;
SparkPool *sparks;
void traverseSparkQueues (evac_fn evac, void *user);
/* -----------------------------------------------------------------------------
+ Messages
+ -------------------------------------------------------------------------- */
+
+#ifdef THREADED_RTS
+
+INLINE_HEADER rtsBool emptyInbox(Capability *cap);;
+
+void sendMessage (Capability *cap, Message *msg);
+
+#endif // THREADED_RTS
+
+/* -----------------------------------------------------------------------------
* INLINE functions... private below here
* -------------------------------------------------------------------------- */
bdescr *bd;
// We must own this Capability in order to modify its mutable list.
- ASSERT(cap->running_task == myTask());
+ // ASSERT(cap->running_task == myTask());
+ // NO: assertion is violated by performPendingThrowTos()
bd = cap->mut_lists[gen];
if (bd->free >= bd->start + BLOCK_SIZE_W) {
bdescr *new_bd;
cap->context_switch = 1;
}
-#pragma GCC visibility pop
+#ifdef THREADED_RTS
+
+INLINE_HEADER rtsBool emptyInbox(Capability *cap)
+{
+ return (cap->inbox == (Message*)END_TSO_QUEUE);
+}
+
+#endif
+
+END_RTS_PRIVATE
#endif /* CAPABILITY_H */