1 from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
2 from tempfile import gettempdir
7 if os.access('/var/run/lock', os.W_OK):
8 lock_dir = '/var/run/lock'
10 lock_dir = gettempdir()
12 if hasattr(os, 'getuid'):
13 suffix = '-%d' % os.getuid()
17 lock_fname = os.path.join(lock_dir, 'm_librarian%s.lock' % suffix)
22 lock_file = open(lock_fname, 'r')
23 except IOError: # no lock file
27 flock(lock_file, LOCK_EX | LOCK_NB)
28 except IOError: # locked
29 port = int(lock_file.readline())
33 flock(lock_file, LOCK_UN)
36 lock_file = open(lock_fname, 'w')
37 lock_file.write(str(port))
39 lock_file = open(lock_fname, 'r')
40 flock(lock_file, LOCK_EX | LOCK_NB)
41 return lock_file, None
44 def close_lock(lock_file):
45 flock(lock_file, LOCK_UN)
47 lock_file = open(lock_fname, 'w')
54 # https://stackoverflow.com/a/2838309/7976758
55 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
58 port = s.getsockname()[1]