summaryrefslogtreecommitdiff
path: root/jimbrella/lockfile.py
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2022-02-02 11:15:09 +0800
committerFrederick Yin <fkfd@fkfd.me>2022-02-02 11:15:09 +0800
commit66264fe5730943576b847077dadf5e4531d4beb1 (patch)
treedb4b4d1dddd5cd6604e96715bf5c5e0d14fa35ac /jimbrella/lockfile.py
parent02547e6078a7cd6c1371379f1bab72bf48add23d (diff)
Adapt core to new db
Diffstat (limited to 'jimbrella/lockfile.py')
-rw-r--r--jimbrella/lockfile.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/jimbrella/lockfile.py b/jimbrella/lockfile.py
new file mode 100644
index 0000000..987f0e3
--- /dev/null
+++ b/jimbrella/lockfile.py
@@ -0,0 +1,33 @@
+import os
+
+
+class Lockfile:
+ """Prevent unwanted concurrency for file I/O.
+
+ For a file named "<file>", create or remove a lockfile named "<file>.lock".
+
+ When a process is modifying the file, call `lock(). When the modification
+ is done, call `unlock()`.
+ """
+
+ def __init__(self, filepath):
+ self.filepath = str(filepath)
+ self.lockpath = self.filepath + ".lock"
+
+ def lock(self):
+ """Continue attempting to lock until locked."""
+ locked = False
+ while not locked:
+ try:
+ f = open(self.lockpath, "x")
+ f.close()
+ locked = True
+ except FileExistsError:
+ continue
+
+ def unlock(self):
+ """Remove lockfile."""
+ try:
+ os.remove(self.lockpath)
+ except FileNotFoundError:
+ return