diff options
author | Edward Z. Yang <ezyang@mit.edu> | 2013-07-08 11:03:35 -0700 |
---|---|---|
committer | Edward Z. Yang <ezyang@mit.edu> | 2013-07-09 11:29:11 -0700 |
commit | 70e20631742e516c6a11c3c112fbd5b4a08c15ac (patch) | |
tree | d0097f8b1c8e5c0a67b26bb950c036ea7684c65d /includes | |
parent | ca9a431401755f119d97dec59a1fc963a8e9f681 (diff) | |
download | haskell-70e20631742e516c6a11c3c112fbd5b4a08c15ac.tar.gz |
Implement atomicReadMVar, fixing #4001.
We add the invariant to the MVar blocked threads queue that
threads blocked on an atomic read are always at the front of
the queue. This invariant is easy to maintain, since takers
are only ever added to the end of the queue.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Diffstat (limited to 'includes')
-rw-r--r-- | includes/rts/Constants.h | 25 | ||||
-rw-r--r-- | includes/stg/MiscClosures.h | 3 |
2 files changed, 16 insertions, 12 deletions
diff --git a/includes/rts/Constants.h b/includes/rts/Constants.h index 5ff4d4e51e..4739e3ad1a 100644 --- a/includes/rts/Constants.h +++ b/includes/rts/Constants.h @@ -202,31 +202,32 @@ */ #define NotBlocked 0 #define BlockedOnMVar 1 -#define BlockedOnBlackHole 2 -#define BlockedOnRead 3 -#define BlockedOnWrite 4 -#define BlockedOnDelay 5 -#define BlockedOnSTM 6 +#define BlockedOnMVarRead 2 +#define BlockedOnBlackHole 3 +#define BlockedOnRead 4 +#define BlockedOnWrite 5 +#define BlockedOnDelay 6 +#define BlockedOnSTM 7 /* Win32 only: */ -#define BlockedOnDoProc 7 +#define BlockedOnDoProc 8 /* Only relevant for PAR: */ /* blocked on a remote closure represented by a Global Address: */ -#define BlockedOnGA 8 +#define BlockedOnGA 9 /* same as above but without sending a Fetch message */ -#define BlockedOnGA_NoSend 9 +#define BlockedOnGA_NoSend 10 /* Only relevant for THREADED_RTS: */ -#define BlockedOnCCall 10 -#define BlockedOnCCall_Interruptible 11 +#define BlockedOnCCall 11 +#define BlockedOnCCall_Interruptible 12 /* same as above but permit killing the worker thread */ /* Involved in a message sent to tso->msg_cap */ -#define BlockedOnMsgThrowTo 12 +#define BlockedOnMsgThrowTo 13 /* The thread is not on any run queues, but can be woken up by tryWakeupThread() */ -#define ThreadMigrating 13 +#define ThreadMigrating 14 /* * These constants are returned to the scheduler by a thread that has diff --git a/includes/stg/MiscClosures.h b/includes/stg/MiscClosures.h index 8717687f3e..88cee597b5 100644 --- a/includes/stg/MiscClosures.h +++ b/includes/stg/MiscClosures.h @@ -293,7 +293,9 @@ RTS_FUN_DECL(stg_block_noregs); RTS_FUN_DECL(stg_block_blackhole); RTS_FUN_DECL(stg_block_blackhole_finally); RTS_FUN_DECL(stg_block_takemvar); +RTS_FUN_DECL(stg_block_atomicreadmvar); RTS_RET(stg_block_takemvar); +RTS_RET(stg_block_atomicreadmvar); RTS_FUN_DECL(stg_block_putmvar); RTS_RET(stg_block_putmvar); #ifdef mingw32_HOST_OS @@ -376,6 +378,7 @@ RTS_FUN_DECL(stg_isEmptyMVarzh); RTS_FUN_DECL(stg_newMVarzh); RTS_FUN_DECL(stg_takeMVarzh); RTS_FUN_DECL(stg_putMVarzh); +RTS_FUN_DECL(stg_atomicReadMVarzh); RTS_FUN_DECL(stg_tryTakeMVarzh); RTS_FUN_DECL(stg_tryPutMVarzh); |