[tracker/dbus-fd-experiment] Steroids client: Add async versions
- From: Adrien Bustany <abustany src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/dbus-fd-experiment] Steroids client: Add async versions
- Date: Fri, 4 Jun 2010 01:05:42 +0000 (UTC)
commit 7f0a3918fbf096fa8c63301e0ea4ae7be3d3a8a2
Author: Adrien Bustany <abustany gnome org>
Date: Thu Jun 3 20:31:16 2010 -0400
Steroids client: Add async versions
This commit adds async versions for all the _iterate and _fast versions
of the tracker_resources_* functions.
src/libtracker-client/tracker.c | 258 +++++++++++++++++++++++++++++++++++++--
src/libtracker-client/tracker.h | 20 +++
2 files changed, 267 insertions(+), 11 deletions(-)
---
diff --git a/src/libtracker-client/tracker.c b/src/libtracker-client/tracker.c
index e6492be..0e24620 100644
--- a/src/libtracker-client/tracker.c
+++ b/src/libtracker-client/tracker.c
@@ -113,6 +113,10 @@ typedef struct {
GList *writeback_callbacks;
gboolean is_constructed;
+
+#ifdef HAVE_DBUS_FD_PASSING
+ GThreadPool *thread_pool;
+#endif
} TrackerClientPrivate;
typedef struct {
@@ -174,10 +178,28 @@ struct TrackerResultIterator {
#ifdef HAVE_DBUS_FD_PASSING
typedef enum {
- TRACKER_UPDATE,
- TRACKER_UPDATE_BLANK,
- TRACKER_UPDATE_BATCH
-} TrackerUpdateType;
+ FAST_QUERY,
+ FAST_UPDATE,
+ FAST_UPDATE_BLANK,
+ FAST_UPDATE_BATCH
+} FastOperationType;
+
+typedef struct {
+ FastOperationType operation;
+ gchar *query;
+ GError *error;
+ gpointer user_data;
+ union {
+ GPtrArray *result_gptrarray;
+ TrackerResultIterator *result_iterator;
+ };
+ union {
+ TrackerReplyGPtrArray gptrarray_callback;
+ TrackerReplyVoid void_callback;
+ TrackerReplyArray array_callback;
+ TrackerReplyIterator iterator_callback;
+ };
+} FastAsyncData;
#endif
static gboolean is_service_available (void);
@@ -259,6 +281,74 @@ writeback_cb (DBusGProxy *proxy,
}
}
+static gboolean
+thread_callback (gpointer data)
+{
+ FastAsyncData *async_data = data;
+
+ switch (async_data->operation) {
+ case FAST_QUERY:
+ (* async_data->iterator_callback) (async_data->result_iterator,
+ async_data->error,
+ async_data->user_data);
+ break;
+ case FAST_UPDATE:
+ case FAST_UPDATE_BATCH:
+ (* async_data->void_callback) (async_data->error,
+ async_data->user_data);
+ break;
+ case FAST_UPDATE_BLANK:
+ (* async_data->gptrarray_callback) (async_data->result_gptrarray,
+ async_data->error,
+ async_data->user_data);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ g_free (async_data->query);
+
+ if (async_data->error) {
+ g_error_free (async_data->error);
+ }
+
+ return FALSE;
+}
+
+static void
+thread_dispatch (gpointer data, gpointer user_data)
+{
+ FastAsyncData *async_data = data;
+ TrackerClient *client = user_data;
+
+ switch (async_data->operation) {
+ case FAST_QUERY:
+ async_data->result_iterator = tracker_resources_sparql_query_iterate (client,
+ async_data->query,
+ &async_data->error);
+ break;
+ case FAST_UPDATE:
+ tracker_resources_sparql_update_fast (client,
+ async_data->query,
+ &async_data->error);
+ break;
+ case FAST_UPDATE_BLANK:
+ async_data->result_gptrarray = tracker_resources_sparql_update_blank_fast (client,
+ async_data->query,
+ &async_data->error);
+ break;
+ case FAST_UPDATE_BATCH:
+ tracker_resources_batch_sparql_update_fast (client,
+ async_data->query,
+ &async_data->error);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ g_idle_add (thread_callback, async_data);
+}
+
static void
tracker_client_class_init (TrackerClientClass *klass)
{
@@ -317,6 +407,12 @@ client_finalize (GObject *object)
if (private->pending_calls) {
g_hash_table_unref (private->pending_calls);
}
+
+ if (private->thread_pool) {
+ g_thread_pool_free (private->thread_pool,
+ TRUE,
+ TRUE);
+ }
}
static void
@@ -422,6 +518,14 @@ client_constructed (GObject *object)
TRACKER_TYPE_STR_STRV_MAP,
G_TYPE_INVALID);
+#ifdef HAVE_DBUS_FD_PASSING
+ private->thread_pool = g_thread_pool_new (thread_dispatch,
+ object,
+ 5,
+ FALSE,
+ NULL);
+#endif
+
private->is_constructed = TRUE;
}
@@ -888,7 +992,7 @@ end_of_results:
static DBusMessage*
sparql_update_fast (TrackerClient *client,
const gchar *query,
- TrackerUpdateType type,
+ FastOperationType type,
GError **error)
{
TrackerClientPrivate *private;
@@ -922,13 +1026,13 @@ sparql_update_fast (TrackerClient *client,
dbus_error_init (&dbus_error);
switch (type) {
- case TRACKER_UPDATE:
+ case FAST_UPDATE:
dbus_method = "Update";
break;
- case TRACKER_UPDATE_BLANK:
+ case FAST_UPDATE_BLANK:
dbus_method = "UpdateBlank";
break;
- case TRACKER_UPDATE_BATCH:
+ case FAST_UPDATE_BATCH:
dbus_method = "BatchUpdate";
break;
default:
@@ -1810,7 +1914,7 @@ tracker_resources_sparql_update_fast (TrackerClient *client,
#ifdef HAVE_DBUS_FD_PASSING
DBusMessage *reply;
- reply = sparql_update_fast (client, query, TRACKER_UPDATE, error);
+ reply = sparql_update_fast (client, query, FAST_UPDATE, error);
if (!reply) {
return;
@@ -1855,7 +1959,7 @@ tracker_resources_sparql_update_blank_fast (TrackerClient *client,
DBusMessageIter iter, subiter, subsubiter;
GPtrArray *result;
- reply = sparql_update_fast (client, query, TRACKER_UPDATE_BLANK, error);
+ reply = sparql_update_fast (client, query, FAST_UPDATE_BLANK, error);
if (!reply) {
return NULL;
@@ -1935,7 +2039,7 @@ tracker_resources_batch_sparql_update_fast (TrackerClient *client,
#ifdef HAVE_DBUS_FD_PASSING
DBusMessage *reply;
- reply = sparql_update_fast (client, query, TRACKER_UPDATE_BATCH, error);
+ reply = sparql_update_fast (client, query, FAST_UPDATE_BATCH, error);
if (!reply) {
return;
@@ -2090,6 +2194,39 @@ tracker_resources_sparql_query_async (TrackerClient *client,
return cb->id;
}
+guint
+tracker_resources_sparql_query_iterate_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyIterator callback,
+ gpointer user_data)
+{
+ TrackerClientPrivate *private;
+ FastAsyncData *data;
+ GError *error = NULL;
+
+ g_return_val_if_fail (TRACKER_IS_CLIENT (client), 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
+
+ private = TRACKER_CLIENT_GET_PRIVATE (client);
+
+ data = g_slice_new0 (FastAsyncData);
+ data->operation = FAST_QUERY;
+ data->query = g_strdup (query);
+ data->iterator_callback = callback;
+ data->user_data = user_data;
+
+ g_thread_pool_push (private->thread_pool, data, &error);
+
+ if (error) {
+ g_critical ("Could not create thread: %s", error->message);
+ g_error_free (error);
+ return 0;
+ }
+
+ return 0;
+}
+
/**
* tracker_resources_sparql_update_async:
* @client: a #TrackerClient.
@@ -2136,6 +2273,39 @@ tracker_resources_sparql_update_async (TrackerClient *client,
}
guint
+tracker_resources_sparql_update_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyVoid callback,
+ gpointer user_data)
+{
+ TrackerClientPrivate *private;
+ FastAsyncData *data;
+ GError *error = NULL;
+
+ g_return_val_if_fail (TRACKER_IS_CLIENT (client), 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
+
+ private = TRACKER_CLIENT_GET_PRIVATE (client);
+
+ data = g_slice_new0 (FastAsyncData);
+ data->operation = FAST_UPDATE;
+ data->query = g_strdup (query);
+ data->void_callback = callback;
+ data->user_data = user_data;
+
+ g_thread_pool_push (private->thread_pool, data, &error);
+
+ if (error) {
+ g_critical ("Could not create thread: %s", error->message);
+ g_error_free (error);
+ return 0;
+ }
+
+ return 0;
+}
+
+guint
tracker_resources_sparql_update_blank_async (TrackerClient *client,
const gchar *query,
TrackerReplyGPtrArray callback,
@@ -2166,6 +2336,39 @@ tracker_resources_sparql_update_blank_async (TrackerClient *client,
return cb->id;
}
+guint
+tracker_resources_sparql_update_blank_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyGPtrArray callback,
+ gpointer user_data)
+{
+ TrackerClientPrivate *private;
+ FastAsyncData *data;
+ GError *error = NULL;
+
+ g_return_val_if_fail (TRACKER_IS_CLIENT (client), 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
+
+ private = TRACKER_CLIENT_GET_PRIVATE (client);
+
+ data = g_slice_new0 (FastAsyncData);
+ data->operation = FAST_UPDATE_BLANK;
+ data->query = g_strdup (query);
+ data->gptrarray_callback = callback;
+ data->user_data = user_data;
+
+ g_thread_pool_push (private->thread_pool, data, &error);
+
+ if (error) {
+ g_critical ("Could not create thread: %s", error->message);
+ g_error_free (error);
+ return 0;
+ }
+
+ return 0;
+}
+
/**
* tracker_resources_batch_sparql_update_async:
* @client: a #TrackerClient.
@@ -2211,6 +2414,39 @@ tracker_resources_batch_sparql_update_async (TrackerClient *client,
return cb->id;
}
+guint
+tracker_resources_batch_sparql_update_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyVoid callback,
+ gpointer user_data)
+{
+ TrackerClientPrivate *private;
+ FastAsyncData *data;
+ GError *error = NULL;
+
+ g_return_val_if_fail (TRACKER_IS_CLIENT (client), 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
+
+ private = TRACKER_CLIENT_GET_PRIVATE (client);
+
+ data = g_slice_new0 (FastAsyncData);
+ data->operation = FAST_UPDATE_BLANK;
+ data->query = g_strdup (query);
+ data->void_callback = callback;
+ data->user_data = user_data;
+
+ g_thread_pool_push (private->thread_pool, data, &error);
+
+ if (error) {
+ g_critical ("Could not create thread: %s", error->message);
+ g_error_free (error);
+ return 0;
+ }
+
+ return 0;
+}
+
/**
* tracker_resources_batch_commit_async:
* @client: a #TrackerClient.
diff --git a/src/libtracker-client/tracker.h b/src/libtracker-client/tracker.h
index 0ae85d0..3bb397e 100644
--- a/src/libtracker-client/tracker.h
+++ b/src/libtracker-client/tracker.h
@@ -95,6 +95,10 @@ typedef void (*TrackerReplyGPtrArray) (GPtrArray *result,
typedef void (*TrackerReplyVoid) (GError *error,
gpointer user_data);
+typedef void (*TrackerReplyIterator) (TrackerResultIterator *iterator,
+ GError *error,
+ gpointer user_data);
+
/**
* TrackerWritebackCallback:
* @resources: a hash table where each key is the uri of a resources which
@@ -175,18 +179,34 @@ guint tracker_resources_sparql_query_async (TrackerClient
const gchar *query,
TrackerReplyGPtrArray callback,
gpointer user_data);
+guint tracker_resources_sparql_query_iterate_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyIterator callback,
+ gpointer user_data);
guint tracker_resources_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data);
+guint tracker_resources_sparql_update_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyVoid callback,
+ gpointer user_data);
guint tracker_resources_sparql_update_blank_async (TrackerClient *client,
const gchar *query,
TrackerReplyGPtrArray callback,
gpointer user_data);
+guint tracker_resources_sparql_update_blank_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyGPtrArray callback,
+ gpointer user_data);
guint tracker_resources_batch_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data);
+guint tracker_resources_batch_sparql_update_fast_async (TrackerClient *client,
+ const gchar *query,
+ TrackerReplyVoid callback,
+ gpointer user_data);
guint tracker_resources_batch_commit_async (TrackerClient *client,
TrackerReplyVoid callback,
gpointer user_data);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]