|
David Janes
davidjanes at blogmatrix.com
Tue Nov 27 14:06:03 EST 2007
Here's what I'm experimenting with right now -- I'm subclassing
FileSession and overriding all the lock methods. Obviously this will
have to be adapted for people not working in the FileSession world.
Regards, etc...
class BMFileSession(Session.FileSession):
def __init__(self, req, sid = None):
self.bm_lockf = None
... more init stuff ...
def lock(self):
if self._lock:
self.bm_lock(self._req.server, self._sid)
self._locked = 1
self._req.register_cleanup(Session.unlock_session_cleanup, self)
def unlock(self):
if self._lock and self._locked:
self.bm_unlock(self._req.server, self._sid)
self._locked = 0
def lock_file(self):
if not self._locked:
self.bm_lock(self._req.server, self._sid)
self._locked = 1
def unlock_file(self):
if self._locked and not self._lock:
self.bm_unlock(self._req.server, self._sid)
self._locked = 0
def bm_lockfile(self, sid):
lockdir = os.path.join(self._sessdir, sid[:2])
if not os.path.exists(lockdir):
os.makedirs(lockdir)
return os.path.join(lockdir, sid)
def bm_lock(self, server, sid):
if self.bm_lockf:
try: self.bm_lockf.close()
except: pass
self.bm_lockf = open(self.bm_lockfile(sid), 'a+')
fcntl.lockf(self.bm_lockf, fcntl.LOCK_EX)
def bm_unlock(self, server, sid):
if self.bm_lockf:
fcntl.lockf(self.bm_lockf, fcntl.LOCK_UN)
try: self.bm_lockf.close()
except: pass
self.bm_lockf = None
|