diff web/atomicfile.py @ 489:46e327c00246

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