Mercurial > templog
diff web/atomicfile.py @ 191:8318d50d766d
gets current params
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Tue, 11 Feb 2014 22:10:32 +0800 |
parents | |
children | 6dd157a12035 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/atomicfile.py Tue Feb 11 22:10:32 2014 +0800 @@ -0,0 +1,46 @@ +import os +import time +import fcntl +import sys + +class AtomicFile(object): + DELAY = 0.5 + def __init__(self, name): + self.name = name + + def write(self, data, timeout = 5): + try: + end = time.time() + timeout + with open(self.name, "r+") as f: + while timeout == 0 or time.time() < end: + try: + fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError: + time.sleep(DELAY) + continue + + f.write(data) + return True + + except IOError, e: + print>>sys.stderr, e + + return False + + def read(self, timeout = 5): + try: + end = time.time() + timeout + with open(self.name, "r") as f: + while timeout == 0 or time.time() < end: + try: + fcntl.lockf(f, fcntl.LOCK_SH | fcntl.LOCK_NB) + except IOError: + time.sleep(DELAY) + continue + + return f.read() + + except IOError, e: + print>>sys.stderr, e + + return None