tracker r1368 - in branches/indexer-split: . src/libtracker-db
- From: pvanhoof svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r1368 - in branches/indexer-split: . src/libtracker-db
- Date: Thu, 8 May 2008 11:34:16 +0100 (BST)
Author: pvanhoof
Date: Thu May 8 10:34:16 2008
New Revision: 1368
URL: http://svn.gnome.org/viewvc/tracker?rev=1368&view=rev
Log:
2008-05-08 Philip Van Hoof <pvanhoof gnome org>
* src/libtracker-db/tracker-db-interface-sqlite.c:
Moved all sqlite3 queries to one thread in GThreadPool, prepared the
ground for future asynchronous calling back.
Modified:
branches/indexer-split/ChangeLog
branches/indexer-split/src/libtracker-db/tracker-db-interface-sqlite.c
Modified: branches/indexer-split/src/libtracker-db/tracker-db-interface-sqlite.c
==============================================================================
--- branches/indexer-split/src/libtracker-db/tracker-db-interface-sqlite.c (original)
+++ branches/indexer-split/src/libtracker-db/tracker-db-interface-sqlite.c Thu May 8 10:34:16 2008
@@ -35,6 +35,8 @@
GSList *function_data;
guint in_transaction : 1;
+
+ GThreadPool *pool;
};
struct SqliteFunctionData {
@@ -42,7 +44,18 @@
TrackerDBFunc func;
};
+typedef struct {
+ sqlite3_stmt *stmt;
+ GError **error;
+ TrackerDBResultSet *retval;
+
+ GCond* condition;
+ gboolean had_callback;
+ GMutex *mutex;
+} TrackerDBQueryTask;
+
static void tracker_db_interface_sqlite_iface_init (TrackerDBInterfaceIface *iface);
+static void process_query (gpointer data, gpointer user_data);
enum {
PROP_0,
@@ -129,6 +142,9 @@
priv = TRACKER_DB_INTERFACE_SQLITE_GET_PRIVATE (object);
+ /* This waits for all tasks being finished */
+ g_thread_pool_free (priv->pool, TRUE, TRUE);
+
g_free (priv->filename);
g_hash_table_destroy (priv->statements);
@@ -181,6 +197,9 @@
priv->statements = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) sqlite3_finalize);
+
+ priv->pool = g_thread_pool_new (process_query, db_interface,
+ 1, TRUE, NULL);
}
static void
@@ -429,6 +448,54 @@
return stmt;
}
+
+static void
+process_query (gpointer data, gpointer user_data)
+{
+ TrackerDBQueryTask *task = (TrackerDBQueryTask *) data;
+
+ task->retval = create_result_set_from_stmt (TRACKER_DB_INTERFACE_SQLITE (user_data),
+ task->stmt, task->error);
+
+ g_mutex_lock (task->mutex);
+ g_cond_broadcast (task->condition);
+ task->had_callback = TRUE;
+ g_mutex_unlock (task->mutex);
+}
+
+static TrackerDBQueryTask*
+create_db_query_task (sqlite3_stmt *stmt, GError **error)
+{
+ TrackerDBQueryTask *task = g_slice_new (TrackerDBQueryTask);
+
+ task->mutex = g_mutex_new ();
+ task->condition = g_cond_new ();
+ task->had_callback = FALSE;
+
+ task->stmt = stmt;
+ task->error = error;
+
+ return task;
+}
+
+static void
+wait_for_db_query_task (TrackerDBQueryTask *task)
+{
+ g_mutex_lock (task->mutex);
+ if (!task->had_callback)
+ g_cond_wait (task->condition, task->mutex);
+ g_mutex_unlock (task->mutex);
+}
+
+static void
+free_db_query_task (TrackerDBQueryTask *task)
+{
+ g_mutex_free (task->mutex);
+ g_cond_free (task->condition);
+
+ g_slice_free (TrackerDBQueryTask, task);
+}
+
static TrackerDBResultSet *
tracker_db_interface_sqlite_execute_procedure (TrackerDBInterface *db_interface,
GError **error,
@@ -439,6 +506,8 @@
sqlite3_stmt *stmt;
gint stmt_args, n_args;
gchar *str;
+ TrackerDBResultSet *retval;
+ TrackerDBQueryTask *task;
priv = TRACKER_DB_INTERFACE_SQLITE_GET_PRIVATE (db_interface);
stmt = get_stored_stmt (TRACKER_DB_INTERFACE_SQLITE (db_interface), procedure_name);
@@ -453,7 +522,13 @@
/* Just panic if the number of arguments don't match */
g_assert (n_args != stmt_args);
- return create_result_set_from_stmt (TRACKER_DB_INTERFACE_SQLITE (db_interface), stmt, error);
+ task = create_db_query_task (stmt, error);
+ g_thread_pool_push (priv->pool, task, NULL);
+ wait_for_db_query_task (task);
+ retval = task->retval;
+ free_db_query_task (task);
+
+ return retval;
}
static TrackerDBResultSet *
@@ -466,6 +541,8 @@
sqlite3_stmt *stmt;
gint stmt_args, n_args, len;
gchar *str;
+ TrackerDBResultSet *retval;
+ TrackerDBQueryTask *task;
priv = TRACKER_DB_INTERFACE_SQLITE_GET_PRIVATE (db_interface);
stmt = get_stored_stmt (TRACKER_DB_INTERFACE_SQLITE (db_interface), procedure_name);
@@ -489,7 +566,13 @@
/* Just panic if the number of arguments don't match */
g_assert (n_args != stmt_args);
- return create_result_set_from_stmt (TRACKER_DB_INTERFACE_SQLITE (db_interface), stmt, error);
+ task = create_db_query_task (stmt, error);
+ g_thread_pool_push (priv->pool, task, NULL);
+ wait_for_db_query_task (task);
+ retval = task->retval;
+ free_db_query_task (task);
+
+ return retval;
}
static TrackerDBResultSet *
@@ -498,7 +581,8 @@
const gchar *query)
{
TrackerDBInterfaceSqlitePrivate *priv;
- TrackerDBResultSet *result_set;
+ TrackerDBResultSet *retval;
+ TrackerDBQueryTask *task;
sqlite3_stmt *stmt;
priv = TRACKER_DB_INTERFACE_SQLITE_GET_PRIVATE (db_interface);
@@ -513,10 +597,18 @@
return NULL;
}
- result_set = create_result_set_from_stmt (TRACKER_DB_INTERFACE_SQLITE (db_interface), stmt, error);
+ task = create_db_query_task (stmt, error);
+ g_thread_pool_push (priv->pool, task, NULL);
+ wait_for_db_query_task (task);
+ retval = task->retval;
+ free_db_query_task (task);
+
+ /* This is different? (it's like in the original code before
+ * the threadpool) */
sqlite3_finalize (stmt);
- return result_set;
+ return retval;
+
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]