1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
48
from bzrlib.hooks import Hooks
48
from bzrlib.hooks import HookPoint, Hooks
51
51
class LockHooks(Hooks):
53
53
def __init__(self):
54
Hooks.__init__(self, "bzrlib.lock", "Lock.hooks")
55
self.add_hook('lock_acquired',
56
"Called with a bzrlib.lock.LockResult when a physical lock is "
58
self.add_hook('lock_released',
59
"Called with a bzrlib.lock.LockResult when a physical lock is "
61
self.add_hook('lock_broken',
62
"Called with a bzrlib.lock.LockResult when a physical lock is "
55
self.create_hook(HookPoint('lock_acquired',
56
"Called with a bzrlib.lock.LockResult when a physical lock is "
57
"acquired.", (1, 8), None))
58
self.create_hook(HookPoint('lock_released',
59
"Called with a bzrlib.lock.LockResult when a physical lock is "
60
"released.", (1, 8), None))
61
self.create_hook(HookPoint('lock_broken',
62
"Called with a bzrlib.lock.LockResult when a physical lock is "
63
"broken.", (1, 15), None))
66
66
class Lock(object):
84
84
return self.lock_url == other.lock_url and self.details == other.details
86
86
def __repr__(self):
87
return '%s(%s, %s)' % (self.__class__.__name__,
87
return '%s(%s%s)' % (self.__class__.__name__,
88
88
self.lock_url, self.details)
91
class LogicalLockResult(object):
92
"""The result of a lock_read/lock_write/lock_tree_write call on lockables.
94
:ivar unlock: A callable which will unlock the lock.
97
def __init__(self, unlock):
101
return "LogicalLockResult(%s)" % (self.unlock)
105
91
def cant_unlock_not_held(locked_object):
106
92
"""An attempt to unlock failed because the object was not locked.
209
201
self._open(self.filename, 'rb+')
210
202
# reserve a slot for this lock - even if the lockf call fails,
211
# at this point unlock() will be called, because self.f is set.
203
# at thisi point unlock() will be called, because self.f is set.
212
204
# TODO: make this fully threadsafe, if we decide we care.
213
205
_fcntl_WriteLock._open_locks.add(self.filename)