41
41
from bzrlib.trace import mutter, note, warning
42
42
from bzrlib.errors import LockError
44
44
class _base_Lock(object):
45
45
def _open(self, filename, filemode):
48
47
self.f = open(filename, filemode)
54
53
# maybe this is an old branch (before may 2005)
55
mutter("trying to create missing branch lock %r" % filename)
54
mutter("trying to create missing branch lock %r", filename)
57
self.f = open(filename, 'wb')
56
self.f = open(filename, 'wb+')
63
61
from warnings import warn
64
62
warn("lock on %r not released" % self.f)
69
66
raise NotImplementedError()
87
fcntl.flock(self.f, fcntl.LOCK_UN)
84
fcntl.lockf(self.f, fcntl.LOCK_UN)
92
88
class _fcntl_WriteLock(_fcntl_FileLock):
93
89
def __init__(self, filename):
90
# standard IO errors get exposed directly.
91
self._open(filename, 'wb')
95
fcntl.flock(self._open(filename, 'wb'), fcntl.LOCK_EX)
93
fcntl.lockf(self.f, fcntl.LOCK_EX)
95
# we should be more precise about whats a locking
96
# error and whats a random-other error
100
99
class _fcntl_ReadLock(_fcntl_FileLock):
101
101
def __init__(self, filename):
102
# standard IO errors get exposed directly.
103
self._open(filename, 'rb')
103
fcntl.flock(self._open(filename, 'rb'), fcntl.LOCK_SH)
105
fcntl.lockf(self.f, fcntl.LOCK_SH)
107
# we should be more precise about whats a locking
108
# error and whats a random-other error
105
109
raise LockError(e)
107
111
WriteLock = _fcntl_WriteLock
108
112
ReadLock = _fcntl_ReadLock
110
115
except ImportError:
112
117
import win32con, win32file, pywintypes
115
#LOCK_SH = 0 # the default
116
#LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
117
#LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
120
LOCK_SH = 0 # the default
121
LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
122
LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
119
124
class _w32c_FileLock(_base_Lock):
120
125
def _lock(self, filename, openmode, lockmode):
140
145
class _w32c_ReadLock(_w32c_FileLock):
141
146
def __init__(self, filename):
142
_w32c_FileLock._lock(self, filename, 'rb', 0)
147
_w32c_FileLock._lock(self, filename, 'rb',
144
150
class _w32c_WriteLock(_w32c_FileLock):
145
151
def __init__(self, filename):
146
152
_w32c_FileLock._lock(self, filename, 'wb',
147
win32con.LOCKFILE_EXCLUSIVE_LOCK)