Beispiel #1
0
    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)
Beispiel #2
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)
Beispiel #3
0
    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)