diff options
author | Ben Gamari <ben@smart-cactus.org> | 2021-07-21 14:42:32 -0700 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-07-27 04:49:00 -0400 |
commit | 0090517a8fccc0d6605e4b6d3d95568d91201d72 (patch) | |
tree | 61eeed903f8f06baeb6bcee941b0aa364c2311b7 /rts | |
parent | b19f1a6a541645b735e01aa2658f5493fb1cc97d (diff) | |
download | haskell-0090517a8fccc0d6605e4b6d3d95568d91201d72.tar.gz |
rts/OSThreads: Improve error handling consistency
Previously we relied on the caller to check the return value from
broadcastCondition and friends, most of whom neglected to do so. Given
that these functions should not fail anyways, I've opted to drop the
return value entirely and rather move the result check into the
OSThreads functions.
This slightly changes the semantics of timedWaitCondition which now
returns false only in the case of timeout, rather than any error as
previously done.
Diffstat (limited to 'rts')
-rw-r--r-- | rts/posix/OSThreads.c | 28 | ||||
-rw-r--r-- | rts/win32/OSThreads.c | 21 |
2 files changed, 29 insertions, 20 deletions
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c index 8ac23d4168..04375006d2 100644 --- a/rts/posix/OSThreads.c +++ b/rts/posix/OSThreads.c @@ -104,33 +104,31 @@ void initCondition( Condition* pCond ) { - pthread_cond_init(pCond, NULL); - return; + CHECK(pthread_cond_init(pCond, NULL) == 0); } void closeCondition( Condition* pCond ) { - pthread_cond_destroy(pCond); - return; + CHECK(pthread_cond_destroy(pCond) == 0); } -bool +void broadcastCondition ( Condition* pCond ) { - return (pthread_cond_broadcast(pCond) == 0); + CHECK(pthread_cond_broadcast(pCond) == 0); } -bool +void signalCondition ( Condition* pCond ) { - return (pthread_cond_signal(pCond) == 0); + CHECK(pthread_cond_signal(pCond) == 0); } -bool +void waitCondition ( Condition* pCond, Mutex* pMut ) { - return (pthread_cond_wait(pCond,pMut) == 0); + CHECK(pthread_cond_wait(pCond,pMut) == 0); } bool @@ -143,7 +141,15 @@ timedWaitCondition ( Condition* pCond, Mutex* pMut, Time timeout) { .tv_nsec = TimeToNS(timeout - SecondsToTime(secs)) }; - return pthread_cond_timedwait(pCond,pMut, &t) == 0; + int ret = pthread_cond_timedwait(pCond,pMut, &t); + switch (ret) { + case ETIMEDOUT: + return false; + case 0: + return true; + default: + barf("pthread_cond_timedwait failed"); + } } void diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 46e363b3ab..2c1e462cb4 100644 --- a/rts/win32/OSThreads.c +++ b/rts/win32/OSThreads.c @@ -543,25 +543,22 @@ closeCondition( Condition* pCond STG_UNUSED) return; } -bool +void broadcastCondition ( Condition* pCond ) { WakeAllConditionVariable(pCond); - return true; } -bool +void signalCondition ( Condition* pCond ) { WakeConditionVariable(pCond); - return true; } -bool +void waitCondition ( Condition* pCond, Mutex* pMut ) { - SleepConditionVariableSRW(pCond, pMut, INFINITE, 0); - return true; + CHECK(SleepConditionVariableSRW(pCond, pMut, INFINITE, 0)); } bool @@ -570,8 +567,14 @@ timedWaitCondition ( Condition* pCond, Mutex* pMut, Time timeout ) // If we pass a timeout of 0 SleepConditionVariableSRW will return immediately // https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleepconditionvariablesrw DWORD ms = (DWORD)stg_min(1, TimeToMS(timeout)); - SleepConditionVariableSRW(pCond, pMut, ms, 0); - return true; + BOOL res = SleepConditionVariableSRW(pCond, pMut, ms, 0); + if (res) { + return true; // success + } else if (GetLastError() == ERROR_TIMEOUT) { + return false; // timeout + } else { + barf("timedWaitCondition: error %" FMT_Word, (StgWord) GetLastError()); + } } void |