[tracker/tracker-0.10] libtracker-direct: Support multiple direct connection objects



commit e85816a84c3e36476e17d3d9b5ade267f9113e99
Author: Jürg Billeter <j bitron ch>
Date:   Thu May 19 09:34:28 2011 +0200

    libtracker-direct: Support multiple direct connection objects
    
    If Tracker.Sparql.Connection.get is called after singleton is set to
    null in dispose and before backend object is finalized, multiple direct
    connection objects may exist at the same time.
    
    The first instance initializes libtracker-data, the last instance shuts
    it down.

 src/libtracker-direct/tracker-direct.vala |   44 +++++++++++++++++------------
 1 files changed, 26 insertions(+), 18 deletions(-)
---
diff --git a/src/libtracker-direct/tracker-direct.vala b/src/libtracker-direct/tracker-direct.vala
index 49808e2..3ad7dce 100644
--- a/src/libtracker-direct/tracker-direct.vala
+++ b/src/libtracker-direct/tracker-direct.vala
@@ -18,35 +18,43 @@
  */
 
 public class Tracker.Direct.Connection : Tracker.Sparql.Connection {
-	// only single connection is currently supported per process
-	static bool initialized;
+	static int use_count;
 
 	public Connection () throws Sparql.Error, IOError, DBusError {
-		if (initialized) {
-			
-		}
+		DBManager.lock ();
 
-		uint select_cache_size = 100;
-		string env_cache_size = Environment.get_variable ("TRACKER_SPARQL_CACHE_SIZE");
+		try {
+			if (use_count == 0) {
+				uint select_cache_size = 100;
+				string env_cache_size = Environment.get_variable ("TRACKER_SPARQL_CACHE_SIZE");
 
-		if (env_cache_size != null) {
-			select_cache_size = int.parse (env_cache_size);
-		}
+				if (env_cache_size != null) {
+					select_cache_size = int.parse (env_cache_size);
+				}
 
-		try {
-			Data.Manager.init (DBManagerFlags.READONLY, null, null, false, select_cache_size, 0, null, null);
-		} catch (DBInterfaceError e) {
+				Data.Manager.init (DBManagerFlags.READONLY, null, null, false, select_cache_size, 0, null, null);
+			}
+
+			use_count++;
+		} catch (Error e) {
 			throw new Sparql.Error.INTERNAL (e.message);
+		} finally {
+			DBManager.unlock ();
 		}
-
-		initialized = true;
 	}
 
 	~Connection () {
 		// Clean up connection
-		if (initialized) {
-			Data.Manager.shutdown ();
-			initialized = false;
+		DBManager.lock ();
+
+		try {
+			use_count--;
+
+			if (use_count == 0) {
+				Data.Manager.shutdown ();
+			}
+		} finally {
+			DBManager.unlock ();
 		}
 	}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]