def _do_io(self, **kwargs):
"""Read or write to the given file descriptor"""
fd = kwargs.pop("fd", None)
write = kwargs.pop("write", False)
offset = kwargs.pop("offset", 0)
size = kwargs.pop("size", 0)
fileobj = kwargs.pop("fileobj", None)
lockfull = kwargs.pop("lockfull", True)
lockout = None
if self.iodelay > 0.0:
time.sleep(self.iodelay)
# Set file offset to read/write
os.lseek(fd, offset, os.SEEK_SET)
if write:
if self.random and not lockfull:
# Lock file segment
lockout = self._getlock(fileobj.name, fd, lock_type=fcntl.F_WRLCK, offset=offset, length=size)
data = 'x' * size
self._dprint("DBG5", "WRITE %s %d @ %d" % (fileobj.name, size, offset))
if self.direct:
# Direct I/O -- use native write function
count = self.libc.write(fd, self.wbuffer, size)
else:
# Buffered I/O
count = os.write(fd, data)
if self._percent(self.fsync):
self._dprint("DBG4", "FSYNC %s" % fileobj.name)
self.nfsync += 1
os.fsync(fd)
self.nwrite += 1
self.wbytes += count
fsize = offset + count
if fileobj.size < fsize:
fileobj.size = fsize
else:
if self.random and not lockfull:
# Lock file segment
lockout = self._getlock(fileobj.name, fd, lock_type=fcntl.F_RDLCK, offset=offset, length=size)
self._dprint("DBG5", "READ %s %d @ %d" % (fileobj.name, size, offset))
if self.direct:
# Direct I/O -- use native read function
count = self.libc.read(fd, self.rbuffer, size)
else:
# Buffered I/O
data = os.read(fd, size)
count = len(data)
self.rbytes += count
self.nread += 1
if self.random and not lockfull:
# Unlock file segment
self._getlock(fileobj.name, fd, lock_type=fcntl.F_UNLCK, offset=offset, length=size, lock=lockout)
return count
评论列表
文章目录