def __init__(self, kind, value, maxvalue, *, ctx): if ctx is None: ctx = context._default_context.get_context() name = ctx.get_start_method() unlink_now = sys.platform == 'win32' or name == 'fork' for i in range(100): try: sl = self._semlock = _multiprocessing.SemLock( kind, value, maxvalue, self._make_name(), unlink_now) except FileExistsError: pass else: break else: raise FileExistsError('cannot find name for semaphore') util.debug('created semlock with handle %s' % sl.handle) self._make_methods() if sys.platform != 'win32': def _after_fork(obj): obj._semlock._after_fork() util.register_after_fork(self, _after_fork) if self._semlock.name is not None: # We only get here if we are on Unix with forking # disabled. When the object is garbage collected or the # process shuts down we unlink the semaphore name from .semaphore_tracker import register register(self._semlock.name) util.Finalize(self, SemLock._cleanup, (self._semlock.name, ), exitpriority=0)
def create_semlock(obj, cpid, tp, val, imax): sid = None if utils.is_windows(): obj._semlock = _multiprocessing.SemLock(tp, val, imax) chandle = _multiprocessing.win32.OpenProcess( _multiprocessing.win32.PROCESS_ALL_ACCESS, False, cpid) sid = multiprocessing.forking.duplicate(obj._semlock.handle, chandle) multiprocessing.forking.close(chandle) else: cnttry = 0 while True: _sharememmap["semaphore"].acquire() try: _sharememmap["sem_counter"] += 1 sid = _sharememmap["sem_counter"] finally: _sharememmap["semaphore"].release() obj._sem_name = _sharememmap["sem_name"] + str(sid) obj._sem_t = _sharememmap["libbase"].semaphoreCreate( obj._sem_name, val) if obj._sem_t != -1: break cnttry += 1 if cnttry >= 100: raise Exception("semaphoreOpen failed.") obj._semlock = _multiprocessing.SemLock._rebuild(*(obj._sem_t, tp, imax)) obj._make_methods() return (sid, tp, imax)
def __init__(self, kind, value, maxvalue): sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue) debug('created semlock with handle %s' % sl.handle) self._make_methods() if sys.platform != 'win32': def _after_fork(obj): obj._semlock._after_fork() register_after_fork(self, _after_fork)