Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
/*
 * Test 1: so basic
 */
int
test1 (void)
{
	g_print ("Test1 started\n");
	GdaWorker *worker;

	worker = gda_worker_new ();
	gda_worker_unref (worker);
	return 0;
}
Beispiel #7
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;
}
Beispiel #8
0
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;
}
Beispiel #9
0
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;
}
Beispiel #10
0
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;
}
Beispiel #11
0
/**
 * 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;
}
Beispiel #12
0
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;
}