mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
GWakeup: test fallback case
We need to test the case of eventfd in the libc but no kernel support. In order to do that, we add a separate compile of the GWakeup testcase that interposes an 'eventfd' symbol that always returns -1 with errno set. That will trigger the fallback case.
This commit is contained in:
parent
7f15910e79
commit
0584f0c504
@ -2641,6 +2641,7 @@ main (void)
|
|||||||
if test x"$glib_cv_eventfd" = x"yes"; then
|
if test x"$glib_cv_eventfd" = x"yes"; then
|
||||||
AC_DEFINE(HAVE_EVENTFD, 1, [we have the eventfd(2) system call])
|
AC_DEFINE(HAVE_EVENTFD, 1, [we have the eventfd(2) system call])
|
||||||
fi
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_EVENTFD, [test "$glib_cv_eventfd" = "yes"])
|
||||||
|
|
||||||
dnl ****************************************
|
dnl ****************************************
|
||||||
dnl *** GLib POLL* compatibility defines ***
|
dnl *** GLib POLL* compatibility defines ***
|
||||||
|
@ -46,3 +46,10 @@ spawn_singlethread_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-
|
|||||||
|
|
||||||
TEST_PROGS += gwakeup
|
TEST_PROGS += gwakeup
|
||||||
gwakeup_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la
|
gwakeup_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la
|
||||||
|
|
||||||
|
if HAVE_EVENTFD
|
||||||
|
TEST_PROGS += gwakeup-fallback
|
||||||
|
gwakeup_fallback_SOURCES = gwakeup.c
|
||||||
|
gwakeup_fallback_CFLAGS = $(AM_CFLAGS) -DTEST_EVENTFD_FALLBACK
|
||||||
|
gwakeup_fallback_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la
|
||||||
|
endif
|
||||||
|
@ -1,6 +1,32 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
#ifdef TEST_EVENTFD_FALLBACK
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
static gboolean we_broke_eventfd;
|
||||||
|
|
||||||
|
/* We interpose over the eventfd() call in the libc to ensure that a
|
||||||
|
* failed call to eventfd() gives us a working fallback.
|
||||||
|
*
|
||||||
|
* We need to do this because older kernel versions don't have eventfd
|
||||||
|
* support, and some of them have eventfd but without support for some
|
||||||
|
* of the flags we use.
|
||||||
|
*
|
||||||
|
* We use the we_broke_eventfd boolean to make sure that it actually
|
||||||
|
* worked.
|
||||||
|
*/
|
||||||
|
int eventfd (void) {
|
||||||
|
we_broke_eventfd = TRUE;
|
||||||
|
errno = EINVAL;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#define TESTNAME_SUFFIX "-fallback"
|
||||||
|
#else
|
||||||
|
#define TESTNAME_SUFFIX ""
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void alarm (int sec) { }
|
void alarm (int sec) { }
|
||||||
#endif
|
#endif
|
||||||
@ -32,9 +58,18 @@ test_semantics (void)
|
|||||||
/* prevent the test from deadlocking */
|
/* prevent the test from deadlocking */
|
||||||
alarm (30);
|
alarm (30);
|
||||||
|
|
||||||
|
#ifdef TEST_EVENTFD_FALLBACK
|
||||||
|
we_broke_eventfd = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
wakeup = g_wakeup_new ();
|
wakeup = g_wakeup_new ();
|
||||||
g_assert (!check_signaled (wakeup));
|
g_assert (!check_signaled (wakeup));
|
||||||
|
|
||||||
|
#ifdef TEST_EVENTFD_FALLBACK
|
||||||
|
/* make sure our interposed eventfd call worked */
|
||||||
|
g_assert (we_broke_eventfd);
|
||||||
|
#endif
|
||||||
|
|
||||||
g_wakeup_signal (wakeup);
|
g_wakeup_signal (wakeup);
|
||||||
g_assert (check_signaled (wakeup));
|
g_assert (check_signaled (wakeup));
|
||||||
|
|
||||||
@ -261,8 +296,8 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
g_test_init (&argc, &argv, NULL);
|
g_test_init (&argc, &argv, NULL);
|
||||||
|
|
||||||
g_test_add_func ("/gwakeup/semantics", test_semantics);
|
g_test_add_func ("/gwakeup/semantics" TESTNAME_SUFFIX, test_semantics);
|
||||||
g_test_add_func ("/gwakeup/threaded", test_threaded);
|
g_test_add_func ("/gwakeup/threaded" TESTNAME_SUFFIX, test_threaded);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user