Ejemplo n.º 1
0
 def test_sem_unlink(self):
     from _multiprocess import sem_unlink
     import errno
     try:
         sem_unlink("non-existent")
     except OSError as e:
         assert e.errno in (errno.ENOENT, errno.EINVAL)
     else:
         assert 0, "should have raised"
Ejemplo n.º 2
0
def main(fd):
    '''Run semaphore tracker.'''
    # protect the process from ^C and "killall python" etc
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    signal.signal(signal.SIGTERM, signal.SIG_IGN)

    for f in (sys.stdin, sys.stdout):
        try:
            f.close()
        except Exception:
            pass

    cache = set()
    try:
        # keep track of registered/unregistered semaphores
        with open(fd, 'rb') as f:
            for line in f:
                try:
                    cmd, name = line.strip().split(b':')
                    if cmd == b'REGISTER':
                        cache.add(name)
                    elif cmd == b'UNREGISTER':
                        cache.remove(name)
                    else:
                        raise RuntimeError('unrecognized command %r' % cmd)
                except Exception:
                    try:
                        sys.excepthook(*sys.exc_info())
                    except:
                        pass
    finally:
        # all processes have terminated; cleanup any remaining semaphores
        if cache:
            try:
                warnings.warn('semaphore_tracker: There appear to be %d '
                              'leaked semaphores to clean up at shutdown' %
                              len(cache))
            except Exception:
                pass
        for name in cache:
            # For some reason the process which created and registered this
            # semaphore has failed to unregister it. Presumably it has died.
            # We therefore unlink it.
            try:
                name = name.decode('ascii')
                try:
                    _multiprocessing.sem_unlink(name)
                except Exception as e:
                    warnings.warn('semaphore_tracker: %r: %s' % (name, e))
            finally:
                pass
Ejemplo n.º 3
0
    def test_semaphore_rebuild(self):
        import sys
        if sys.platform == 'win32':
            from _multiprocess import SemLock

            def sem_unlink(*args):
                pass
        else:
            from _multiprocess import SemLock, sem_unlink
        kind = self.SEMAPHORE
        value = 1
        maxvalue = 1
        sem = SemLock(kind, value, maxvalue, "4.2", unlink=False)
        try:
            sem2 = SemLock._rebuild(-1, kind, value, "4.2")
            #assert sem.handle != sem2.handle---even though they come
            # from different calls to sem_open(), on Linux at least,
            # they are the same pointer
            sem2 = SemLock._rebuild(sem.handle, kind, value, None)
            assert sem.handle == sem2.handle
        finally:
            sem_unlink("4.2")
Ejemplo n.º 4
0
 def _cleanup(name):
     from .semaphore_tracker import unregister
     sem_unlink(name)
     unregister(name)
Ejemplo n.º 5
0
 def _cleanup(name):
     from .semaphore_tracker import unregister
     sem_unlink(name)
     unregister(name)
Ejemplo n.º 6
0
 def _cleanup(name):
     from .resource_tracker import unregister
     sem_unlink(name)
     unregister(name, "semaphore")