mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-27 07:56:14 +01:00
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:
parent
ecf1359191
commit
636cd00c21
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user