[tracker] libtracker-data: Use internal mutex in TrackerDBInterfaceSqlite
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-data: Use internal mutex in TrackerDBInterfaceSqlite
- Date: Sun, 20 Nov 2016 16:07:51 +0000 (UTC)
commit f185c630e7a0dd9208f23df248b331e899315224
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Nov 5 19:37:22 2016 +0100
libtracker-data: Use internal mutex in TrackerDBInterfaceSqlite
There is no reason to use a global mutex for multiple TrackerDBInterfaces,
the threading restriction in sqlite is "no multiple threads using the same
sqlite3* at the same time" (being cursor included "using" there). This
means we must restrict simultaneous threaded access to a single
TrackerDBInterface, but multiple threads are free to use a
TrackerDBInterface each without further interference.
So, use a per-TrackerDBInterface mutex instead of a global one, if multiple
cursors are created on the same interface, they'll backreference to it, so
will be blocking on the same mutex.
src/libtracker-data/tracker-db-interface-sqlite.c | 110 ++++++++++----------
1 files changed, 55 insertions(+), 55 deletions(-)
---
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c
b/src/libtracker-data/tracker-db-interface-sqlite.c
index 4d72e1a..2ceea27 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -94,6 +94,10 @@ struct TrackerDBInterface {
gchar *busy_status;
gchar *fts_properties;
+
+ /* Used if TRACKER_DB_MANAGER_ENABLE_MUTEXES is set */
+ GMutex mutex;
+ guint use_mutex;
};
struct TrackerDBInterfaceClass {
@@ -109,10 +113,6 @@ struct TrackerDBCursor {
gint n_types;
gchar **variable_names;
gint n_variable_names;
-
- /* used for direct access as libtracker-sparql is thread-safe and
- uses a single shared connection with SQLite mutex disabled */
- gboolean threadsafe;
};
struct TrackerDBCursorClass {
@@ -1433,6 +1433,20 @@ initialize_functions (TrackerDBInterface *db_interface)
}
}
+static inline void
+tracker_db_interface_lock (TrackerDBInterface *iface)
+{
+ if (iface->use_mutex)
+ g_mutex_lock (&iface->mutex);
+}
+
+static inline void
+tracker_db_interface_unlock (TrackerDBInterface *iface)
+{
+ if (iface->use_mutex)
+ g_mutex_unlock (&iface->mutex);
+}
+
static void
open_database (TrackerDBInterface *db_interface,
GError **error)
@@ -1912,6 +1926,8 @@ static void
tracker_db_interface_init (TrackerDBInterface *db_interface)
{
db_interface->ro = FALSE;
+ db_interface->use_mutex = (tracker_db_manager_get_flags (NULL, NULL) &
+ TRACKER_DB_MANAGER_ENABLE_MUTEXES) != 0;
prepare_database (db_interface);
}
@@ -2384,18 +2400,14 @@ tracker_db_cursor_close (TrackerDBCursor *cursor)
iface = cursor->ref_stmt->db_interface;
g_atomic_int_add (&iface->n_active_cursors, -1);
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ tracker_db_interface_lock (iface);
cursor->ref_stmt->stmt_is_used = FALSE;
tracker_db_statement_sqlite_reset (cursor->ref_stmt);
g_object_unref (cursor->ref_stmt);
cursor->ref_stmt = NULL;
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
}
static void
@@ -2518,9 +2530,6 @@ tracker_db_cursor_sqlite_new (TrackerDBStatement *ref_stmt,
cursor->finished = FALSE;
- cursor->threadsafe = (tracker_db_manager_get_flags (NULL, NULL) &
- TRACKER_DB_MANAGER_ENABLE_MUTEXES) != 0;
-
cursor->stmt = ref_stmt->stmt;
ref_stmt->stmt_is_used = TRUE;
cursor->ref_stmt = g_object_ref (ref_stmt);
@@ -2598,18 +2607,18 @@ tracker_db_statement_bind_text (TrackerDBStatement *stmt,
void
tracker_db_cursor_rewind (TrackerDBCursor *cursor)
{
+ TrackerDBInterface *iface;
+
g_return_if_fail (TRACKER_IS_DB_CURSOR (cursor));
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
sqlite3_reset (cursor->stmt);
cursor->finished = FALSE;
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
}
gboolean
@@ -2636,9 +2645,7 @@ db_cursor_iter_next (TrackerDBCursor *cursor,
if (!cursor->finished) {
guint result;
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ tracker_db_interface_lock (iface);
if (g_cancellable_is_cancelled (cancellable)) {
result = SQLITE_INTERRUPT;
@@ -2664,9 +2671,7 @@ db_cursor_iter_next (TrackerDBCursor *cursor,
cursor->finished = (result != SQLITE_ROW);
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
}
return (!cursor->finished);
@@ -2713,17 +2718,16 @@ gint64
tracker_db_cursor_get_int (TrackerDBCursor *cursor,
guint column)
{
+ TrackerDBInterface *iface;
gint64 result;
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
result = (gint64) sqlite3_column_int64 (cursor->stmt, column);
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
return result;
}
@@ -2732,17 +2736,16 @@ gdouble
tracker_db_cursor_get_double (TrackerDBCursor *cursor,
guint column)
{
+ TrackerDBInterface *iface;
gdouble result;
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
result = (gdouble) sqlite3_column_double (cursor->stmt, column);
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
return result;
}
@@ -2759,20 +2762,19 @@ TrackerSparqlValueType
tracker_db_cursor_get_value_type (TrackerDBCursor *cursor,
guint column)
{
+ TrackerDBInterface *iface;
gint column_type;
gint n_columns = sqlite3_column_count (cursor->stmt);
g_return_val_if_fail (column < n_columns, TRACKER_SPARQL_VALUE_TYPE_UNBOUND);
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
column_type = sqlite3_column_type (cursor->stmt, column);
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
if (column_type == SQLITE_NULL) {
return TRACKER_SPARQL_VALUE_TYPE_UNBOUND;
@@ -2800,11 +2802,12 @@ const gchar*
tracker_db_cursor_get_variable_name (TrackerDBCursor *cursor,
guint column)
{
+ TrackerDBInterface *iface;
const gchar *result;
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
if (column < cursor->n_variable_names) {
result = cursor->variable_names[column];
@@ -2812,9 +2815,7 @@ tracker_db_cursor_get_variable_name (TrackerDBCursor *cursor,
result = sqlite3_column_name (cursor->stmt, column);
}
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
return result;
}
@@ -2824,11 +2825,12 @@ tracker_db_cursor_get_string (TrackerDBCursor *cursor,
guint column,
glong *length)
{
+ TrackerDBInterface *iface;
const gchar *result;
- if (cursor->threadsafe) {
- tracker_db_manager_lock ();
- }
+ iface = cursor->ref_stmt->db_interface;
+
+ tracker_db_interface_lock (iface);
if (length) {
sqlite3_value *val = sqlite3_column_value (cursor->stmt, column);
@@ -2839,9 +2841,7 @@ tracker_db_cursor_get_string (TrackerDBCursor *cursor,
result = (const gchar *) sqlite3_column_text (cursor->stmt, column);
}
- if (cursor->threadsafe) {
- tracker_db_manager_unlock ();
- }
+ tracker_db_interface_unlock (iface);
return result;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]