int test12 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; g_print ("Waiting for test12_func() to execute\n"); gpointer result; if (!gda_worker_do_job (worker, NULL, 0, &result, NULL, (GdaWorkerFunc) test12_func, NULL, NULL, NULL, &error) || (result != (gpointer) 0x02)) { g_print ("gda_worker_do_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
int test13 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; g_timeout_add (200, (GSourceFunc) test13_time_func, gda_worker_ref (worker)); g_print ("Sumbitting job for test13_func()\n"); gpointer result; if (!gda_worker_do_job (worker, NULL, 0, &result, NULL, (GdaWorkerFunc) test13_func, "1st", NULL, NULL, &error)) { g_print ("gda_worker_do_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } else if (GPOINTER_TO_UINT (result) != 2) { g_print ("In %s(): expected 2 and got %u\n", __FUNCTION__, GPOINTER_TO_UINT (result)); nfailed ++; } else if (test13_sub_failed) nfailed ++; g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
int test10 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; g_print ("Waiting for test10_func() to execute\n"); if (gda_worker_wait_job (worker, (GdaWorkerFunc) test10_func_slow, NULL, NULL, &error) != (gpointer) 0x01) { g_print ("gda_worker_wait_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } else { if (gda_worker_wait_job (worker, (GdaWorkerFunc) test10_func_fast, NULL, NULL, &error) != (gpointer) 0x02) { g_print ("gda_worker_wait_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
int test5 (void) { g_print ("Test5 started, main thread is %p\n", g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; GMainLoop *loop; loop = g_main_loop_new (NULL, FALSE); if (! gda_worker_set_callback (worker, NULL, (GdaWorkerCallback) test5_worker_callback, loop, &error)) { g_print ("gda_worker_set_callback() error: %s\n", error && error->message ? error->message : "no detail"); nfailed++; } else { g_assert (g_idle_add ((GSourceFunc) test5_idle_push_jobs, worker) != 0); } g_main_loop_run (loop); g_main_loop_unref (loop); gda_worker_unref (worker); g_print ("Test 5 done\n"); return nfailed; }
int test9 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); #define NB_THREADS 2 GThread *threads[NB_THREADS]; guint i; for (i = 0; i < NB_THREADS; i++) { gchar *name; name = g_strdup_printf ("th%u", i); threads[i] = g_thread_new (name, (GThreadFunc) test9_main_func, worker); g_free (name); } for (i = 0; i < NB_THREADS; i++) { if (g_thread_join (threads[i])) nfailed++; } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
/* * Test 1: so basic */ int test1 (void) { g_print ("Test1 started\n"); GdaWorker *worker; worker = gda_worker_new (); gda_worker_unref (worker); return 0; }
int test3 (void) { g_print ("Test3 started, main thread is %p\n", g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); guint jid; GError *error = NULL; Data3 *data; data = g_new (Data3, 1); data->counter = 5; jid = gda_worker_submit_job (worker, NULL, (GdaWorkerFunc) test3_worker_func, data, (GDestroyNotify) data3_free, NULL, &error); if (jid == 0) { g_print ("Error in gda_worker_submit_job(): %s\n", error && error->message ? error->message : "no detail"); g_clear_error (&error); nfailed++; goto out; } while (1) { gint *result; if (! gda_worker_fetch_job_result (worker, jid, (gpointer*) &result, &error)) { g_print ("Still not done, error: %s\n", error && error->message ? error->message : "no detail"); if ((error->domain == GDA_WORKER_ERROR) && (error->code == GDA_WORKER_JOB_NOT_FOUND_ERROR)) { nfailed++; g_clear_error (&error); break; } g_clear_error (&error); } else { if (result) { g_print ("Got result value: %d\n", *result); g_free (result); } else { g_print ("Error: got no result value!\n"); nfailed++; } break; } g_usleep (100000); } out: gda_worker_unref (worker); return nfailed; }
int test6 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; guint nticks = 0; guint timer; timer = g_timeout_add (10, (GSourceFunc) test6_timer_cb, &nticks); guint jid; gpointer out; gint wait; wait = 50; if (gda_worker_do_job (worker, NULL, 100, &out, &jid, (GdaWorkerFunc) test6_worker_func, (gpointer) &wait, NULL, (GDestroyNotify) test6_string_free, &error)) { if (!out || strcmp (out, "Test6Done")) { g_print ("Expected out to be [Test6Done] and got [%s]\n", (gchar*) out); nfailed++; } g_free (out); if (jid != 0) { g_print ("Expected JID to be 0 and got %u\n", jid); nfailed++; } } else { g_print ("gda_worker_do_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } g_source_remove (timer); if (nticks < 3) { g_print ("Tick timer was not called while in gda_worker_do_job()\n"); nfailed++; } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
int test8 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; guint jid; jid = gda_worker_submit_job (worker, NULL, (GdaWorkerFunc) test8_func, worker, NULL, NULL, &error); if (jid == 0) { g_print ("gda_worker_submit_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } else { while (1) { gpointer out; g_print ("Waiting for result using gda_worker_fetch_job_result()\n"); if (gda_worker_fetch_job_result (worker, jid, &out, &error)) { if (!out || strcmp (out, "test8_sub_func")) { g_print ("Expected out to be [test8_sub_func] and got %s\n", (gchar*) out); nfailed++; } if (error) { g_print ("Got error: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed++; } break; } else g_clear_error (&error); g_usleep (100000); } } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
int test11 (void) { g_print ("%s started, main thread is %p\n", __FUNCTION__, g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); GError *error = NULL; g_print ("Waiting for test11_func() to execute\n"); gpointer result; if (!gda_worker_do_job (worker, NULL, 0, &result, NULL, (GdaWorkerFunc) test11_func, NULL, NULL, NULL, &error) || (result != (gpointer) 0x01)) { g_print ("gda_worker_do_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } if (!gda_worker_do_job (worker, NULL, 0, &result, NULL, (GdaWorkerFunc) test11_func_e, NULL, NULL, NULL, &error) || result) { g_print ("gda_worker_do_job() failed: %s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } else if (!error || (error->domain != 1) || (error->code != 1)) { g_print ("gda_worker_do_job() failed: unexpected empty error, or wrong error domain or code%s\n", error && error->message ? error->message : "No detail"); g_clear_error (&error); nfailed ++; } g_print ("Unref worker...\n"); gda_worker_unref (worker); g_print ("%s done\n", __FUNCTION__); return nfailed; }
/** * gda_worker_new_unique: (skip) * @location: a place to store and test for existence, not %NULL * @allow_destroy: defines if the created @GdaWorker (see case 1 below) will allow its reference to drop to 0 and be destroyed * * This function creates a new #GdaWorker, or reuses the one at @location. Specifically: * <orderedlist> * <listitem><para>if *@location is %NULL, then a new #GdaWorker is created. In this case if @allow_destroy is %FALSE, then the returned * #GdaWorker's reference count is 2, thus preventing it form ever being destroyed (unless gda_worker_unref() is called somewhere else)</para></listitem> * <listitem><para>if *@location is not %NULL, the the #GdaWorker it points to is returned, its reference count increased by 1</para></listitem> * </orderedlist> * * When the returned #GdaWorker's reference count reaches 0, then it is destroyed, and *@location is set to %NULL. * * In any case, the returned value is the same as *@location. * * Returns: (transfer full): a #GdaWorker */ GdaWorker * gda_worker_new_unique (GdaWorker **location, gboolean allow_destroy) { g_return_val_if_fail (location, NULL); g_mutex_lock (&unique_worker_mutex); if (*location) gda_worker_ref (*location); else { GdaWorker *worker; worker = gda_worker_new (); if (! allow_destroy) gda_worker_ref (worker); worker->location = location; *location = worker; } g_mutex_unlock (&unique_worker_mutex); return *location; }
int test4 (void) { g_print ("Test4 started, main thread is %p\n", g_thread_self ()); GdaWorker *worker; gint nfailed = 0; worker = gda_worker_new (); guint jid1, jid2; GError *error = NULL; jid1 = gda_worker_submit_job (worker, NULL, (GdaWorkerFunc) test4_worker_func, NULL, NULL, NULL, &error); if (jid1 == 0) { g_print ("Error in gda_worker_submit_job(): %s\n", error && error->message ? error->message : "no detail"); g_clear_error (&error); nfailed++; goto out; } jid2 = gda_worker_submit_job (worker, NULL, (GdaWorkerFunc) test4_worker_func, NULL, NULL, NULL, &error); if (jid2 == 0) { g_print ("Error in gda_worker_submit_job(): %s\n", error && error->message ? error->message : "no detail"); g_clear_error (&error); nfailed++; goto out; } if (! gda_worker_cancel_job (worker, jid2, &error)) { g_print ("Error in gda_worker_cancel_job(): %s\n", error && error->message ? error->message : "no detail"); g_clear_error (&error); nfailed++; goto out; } if (! gda_worker_cancel_job (worker, jid2, &error)) { g_print ("Error in gda_worker_cancel_job(): %s\n", error && error->message ? error->message : "no detail"); g_clear_error (&error); nfailed++; goto out; } if (gda_worker_cancel_job (worker, 10, NULL)) { g_print ("Error in gda_worker_cancel_job(): should have failed!\n"); nfailed++; goto out; } while (1) { gint *result; if (! gda_worker_fetch_job_result (worker, jid1, (gpointer*) &result, &error)) { g_print ("Still not done, error: %s\n", error && error->message ? error->message : "no detail"); if ((error->domain == GDA_WORKER_ERROR) && (error->code == GDA_WORKER_JOB_NOT_FOUND_ERROR)) { nfailed++; g_clear_error (&error); break; } g_clear_error (&error); } else { if (result) { g_print ("Error: got result value when expected none!\n"); nfailed++; } break; } g_usleep (100000); } out: gda_worker_unref (worker); return nfailed; }