[TIC-CORE] Support for multiple request processing
[archive/20170607/tools/tic-core.git] / tic / utils / file.py
index b1cf3ac..050118f 100644 (file)
@@ -24,9 +24,36 @@ import gzip
 import os
 import shutil
 
-def make_dirs(dirname):
+class FileLockException(Exception):
+    pass
+class FileLock(object):
+    def __init__(self, file_name, timeout=10, delay=.05):
+        self.is_locked = False
+        self.lockfile = os.path.join(os.getcwd(), "%s.lock" % file_name)
+        self.file_name = file_name
+        self.timeout = timeout
+        self.delay = delay
+    def acquire(self):
+        self.fd = os.open(self.lockfile, os.O_CREAT|os.O_EXCL|os.O_RDWR)
+        self.is_locked = True
+    def release(self):
+        if self.is_locked:
+            os.close(self.fd)
+            os.unlink(self.lockfile)
+            self.is_locked = False
+    def __enter__(self):
+        if not self.is_locked:
+            self.acquire()
+        return self
+    def __exit__(self, type, value, traceback):
+        if self.is_locked:
+            self.release()
+    def __del__(self):
+        self.release()
+
+def make_dirs(path):
     try:
-        os.makedirs(dirname)
+        os.makedirs(path)
     except OSError as err:
         if err.errno != errno.EEXIST:
             raise
@@ -36,7 +63,7 @@ def write(path, data):
     make_dirs(os.path.dirname(path))
     with(open(path, 'w')) as f:
         f.write(data)
-        
+
 def decompress_gzip(intput_path, output_path):
     with(gzip.open(intput_path, 'rb')) as fobj:
         f = open(output_path, 'wb')
@@ -44,6 +71,17 @@ def decompress_gzip(intput_path, output_path):
         f.close()
     return output_path
 
+def copyfile_flock(src, dest):
+    ret = dest;
+    try:
+        with FileLock(dest):
+            shutil.copy(src, dest)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            print(e)
+        ret = src
+    return ret
+
 def copyfile(src, dst, filename=None):
     abs_dst=os.path.abspath(os.path.expanduser(dst))
     make_dirs(abs_dst)