g_test_assert_expected_messages ();
}
+static gboolean
+trivial_prepare (GSource *source,
+ gint *timeout)
+{
+ *timeout = 0;
+ return TRUE;
+}
+
+static gint n_finalized;
+
+static void
+trivial_finalize (GSource *source)
+{
+ n_finalized++;
+}
+
+static void
+test_unref_while_pending (void)
+{
+ static GSourceFuncs funcs = { trivial_prepare, NULL, NULL, trivial_finalize };
+ GMainContext *context;
+ GSource *source;
+
+ context = g_main_context_new ();
+
+ source = g_source_new (&funcs, sizeof (GSource));
+ g_source_attach (source, context);
+ g_source_unref (source);
+
+ /* Do incomplete main iteration -- get a pending source but don't dispatch it. */
+ g_main_context_prepare (context, NULL);
+ g_main_context_query (context, 0, NULL, NULL, 0);
+ g_main_context_check (context, 1000, NULL, 0);
+
+ /* Destroy the context */
+ g_main_context_unref (context);
+
+ /* Make sure we didn't leak the source */
+ g_assert_cmpint (n_finalized, ==, 1);
+}
+
#ifdef G_OS_UNIX
#include <glib-unix.h>
GMainContext *context;
gboolean consumed[10] = { };
GPollFD poll_fds[10];
+ gboolean acquired;
gboolean immediate;
gint max_priority;
gint timeout;
context = g_main_context_default ();
+ acquired = g_main_context_acquire (context);
+ g_assert (acquired);
+
immediate = g_main_context_prepare (context, &max_priority);
g_assert (!immediate);
n = g_main_context_query (context, max_priority, &timeout, poll_fds, 10);
if (g_main_context_check (context, max_priority, poll_fds, n))
g_main_context_dispatch (context);
+
+ g_main_context_release (context);
}
static gboolean
close (fds_b[1]);
}
+static gboolean
+unixfd_quit_loop (gint fd,
+ GIOCondition condition,
+ gpointer user_data)
+{
+ GMainLoop *loop = user_data;
+
+ g_main_loop_quit (loop);
+
+ return FALSE;
+}
+
+static void
+test_unix_file_poll (void)
+{
+ gint fd;
+ GSource *source;
+ GMainLoop *loop;
+
+ fd = open ("/dev/null", O_RDONLY);
+ g_assert (fd >= 0);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ source = g_unix_fd_source_new (fd, G_IO_IN);
+ g_source_set_callback (source, (GSourceFunc) unixfd_quit_loop, loop, NULL);
+ g_source_attach (source, NULL);
+
+ /* Should not block */
+ g_main_loop_run (loop);
+
+ g_source_destroy (source);
+
+ assert_main_context_state (0);
+
+ g_source_unref (source);
+
+ g_main_loop_unref (loop);
+
+ close (fd);
+}
+
#endif
static gboolean
g_test_add_func ("/mainloop/ready-time", test_ready_time);
g_test_add_func ("/mainloop/wakeup", test_wakeup);
g_test_add_func ("/mainloop/remove-invalid", test_remove_invalid);
+ g_test_add_func ("/mainloop/unref-while-pending", test_unref_while_pending);
#ifdef G_OS_UNIX
g_test_add_func ("/mainloop/unix-fd", test_unix_fd);
g_test_add_func ("/mainloop/unix-fd-source", test_unix_fd_source);
g_test_add_func ("/mainloop/source-unix-fd-api", test_source_unix_fd_api);
g_test_add_func ("/mainloop/wait", test_mainloop_wait);
+ g_test_add_func ("/mainloop/unix-file-poll", test_unix_file_poll);
#endif
return g_test_run ();