GCond (linux): fix g_cond_wait_until() return value on timeout

It should return FALSE on timeout (and only on timeout), and
TRUE otherwise.

https://bugzilla.gnome.org/show_bug.cgi?id=731986
This commit is contained in:
Tim-Philipp Müller 2014-07-05 15:03:22 +01:00 committed by Ryan Lortie
parent ecf1359191
commit 636cd00c21
2 changed files with 9 additions and 2 deletions

View File

@ -1415,6 +1415,7 @@ g_cond_wait_until (GCond *cond,
struct timespec now; struct timespec now;
struct timespec span; struct timespec span;
guint sampled; guint sampled;
int res;
if (end_time < 0) if (end_time < 0)
return FALSE; return FALSE;
@ -1433,10 +1434,10 @@ g_cond_wait_until (GCond *cond,
sampled = cond->i[0]; sampled = cond->i[0];
g_mutex_unlock (mutex); g_mutex_unlock (mutex);
syscall (__NR_futex, &cond->i[0], (gsize) FUTEX_WAIT, (gsize) sampled, &span); res = syscall (__NR_futex, &cond->i[0], (gsize) FUTEX_WAIT, (gsize) sampled, &span);
g_mutex_lock (mutex); g_mutex_lock (mutex);
return TRUE; return (res < 0 && errno == ETIMEDOUT) ? FALSE : TRUE;
} }
#endif #endif

View File

@ -260,6 +260,12 @@ test_wait_until (void)
/* Make sure it's after the until time */ /* Make sure it's after the until time */
g_assert_cmpint (until, <=, g_get_monotonic_time ()); g_assert_cmpint (until, <=, g_get_monotonic_time ());
/* Make sure it returns FALSE on timeout */
until = g_get_monotonic_time () + G_TIME_SPAN_SECOND / 50;
g_mutex_lock (&lock);
g_assert (g_cond_wait_until (&cond, &lock, until) == FALSE);
g_mutex_unlock (&lock);
g_mutex_clear (&lock); g_mutex_clear (&lock);
g_cond_clear (&cond); g_cond_clear (&cond);
} }