diff options
author | Allison Karlitskaya <allison.karlitskaya@redhat.com> | 2019-06-28 10:15:33 +0200 |
---|---|---|
committer | Allison Karlitskaya <allison.karlitskaya@redhat.com> | 2019-07-02 12:22:07 +0200 |
commit | d92f22ab47e145426dca0eec13fd198dc7ff82de (patch) | |
tree | 282a01ed017688b7632168cdaeb8d2cdebce4628 | |
parent | 01bc57576be19bf5718453f9130e01eae575cd10 (diff) | |
download | glib-d92f22ab47e145426dca0eec13fd198dc7ff82de.tar.gz |
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
-rw-r--r-- | glib/gthread-posix.c | 4 |
1 files changed, 3 insertions, 1 deletions
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 |