Fix F_FULLFSYNC on PyPy + Fallback if unsupported
This commit is contained in:
parent
7e29d9b5c3
commit
4d4c3bda75
@ -88,6 +88,10 @@ if sys.platform == "linux":
|
|||||||
ctypes.c_uint]
|
ctypes.c_uint]
|
||||||
renameat2.restype = ctypes.c_int
|
renameat2.restype = ctypes.c_int
|
||||||
|
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
# Definition missing in PyPy
|
||||||
|
F_FULLFSYNC: int = getattr(fcntl, "F_FULLFSYNC", 51)
|
||||||
|
|
||||||
|
|
||||||
class RwLock:
|
class RwLock:
|
||||||
"""A readers-Writer lock that locks a file."""
|
"""A readers-Writer lock that locks a file."""
|
||||||
@ -193,10 +197,15 @@ def rename_exchange(src: str, dst: str) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def fsync(fd: int) -> None:
|
def fsync(fd: int) -> None:
|
||||||
if sys.platform != "win32" and hasattr(fcntl, "F_FULLFSYNC"):
|
if sys.platform == "darwin":
|
||||||
fcntl.fcntl(fd, fcntl.F_FULLFSYNC)
|
try:
|
||||||
else:
|
fcntl.fcntl(fd, F_FULLFSYNC)
|
||||||
os.fsync(fd)
|
return
|
||||||
|
except OSError as e:
|
||||||
|
# Fallback if F_FULLFSYNC not supported by filesystem
|
||||||
|
if e.errno != errno.EINVAL:
|
||||||
|
raise
|
||||||
|
os.fsync(fd)
|
||||||
|
|
||||||
|
|
||||||
def strip_path(path: str) -> str:
|
def strip_path(path: str) -> str:
|
||||||
|
Loading…
Reference in New Issue
Block a user