[glib/wip/desrt/gcond-errno-fixup: 1/2] gthread: fix minor errno problem in GCond
- From: Allison Karlitskaya <desrt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/desrt/gcond-errno-fixup: 1/2] gthread: fix minor errno problem in GCond
- Date: Fri, 28 Jun 2019 09:11:17 +0000 (UTC)
commit 9957b8b83df91e0ecafbc6228afca52eb426cb35
Author: Allison Karlitskaya <allison karlitskaya redhat com>
Date: Fri Jun 28 10:15:33 2019 +0200
gthread: fix minor errno problem in GCond
The return value from `g_cond_wait_until()` is calculated, based on the
value of `errno` after reacquiring the mutex. This is a problem because
`errno` can be overwritten in the case the mutex is contended (in which
case the slow-path code will re-enter the kernel).
Perform the calculation before reacquiring the mutex.
See merge request GNOME/glib!958
glib/gthread-posix.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
---
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
index 8b8561639..c76f4433f 100644
--- a/glib/gthread-posix.c
+++ b/glib/gthread-posix.c
@@ -1441,6 +1441,7 @@ g_cond_wait_until (GCond *cond,
struct timespec span;
guint sampled;
int res;
+ gboolean success;
if (end_time < 0)
return FALSE;
@@ -1460,9 +1461,10 @@ g_cond_wait_until (GCond *cond,
sampled = cond->i[0];
g_mutex_unlock (mutex);
res = syscall (__NR_futex, &cond->i[0], (gsize) FUTEX_WAIT_PRIVATE, (gsize) sampled, &span);
+ success = (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE;
g_mutex_lock (mutex);
- return (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE;
+ return success;
}
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]