move the code for single-instance check into its own file

This commit is contained in:
Daniel Pavel 2013-04-28 14:06:41 +02:00
parent f5d2eba0c4
commit 1a9be279c6
2 changed files with 51 additions and 31 deletions

47
lib/solaar/appinstance.py Normal file
View File

@ -0,0 +1,47 @@
#
#
#
from __future__ import absolute_import, division, print_function, unicode_literals
#
#
#
import fcntl as _fcntl
import os.path as _path
import os as _os
def check():
# ensure no more than a single instance runs at a time
lock_fd = None
for p in _os.environ.get('XDG_RUNTIME_DIR'), '/run/lock', '/var/lock', _os.environ.get('TMPDIR', '/tmp'):
if p and _path.isdir(p) and _os.access(p, _os.W_OK):
lock_path = _path.join(p, 'solaar.single-instance.%d' % _os.getuid())
try:
lock_fd = open(lock_path, 'wb')
# print ("Single instance lock file is %s" % lock_path)
break
except:
pass
if lock_fd:
try:
_fcntl.flock(lock_fd, _fcntl.LOCK_EX | _fcntl.LOCK_NB)
return lock_fd
except IOError as e:
if e.errno == 11:
import sys
sys.exit("solaar: error: Solaar is already running.")
else:
raise
else:
import sys
print ("solaar: warning: failed to create single instance lock file, ignoring.", file=sys.stderr)
def close(lock_fd):
if lock_fd:
_fcntl.flock(lock_fd, _fcntl.LOCK_UN)
lock_fd.close()

View File

@ -125,40 +125,13 @@ def main():
_require('gi.repository.Gtk', 'gir1.2-gtk-3.0')
args = _parse_arguments()
# ensure no more than a single instance runs at a time
import os.path as _path
import os as _os
lock_fd = None
for p in _os.environ.get('XDG_RUNTIME_DIR'), '/run/lock', '/var/lock', _os.environ.get('TMPDIR', '/tmp'):
if p and _path.isdir(p) and _os.access(p, _os.W_OK):
lock_path = _path.join(p, 'solaar.single-instance.%d' % _os.getuid())
try:
lock_fd = open(lock_path, 'wb')
# print ("Single instance lock file is %s" % lock_path)
break
except:
pass
if lock_fd:
import fcntl as _fcntl
try:
_fcntl.flock(lock_fd, _fcntl.LOCK_EX | _fcntl.LOCK_NB)
except IOError as e:
if e.errno == 11:
import sys
sys.exit("solaar: error: Solaar is already running.")
else:
raise
else:
import sys
print ("solaar: warning: failed to create single instance lock file, ignoring.", file=sys.stderr)
from . import appinstance
appid = appinstance.check()
try:
_run(args)
finally:
if lock_fd:
_fcntl.flock(lock_fd, _fcntl.LOCK_UN)
lock_fd.close()
appinstance.close(appid)
if __name__ == '__main__':
main()