diff --git a/src/libprs500/__init__.py b/src/libprs500/__init__.py index b227e3748f..f38ac46594 100644 --- a/src/libprs500/__init__.py +++ b/src/libprs500/__init__.py @@ -18,7 +18,8 @@ __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'libprs500' -import sys, os, logging, mechanize, locale, copy, cStringIO, re, subprocess, textwrap +import sys, os, logging, mechanize, locale, copy, cStringIO, re, subprocess, \ + textwrap, atexit from gettext import GNUTranslations from math import floor from optparse import OptionParser as _OptionParser @@ -409,3 +410,34 @@ def relpath(target, base=os.curdir): rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] return os.path.join(*rel_list) + +_lock_file = None +def singleinstance(name): + ''' + Return True if no other instance of the application identified by name is running, + False otherwise. + @param name: The name to lock. + @type name: string + ''' + if iswindows: + from win32event import CreateMutex + from win32api import CloseHandle, GetLastError + from winerror import ERROR_ALREADY_EXISTS + mutexname = 'mutexforsingleinstanceof'+__appname__+name + mutex = CreateMutex(None, False, mutexname) + if mutex: + atexit.register(CloseHandle, mutex) + return not GetLastError() == ERROR_ALREADY_EXISTS + else: + import fcntl + global _lock_file + path = os.path.expanduser('~/.'+__appname__+'_'+name+'.lock') + try: + f = open(path, 'w') + fcntl.lockf(f.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) + _lock_file = f + return True + except IOError: + return False + + return True diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py index fe98a5fe9a..36d0090f3a 100644 --- a/src/libprs500/gui2/main.py +++ b/src/libprs500/gui2/main.py @@ -1009,11 +1009,17 @@ class Main(MainWindow, Ui_MainWindow): def main(args=sys.argv): from PyQt4.Qt import QApplication + from libprs500 import singleinstance + pid = os.fork() if islinux else -1 if pid <= 0: app = QApplication(args) QCoreApplication.setOrganizationName(ORG_NAME) - QCoreApplication.setApplicationName(APP_UID) + QCoreApplication.setApplicationName(APP_UID) + if not singleinstance('main GUI'): + QMessageBox.critical(None, 'Cannot Start '+__appname__, + '

%s is already running.

'%__appname__) + return 1 initialize_file_icon_provider() try: main = Main() diff --git a/src/libprs500/library/database.py b/src/libprs500/library/database.py index 6d8c3f4be8..2abfd00af6 100644 --- a/src/libprs500/library/database.py +++ b/src/libprs500/library/database.py @@ -82,7 +82,7 @@ def _lock(path): def _connect(path): if isinstance(path, unicode): path = path.encode('utf-8') - _lock(path) + #_lock(path) conn = sqlite.connect(path, detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES) conn.row_factory = lambda cursor, row : list(row) conn.create_aggregate('concat', 1, Concatenate)