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