Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Ad a pkgdb_downgrade_lock() to go from EXCLUSIVE to ADVISORY
Bryan Drewery committed 11 years ago
commit b2b732362d4e89e8afc6dc6e6973e487c51820e7
parent 8f6bf42
3 files changed +24 -0
modified libpkg/libpkg.ver
@@ -278,6 +278,7 @@ global:
	pkgdb_cmd;
	pkgdb_compact;
	pkgdb_delete_annotation;
+
	pkgdb_downgrade_lock;
	pkgdb_dump;
	pkgdb_end_solver;
	pkgdb_file_set_cksum;
modified libpkg/pkg.h.in
@@ -1004,6 +1004,8 @@ int pkgdb_open_all(struct pkgdb **db, pkgdb_t type, const char *reponame);
 */
int pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type);
int pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_type);
+
int pkgdb_downgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type,
+
    pkgdb_lock_t new_type);
int pkgdb_release_lock(struct pkgdb *db, pkgdb_lock_t type);

/**
modified libpkg/pkgdb.c
@@ -4480,6 +4480,27 @@ pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_typ
}

int
+
pkgdb_downgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type,
+
    pkgdb_lock_t new_type)
+
{
+
	const char downgrade_exclusive_lock_sql[] = ""
+
		"UPDATE pkg_lock SET exclusive=0,advisory=1 WHERE exclusive=1 "
+
		"AND advisory=1 AND read=0;";
+
	int ret = EPKG_FATAL;
+

+
	assert(db != NULL);
+

+
	if (old_type == PKGDB_LOCK_EXCLUSIVE &&
+
	    new_type == PKGDB_LOCK_ADVISORY) {
+
		pkg_debug(1, "want to downgrade exclusive to advisory lock");
+
		ret = pkgdb_try_lock(db, downgrade_exclusive_lock_sql,
+
		    new_type, true);
+
	}
+

+
	return (ret);
+
}
+

+
int
pkgdb_release_lock(struct pkgdb *db, pkgdb_lock_t type)
{
	const char readonly_unlock_sql[] = ""