[darwinbuild-changes] [397] trunk/darwinup

source_changes at macosforge.org source_changes at macosforge.org
Fri Oct 24 00:35:49 PDT 2008


Revision: 397
          http://trac.macosforge.org/projects/darwinbuild/changeset/397
Author:   kvv at apple.com
Date:     2008-10-24 00:35:48 -0700 (Fri, 24 Oct 2008)
Log Message:
-----------
use flock(2) to serialize Depot access

Modified Paths:
--------------
    trunk/darwinup/Depot.cpp
    trunk/darwinup/Depot.h

Modified: trunk/darwinup/Depot.cpp
===================================================================
--- trunk/darwinup/Depot.cpp	2008-10-24 05:42:44 UTC (rev 396)
+++ trunk/darwinup/Depot.cpp	2008-10-24 07:35:48 UTC (rev 397)
@@ -45,6 +45,7 @@
 	m_database_path = NULL;
 	m_archives_path = NULL;
 	m_db = NULL;
+	m_lock_fd = -1;
 }
 
 Depot::Depot(const char* prefix) {
@@ -55,6 +56,8 @@
 	mkdir(m_depot_path,    m_depot_mode);
 	mkdir(m_archives_path, m_depot_mode);
 
+	(void)this->lock(LOCK_SH);
+
 	int exists = is_regular_file(m_database_path);
 
 	int res = sqlite3_open(m_database_path, &m_db);
@@ -73,6 +76,7 @@
 }
 
 Depot::~Depot() {
+	if (m_lock_fd != -1)	this->unlock();
 	if (m_db)		sqlite3_close(m_db);
 	if (m_depot_path)	free(m_depot_path);
 	if (m_database_path)	free(m_database_path);
@@ -454,6 +458,8 @@
 //	res = this->check_consistency();
 //	if (res != 0) return res;
 
+	res = this->lock(LOCK_EX);
+	if (res != 0) return res;
 
 	//
 	// The fun starts here
@@ -530,6 +536,8 @@
 	if (rollback_path) free(rollback_path);
 	if (archive_path) free(archive_path);
 	
+	(void)this->lock(LOCK_SH);
+
 	return res;
 }
 
@@ -652,6 +660,9 @@
 //	res = this->check_consistency();
 //	if (res != 0) return res;
 
+	res = this->lock(LOCK_EX);
+	if (res != 0) return res;
+
 	// XXX: this may be superfluous
 	// uninstall_file should be smart enough to do a mtime check...
 	if (res == 0) res = this->prune_directories();
@@ -682,6 +693,8 @@
 
 	if (res == 0) res = prune_archives();
 
+	(void)this->lock(LOCK_SH);
+
 	return res;
 }
 
@@ -920,6 +933,33 @@
 	return this->SQL("COMMIT TRANSACTION");
 }
 
+int Depot::lock(int operation) {
+	int res = 0;
+	if (m_lock_fd == -1) {
+		m_lock_fd = open(m_depot_path, O_RDONLY);
+		if (m_lock_fd == -1) {
+			perror(m_depot_path);
+			res = -1;
+		}
+	}
+	res = flock(m_lock_fd, operation);
+	if (res == -1) {
+		perror(m_depot_path);
+	}
+	return res;
+}
+
+int Depot::unlock(void) {
+	int res = 0;
+	res = flock(m_lock_fd, LOCK_UN);
+	if (res == -1) {
+		perror(m_depot_path);
+	}
+	close(m_lock_fd);
+	m_lock_fd = -1;
+	return res;
+}
+
 int Depot::insert(Archive* archive) {
 	// Don't insert an archive that is already in the database
 	assert(archive->serial() == 0);

Modified: trunk/darwinup/Depot.h
===================================================================
--- trunk/darwinup/Depot.h	2008-10-24 05:42:44 UTC (rev 396)
+++ trunk/darwinup/Depot.h	2008-10-24 07:35:48 UTC (rev 397)
@@ -72,6 +72,10 @@
 
 	protected:
 
+	// Serialize access to the Depot via flock(2).
+	int lock(int operation);
+	int unlock(void);
+
 	// Inserts an Archive into the database.
 	// This modifies the Archive's serial number.
 	// If the Archive already has a serial number, it cannot be inserted.
@@ -109,4 +113,5 @@
 	char*		m_depot_path;
 	char*		m_database_path;
 	char*		m_archives_path;
+	int		m_lock_fd;
 };
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20081024/4530c364/attachment-0001.html>


More information about the darwinbuild-changes mailing list