[tracker/wip/carlosg/interface-race-condition: 1/2] libtracker-data: Generalize DB interface usage accounting




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]