Eray'ın bahsettiği lock sorunu ile ilgili hızlı-kirli bir çözüm. Bunun
üzerinden yileştirme yaparız.
This commit is contained in:
+20
-6
@@ -10,6 +10,7 @@
|
|||||||
#from bsddb.dbshelve import DBShelf
|
#from bsddb.dbshelve import DBShelf
|
||||||
import bsddb.dbshelve as shelve
|
import bsddb.dbshelve as shelve
|
||||||
import os, fcntl
|
import os, fcntl
|
||||||
|
import atexit
|
||||||
|
|
||||||
import util
|
import util
|
||||||
from config import config
|
from config import config
|
||||||
@@ -27,14 +28,15 @@ class PackageDB(object):
|
|||||||
self.d = shelve.open(self.fname)
|
self.d = shelve.open(self.fname)
|
||||||
self.fname2 = os.path.join(config.db_dir(), 'revdep-%s.bdb' % id )
|
self.fname2 = os.path.join(config.db_dir(), 'revdep-%s.bdb' % id )
|
||||||
self.dr = shelve.open(self.fname2)
|
self.dr = shelve.open(self.fname2)
|
||||||
self.fdummy = file(self.fname + '.lock', 'w')
|
|
||||||
|
self.lockfile = self.fname + '.lock'
|
||||||
|
if os.path.exists(self.lockfile):
|
||||||
|
# buraya hic bir zaman gelmemesi gerekiyor.
|
||||||
|
raise PackageDBError, "Lock file exists. Something is wrong!"
|
||||||
|
|
||||||
|
self.fdummy = file(self.lockfile, 'w')
|
||||||
fcntl.flock(self.fdummy, fcntl.LOCK_EX)
|
fcntl.flock(self.fdummy, fcntl.LOCK_EX)
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
#fcntl.flock(self.fdummy, fcntl.LOCK_UN)
|
|
||||||
self.fdummy.close()
|
|
||||||
#os.unlink(self.fname + '.lock')
|
|
||||||
|
|
||||||
def has_package(self, name):
|
def has_package(self, name):
|
||||||
name = str(name)
|
name = str(name)
|
||||||
return self.d.has_key(name)
|
return self.d.has_key(name)
|
||||||
@@ -72,6 +74,7 @@ packagedbs = {}
|
|||||||
|
|
||||||
def add_db(name):
|
def add_db(name):
|
||||||
packagedbs[name] = PackageDB('repo-' + name)
|
packagedbs[name] = PackageDB('repo-' + name)
|
||||||
|
atexit.register(close, packagedbs[name])
|
||||||
|
|
||||||
def get_db(name):
|
def get_db(name):
|
||||||
return packagedbs[name]
|
return packagedbs[name]
|
||||||
@@ -102,6 +105,17 @@ def get_rev_deps(name):
|
|||||||
repo = which_repo(name)
|
repo = which_repo(name)
|
||||||
return get_db(repo).get_rev_deps(name)
|
return get_db(repo).get_rev_deps(name)
|
||||||
|
|
||||||
|
def close(pkg_db):
|
||||||
|
try:
|
||||||
|
fcntl.flock(pkg_db.fdummy, fcntl.LOCK_UN)
|
||||||
|
pkg_db.fdummy.close()
|
||||||
|
os.unlink(pkg_db.lockfile)
|
||||||
|
except ValueError:
|
||||||
|
# packagedb allready closed.
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
#def remove_package
|
#def remove_package
|
||||||
|
|
||||||
inst_packagedb = PackageDB('local')
|
inst_packagedb = PackageDB('local')
|
||||||
|
atexit.register(close, inst_packagedb)
|
||||||
|
|||||||
Reference in New Issue
Block a user