StgHeader header;
} StgRetry;
-typedef struct _StgForeignObj {
- StgHeader header;
- StgAddr data; /* pointer to data in non-haskell-land */
-} StgForeignObj;
-
typedef struct _StgStableName {
StgHeader header;
StgWord sn;
* - In StgTRecHeader, it might be worthwhile having separate chunks
* of read-only and read-write locations. This would save a
* new_value field in the read-only locations.
+ *
+ * - In StgAtomicallyFrame, we could combine the waiting bit into
+ * the header (maybe a different info tbl for a waiting transaction).
+ * This means we can specialise the code for the atomically frame
+ * (it immediately switches on frame->waiting anyway).
*/
typedef struct StgTVarWaitQueue_ {
StgClosure *volatile current_value;
StgTVarWaitQueue *volatile first_wait_queue_entry;
#if defined(SMP)
- struct StgTRecHeader_ *volatile last_update_by;
+ StgInt volatile num_updates;
#endif
} StgTVar;
StgClosure *expected_value;
StgClosure *new_value;
#if defined(SMP)
- struct StgTRecHeader_ *saw_update_by;
+ StgInt num_updates;
#endif
} TRecEntry;
-#define TREC_CHUNK_NUM_ENTRIES 256
+#define TREC_CHUNK_NUM_ENTRIES 16
typedef struct StgTRecChunk_ {
StgHeader header;
typedef struct {
StgHeader header;
- StgBool waiting;
StgClosure *code;
} StgAtomicallyFrame;