[tracker/wip/carlosg/interface-race-condition: 1/2] libtracker-data: Generalize DB interface usage accounting
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/interface-race-condition: 1/2] libtracker-data: Generalize DB interface usage accounting
- Date: Sun, 21 Feb 2021 13:19:30 +0000 (UTC)
commit 947aff543b5fa52408c2e459b898f07b933b74d3
Author: Carlos Garnacho <carlosg gnome org>
Date: Sun Feb 21 13:17:05 2021 +0100
libtracker-data: Generalize DB interface usage accounting
We'll want additional users of this, so generalize the
tracker_db_interface_get_is_used() accounting and make it internal
API.
src/libtracker-data/tracker-db-interface-sqlite.c | 27 +++++++++++++++++------
src/libtracker-data/tracker-db-interface-sqlite.h | 3 +++
2 files changed, 23 insertions(+), 7 deletions(-)
---
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c
b/src/libtracker-data/tracker-db-interface-sqlite.c
index ca058b510..47fb8dfa4 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -84,8 +84,8 @@ struct TrackerDBInterface {
/* Compiled regular expressions */
TrackerDBReplaceFuncChecks replace_func_checks;
- /* Number of active cursors */
- gint n_active_cursors;
+ /* Number of users (e.g. active cursors) */
+ gint n_users;
guint flags;
GCancellable *cancellable;
@@ -2891,7 +2891,7 @@ execute_stmt (TrackerDBInterface *interface,
result = SQLITE_OK;
- g_atomic_int_inc (&interface->n_active_cursors);
+ tracker_db_interface_ref_use (interface);
#ifdef G_ENABLE_DEBUG
if (TRACKER_DEBUG_CHECK (SQL_STATEMENTS)) {
@@ -2934,7 +2934,7 @@ execute_stmt (TrackerDBInterface *interface,
}
}
- g_atomic_int_add (&interface->n_active_cursors, -1);
+ tracker_db_interface_unref_use (interface);
if (result != SQLITE_DONE) {
/* This is rather fatal */
@@ -3121,12 +3121,13 @@ tracker_db_cursor_close (TrackerDBCursor *cursor)
iface = cursor->ref_stmt->db_interface;
g_object_ref (iface);
- g_atomic_int_add (&iface->n_active_cursors, -1);
tracker_db_interface_lock (iface);
g_clear_pointer (&cursor->ref_stmt, tracker_db_statement_sqlite_release);
tracker_db_interface_unlock (iface);
+ tracker_db_interface_unref_use (iface);
+
g_object_unref (iface);
}
@@ -3244,7 +3245,7 @@ tracker_db_cursor_sqlite_new (TrackerDBStatement *ref_stmt,
TrackerDBInterface *iface;
iface = ref_stmt->db_interface;
- g_atomic_int_inc (&iface->n_active_cursors);
+ tracker_db_interface_ref_use (iface);
#ifdef G_ENABLE_DEBUG
if (TRACKER_DEBUG_CHECK (SQL_STATEMENTS)) {
@@ -3733,10 +3734,22 @@ tracker_db_interface_get_user_data (TrackerDBInterface *db_interface)
return db_interface->user_data;
}
+void
+tracker_db_interface_ref_use (TrackerDBInterface *db_interface)
+{
+ g_atomic_int_inc (&db_interface->n_users);
+}
+
+gboolean
+tracker_db_interface_unref_use (TrackerDBInterface *db_interface)
+{
+ return g_atomic_int_dec_and_test (&db_interface->n_users);
+}
+
gboolean
tracker_db_interface_get_is_used (TrackerDBInterface *db_interface)
{
- return g_atomic_int_get (&db_interface->n_active_cursors) > 0;
+ return g_atomic_int_get (&db_interface->n_users) > 0;
}
gboolean
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.h
b/src/libtracker-data/tracker-db-interface-sqlite.h
index 6a8ffb235..c90e5a02f 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.h
+++ b/src/libtracker-data/tracker-db-interface-sqlite.h
@@ -95,6 +95,9 @@ gboolean tracker_db_interface_detach_database (TrackerD
GError **error);
gssize tracker_db_interface_sqlite_release_memory (TrackerDBInterface
*db_interface);
+void tracker_db_interface_ref_use (TrackerDBInterface *db_interface);
+gboolean tracker_db_interface_unref_use (TrackerDBInterface *db_interface);
+
G_END_DECLS
#endif /* __LIBTRACKER_DB_INTERFACE_SQLITE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]