summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-07-21 14:42:32 -0700
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-07-27 04:49:00 -0400
commit0090517a8fccc0d6605e4b6d3d95568d91201d72 (patch)
tree61eeed903f8f06baeb6bcee941b0aa364c2311b7
parentb19f1a6a541645b735e01aa2658f5493fb1cc97d (diff)
downloadhaskell-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.
-rw-r--r--includes/rts/OSThreads.h7
-rw-r--r--rts/posix/OSThreads.c28
-rw-r--r--rts/win32/OSThreads.c21
3 files changed, 33 insertions, 23 deletions
diff --git a/includes/rts/OSThreads.h b/includes/rts/OSThreads.h
index b711036b17..08d90de06e 100644
--- a/includes/rts/OSThreads.h
+++ b/includes/rts/OSThreads.h
@@ -173,9 +173,10 @@ extern void joinOSThread ( OSThreadId id );
//
extern void initCondition ( Condition* pCond );
extern void closeCondition ( Condition* pCond );
-extern bool broadcastCondition ( Condition* pCond );
-extern bool signalCondition ( Condition* pCond );
-extern bool waitCondition ( Condition* pCond, Mutex* pMut );
+extern void broadcastCondition ( Condition* pCond );
+extern void signalCondition ( Condition* pCond );
+extern void waitCondition ( Condition* pCond, Mutex* pMut );
+// Returns false on timeout, true otherwise.
extern bool timedWaitCondition ( Condition* pCond, Mutex* pMut, Time timeout);
//
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