[glib/wip/desrt/gcond-errno-fixup: 12/13] gthread: fix minor errno problem in GCond



commit d92f22ab47e145426dca0eec13fd198dc7ff82de
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]