static void test_thread_stop_unused (void) { GThreadPool *pool; guint i; guint limit = 100; /* Spawn a few threads. */ g_thread_pool_set_max_unused_threads (-1); pool = g_thread_pool_new ((GFunc) g_usleep, NULL, -1, FALSE, NULL); for (i = 0; i < limit; i++) g_thread_pool_push (pool, GUINT_TO_POINTER (1000), NULL); DEBUG_MSG (("[unused] ===> pushed %d threads onto the idle pool", limit)); /* Wait for the threads to migrate. */ g_usleep (G_USEC_PER_SEC); DEBUG_MSG (("[unused] current threads %d", test_count_threads())); DEBUG_MSG (("[unused] stopping unused threads")); g_thread_pool_stop_unused_threads (); for (i = 0; i < 5; i++) { if (g_thread_pool_get_num_unused_threads () == 0 && test_count_threads () == 0) break; DEBUG_MSG (("[unused] waiting ONE second for threads to die")); /* Some time for threads to die. */ g_usleep (G_USEC_PER_SEC); } DEBUG_MSG (("[unused] stopped idle threads, %d remain, %d threads still exist", g_thread_pool_get_num_unused_threads (), test_count_threads ())); g_assert (g_thread_pool_get_num_unused_threads () == test_count_threads ()); g_assert (g_thread_pool_get_num_unused_threads () == 0); g_thread_pool_set_max_unused_threads (MAX_THREADS); DEBUG_MSG (("[unused] cleaning up thread pool")); g_thread_pool_free (pool, FALSE, TRUE); }
static void test_thread_functions (void) { gint max_unused_threads; guint max_idle_time; /* This function attempts to call functions which don't need a * threadpool to operate to make sure no uninitialised pointers * accessed and no errors occur. */ max_unused_threads = 3; DEBUG_MSG (("[funcs] Setting max unused threads to %d", max_unused_threads)); g_thread_pool_set_max_unused_threads (max_unused_threads); DEBUG_MSG (("[funcs] Getting max unused threads = %d", g_thread_pool_get_max_unused_threads ())); g_assert (g_thread_pool_get_max_unused_threads() == max_unused_threads); DEBUG_MSG (("[funcs] Getting num unused threads = %d", g_thread_pool_get_num_unused_threads ())); g_assert (g_thread_pool_get_num_unused_threads () == 0); DEBUG_MSG (("[funcs] Stopping unused threads")); g_thread_pool_stop_unused_threads (); max_idle_time = 10 * G_USEC_PER_SEC; DEBUG_MSG (("[funcs] Setting max idle time to %d", max_idle_time)); g_thread_pool_set_max_idle_time (max_idle_time); DEBUG_MSG (("[funcs] Getting max idle time = %d", g_thread_pool_get_max_idle_time ())); g_assert (g_thread_pool_get_max_idle_time () == max_idle_time); DEBUG_MSG (("[funcs] Setting max idle time to 0")); g_thread_pool_set_max_idle_time (0); DEBUG_MSG (("[funcs] Getting max idle time = %d", g_thread_pool_get_max_idle_time ())); g_assert (g_thread_pool_get_max_idle_time () == 0); }
/** * Stop all nuauth thread pools * If soft is true, destroy pools. */ void stop_all_thread_pools(gboolean soft) { /* end logging threads */ if (soft) { stop_thread_pool("session logger", &nuauthdatas->user_session_loggers); stop_thread_pool("packet logger", &nuauthdatas->user_loggers); stop_thread_pool("acl checker", &nuauthdatas->acl_checkers); stop_thread_pool("users workers", &nuauthdatas->user_workers); if (nuauthconf->log_users_sync) { stop_thread_pool("decision worker", &nuauthdatas->decisions_workers); } if (nuauthconf->do_ip_authentication) { stop_thread_pool("ip auth worker", &nuauthdatas->ip_authentication_workers); } } g_thread_pool_stop_unused_threads(); }
static gboolean purge_useless_threads (gpointer data) { g_thread_pool_stop_unused_threads (); return TRUE; }