X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=m_librarian%2Fweb%2Futils.py;h=12be81f47dc572482043dc922c42fea9db637495;hb=82c31a9970bf49bbb13b018ce133faba6f369461;hp=2efe724a6bdf8fcfb10a9e7e1c4ce9d0ca877de8;hpb=2d76928b93c208d27f942b9a9eb649df1d5b2192;p=m_librarian.git diff --git a/m_librarian/web/utils.py b/m_librarian/web/utils.py index 2efe724..12be81f 100644 --- a/m_librarian/web/utils.py +++ b/m_librarian/web/utils.py @@ -1,7 +1,48 @@ +from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB +from os import path, remove +import socket + + +lock_fname = path.join( + path.dirname(path.dirname(path.dirname(__file__))), + 'tmp', 'm_librarian.lock') + + +def get_lock(port): + try: + lock_file = open(lock_fname, 'r') + except IOError: # no lock file + pass + else: + try: + flock(lock_file, LOCK_EX | LOCK_NB) + except IOError: # locked + port = int(lock_file.readline()) + lock_file.close() + return None, port + else: + flock(lock_file, LOCK_UN) + lock_file.close() + + lock_file = open(lock_fname, 'w') + lock_file.write(str(port)) + lock_file.close() + lock_file = open(lock_fname, 'r') + flock(lock_file, LOCK_EX | LOCK_NB) + return lock_file, None + + +def close_lock(lock_file): + flock(lock_file, LOCK_UN) + lock_file.close() + lock_file = open(lock_fname, 'w') + lock_file.write('') + lock_file.close() + remove(lock_fname) + def get_open_port(): # https://stackoverflow.com/a/2838309/7976758 - import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) # s.listen(1)