Skip to content

Commit 27bb4b8

Browse files
authored
Merge pull request #30 from drougge/xmpfix
Fix race in xmp.py (Closes: #18)
2 parents 373ff17 + d2e922b commit 27bb4b8

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

example/xmp.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
# See the file COPYING.
88
#
99

10+
from __future__ import print_function
11+
1012
import os, sys
1113
from errno import *
1214
from stat import *
1315
import fcntl
16+
from threading import Lock
1417
# pull in some spaghetti to make this stuff work without fuse-py being installed
1518
try:
1619
import _find_fuse_parts
@@ -166,15 +169,32 @@ def __init__(self, path, flags, *mode):
166169
self.file = os.fdopen(os.open("." + path, flags, *mode),
167170
flag2mode(flags))
168171
self.fd = self.file.fileno()
172+
if hasattr(os, 'pread'):
173+
self.iolock = None
174+
else:
175+
self.iolock = Lock()
169176

170177
def read(self, length, offset):
171-
self.file.seek(offset)
172-
return self.file.read(length)
178+
if self.iolock:
179+
self.iolock.acquire()
180+
try:
181+
self.file.seek(offset)
182+
return self.file.read(length)
183+
finally:
184+
self.iolock.release()
185+
else:
186+
return os.pread(self.fd, length, offset)
173187

174188
def write(self, buf, offset):
175-
self.file.seek(offset)
176-
self.file.write(buf)
177-
return len(buf)
189+
if self.iolock:
190+
self.iolock.acquire()
191+
try:
192+
self.file.seek(offset)
193+
return self.file.write(buf)
194+
finally:
195+
self.iolock.release()
196+
else:
197+
return os.pwrite(self.fd, buf, offset)
178198

179199
def release(self, flags):
180200
self.file.close()

0 commit comments

Comments
 (0)