# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
+# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from Singleton import Singleton
-
-import multiprocessing
-import time
-import socket
-
import os
import sys
-import threading
-import SocketServer
try:
import cPickle as pickle
except:
import pickle
-import struct
-import ctypes
-
import logging
def createLogger():
logger = logging.getLogger(__name__)
#
logger = createLogger()
-
-if sys.platform == 'win32':
- import multiprocessing.reduction # make sockets pickable/inheritable
-
-multiprocessing.freeze_support() # Add support for when a program which uses multiprocessing has been frozen to produce a Windows executable.
-
#------------------------------------
# A file locker (Linux only)
-import fcntl
-class PortManagerLock:
- def __init__(self, filename, readonly=False, blocking=True):
- # This will create it if it does not exist already
- logger.debug("Create lock on %s"%filename)
- self.__readonly = readonly
- self.__blocking = blocking
- self.__filename = filename
- flag = 'w'
- if self.__readonly:
- flag = 'r'
- self.handle = open(self.__filename, 'a+')
-
- def acquire(self):
- mode = fcntl.LOCK_EX
- if not self.__blocking: # Raise an IOError exception if file has already been locked
- mode = mode | fcntl.LOCK_NB
- fcntl.flock(self.handle, mode)
- logger.debug("lock acquired %s"%self.__blocking)
-
- def release(self):
- fcntl.flock(self.handle, fcntl.LOCK_UN)
- logger.debug("lock released")
-
- def __del__(self):
- logger.debug("Close lock file")
- self.handle.close()
- os.remove(self.__filename)
+def __acquire_lock(lock):
+ if sys.platform == "win32":
+ import msvcrt
+ # lock 1 byte: file is supposed to be zero-byte long
+ msvcrt.locking(lock.fileno(), msvcrt.LK_LOCK, 1)
+ else:
+ import fcntl
+ fcntl.flock(lock, fcntl.LOCK_EX)
+#
+def __release_lock(lock):
+ if sys.platform == "win32":
+ import msvcrt
+ msvcrt.locking(lock.fileno(), msvcrt.LK_UNLCK, 1)
+ else:
+ import fcntl
+ fcntl.flock(lock, fcntl.LOCK_UN)
#
def _getConfigurationFilename():
config_file, lock_file = _getConfigurationFilename()
with open(lock_file, 'w') as lock:
# acquire lock
- fcntl.flock(lock, fcntl.LOCK_EX)
+ __acquire_lock(lock)
# read config
config = {'busy_ports':[]}
pass
# release lock
- fcntl.flock(lock, fcntl.LOCK_UN)
+ __release_lock(lock)
logger.debug("get port: %s"%str(port))
return port
config_file, lock_file = _getConfigurationFilename()
with open(lock_file, 'w') as lock:
# acquire lock
- fcntl.flock(lock, fcntl.LOCK_EX)
+ __acquire_lock(lock)
# read config
config = {'busy_ports':[]}
pass
# release lock
- fcntl.flock(lock, fcntl.LOCK_UN)
+ __release_lock(lock)
logger.debug("released port port: %s"%str(port))
#
config_file, lock_file = _getConfigurationFilename()
with open(lock_file, 'w') as lock:
# acquire lock
- fcntl.flock(lock, fcntl.LOCK_EX)
+ __acquire_lock(lock)
# read config
config = {'busy_ports':[]}
busy_ports = config["busy_ports"]
# release lock
- fcntl.flock(lock, fcntl.LOCK_UN)
+ __release_lock(lock)
return busy_ports
#