/* * Copyright (C) 2018 Red Hat, Inc. * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * licence, or (at your option) any later version. * * This is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #include #include #define MAX_RUNS 20 static gboolean quit_loop (gpointer user_data) { g_main_loop_quit (user_data); return FALSE; } static gpointer thread_func (gpointer user_data) { g_network_monitor_get_default (); g_timeout_add (100, quit_loop, user_data); return NULL; } static gboolean call_func (gpointer user_data) { GThread *thread; thread = g_thread_new (NULL, thread_func, user_data); g_thread_unref (thread); return FALSE; } /* Test that calling g_network_monitor_get_default() in a thread doesn’t cause * a crash. This is a probabilistic test; since it’s testing a race condition, * it can’t deterministically reproduce the problem. The threading has to * happen in subprocesses, since the result of g_network_monitor_get_default() * is unavoidably cached once created. */ static void test_network_monitor (void) { guint ii; g_test_bug ("793727"); if (g_test_subprocess ()) { GMainLoop *main_loop; main_loop = g_main_loop_new (NULL, FALSE); g_timeout_add (1, call_func, main_loop); g_main_loop_run (main_loop); g_main_loop_unref (main_loop); return; } for (ii = 0; ii < MAX_RUNS; ii++) { g_test_trap_subprocess (NULL, 0, 0); g_test_trap_assert_passed (); } } int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://bugzilla.gnome.org/show_bug.cgi?id="); g_test_add_func ("/network-monitor/create-in-thread", test_network_monitor); return g_test_run (); }