Ejemplo n.º 1
0
    def _feed(buffer, notempty, send, writelock, close):
        debug('starting thread to feed data to pipe')

        nacquire = notempty.acquire
        nrelease = notempty.release
        nwait = notempty.wait
        bpopleft = buffer.popleft
        sentinel = _sentinel
        if sys.platform != 'win32':
            wacquire = writelock.acquire
            wrelease = writelock.release
        else:
            wacquire = None

        try:
            while 1:
                nacquire()
                try:
                    if not buffer:
                        nwait()
                finally:
                    nrelease()
                try:
                    while 1:
                        obj = bpopleft()
                        if obj is sentinel:
                            debug('feeder thread got sentinel -- exiting')
                            close()
                            return

                        if wacquire is None:
                            send(obj)
                        else:
                            wacquire()
                            try:
                                send(obj)
                            finally:
                                wrelease()
                except IndexError:
                    pass
        except Exception, e:
            # Since this runs in a daemon thread the objects it uses
            # may be become unusable while the process is cleaning up.
            # We ignore errors which happen after the process has
            # started to cleanup.
            if currentProcess()._exiting:
                subWarning('error in queue thread: %s', e)
            else:
                raise
Ejemplo n.º 2
0
    def _feed(buffer, notempty, send, writelock, close):
        debug('starting thread to feed data to pipe')

        nacquire = notempty.acquire
        nrelease = notempty.release
        nwait = notempty.wait
        bpopleft = buffer.popleft
        sentinel = _sentinel
        if sys.platform != 'win32':
            wacquire = writelock.acquire
            wrelease = writelock.release
        else:
            wacquire = None
        
        try:
            while 1:
                nacquire()
                try:
                    if not buffer:
                        nwait()
                finally:
                    nrelease()
                try:
                    while 1:
                        obj = bpopleft()
                        if obj is sentinel:
                            debug('feeder thread got sentinel -- exiting')
                            close()
                            return

                        if wacquire is None:
                            send(obj)
                        else:
                            wacquire()
                            try:
                                send(obj)
                            finally:
                                wrelease()                        
                except IndexError:
                    pass
        except Exception, e:
            # Since this runs in a daemon thread the objects it uses
            # may be become unusable while the process is cleaning up.
            # We ignore errors which happen after the process has
            # started to cleanup.
            if currentProcess()._exiting:
                subWarning('error in queue thread: %s', e)
            else:
                raise
Ejemplo n.º 3
0
def _serve():
    while 1:
        try:
            conn = _listener.accept()
            handle_wanted, destination_pid = conn.recv()
            _cache.remove(handle_wanted)
            sendHandle(conn, handle_wanted, destination_pid)
            closeHandle(handle_wanted)
            conn.close()
        except (SystemExit, KeyboardInterrupt):
            raise
        except:
            if not processing.currentProcess()._exiting:
                import traceback
                subWarning('thread for sharing handles raised exception :\n' +
                           '-' * 79 + '\n' + traceback.format_exc() + '-' * 79)
Ejemplo n.º 4
0
def _serve():
    while 1:
        try:
            conn = _listener.accept()
            handle_wanted, destination_pid = conn.recv()
            _cache.remove(handle_wanted)
            sendHandle(conn, handle_wanted, destination_pid)
            closeHandle(handle_wanted)
            conn.close()
        except (SystemExit, KeyboardInterrupt):
            raise
        except:
            if not processing.currentProcess()._exiting:
                import traceback
                subWarning(
                    'thread for sharing handles raised exception :\n' +
                    '-'*79 + '\n' + traceback.format_exc() + '-'*79
                    )
Ejemplo n.º 5
0
    def handleRequest(self, c):
        '''
        Handle a new connection
        '''
        funcname = result = request = None
        try:
            deliverChallenge(c, self.authkey)
            answerChallenge(c, self.authkey)
            request = c.recv()
            ignore, funcname, args, kwds = request
            assert funcname in self.public, '%r unrecognized' % funcname
            func = getattr(self, funcname)
        except (SystemExit, KeyboardInterrupt):
            raise
        except Exception:
            msg = ('#ERROR', RemoteError())
        else:
            try:
                result = func(c, *args, **kwds)
                msg = ('#RETURN', result)
            except (SystemExit, KeyboardInterrupt):
                raise
            except Exception:
                msg = ('#ERROR', RemoteError())

        try:
            c.send(msg)
        except (SystemExit, KeyboardInterrupt):
            raise
        except Exception, e:
            if msg[0] == '#ERROR':
                subWarning('Failure to send exception: %r', msg[1])
            else:
                subWarning('Failure to send result: %r', msg[1])
            subWarning(' ... request was %r', request)
            subWarning(' ... exception was %r', e)
Ejemplo n.º 6
0
    def handleRequest(self, c):
        '''
        Handle a new connection
        '''
        funcname = result = request = None
        try:
            deliverChallenge(c, self.authkey)
            answerChallenge(c, self.authkey)
            request = c.recv()
            ignore, funcname, args, kwds = request
            assert funcname in self.public, '%r unrecognized' % funcname
            func = getattr(self, funcname)
        except (SystemExit, KeyboardInterrupt):
            raise
        except Exception:
            msg = ('#ERROR', RemoteError())
        else:
            try:
                result = func(c, *args, **kwds)
                msg = ('#RETURN', result)
            except (SystemExit, KeyboardInterrupt):
                raise
            except Exception:
                msg = ('#ERROR', RemoteError())

        try:
            c.send(msg)
        except (SystemExit, KeyboardInterrupt):
            raise
        except Exception, e:
            if msg[0] == '#ERROR':
                subWarning('Failure to send exception: %r', msg[1])
            else:
                subWarning('Failure to send result: %r', msg[1])
            subWarning(' ... request was %r', request)
            subWarning(' ... exception was %r', e)
Ejemplo n.º 7
0
                                                       result)
                            res_obj, res_exposed = self.id_to_obj[res_ident]
                            token = Token('iter', self.address, res_ident)
                            result = IteratorProxy(token, incref=False)
                            msg = ('#RETURN', result)
                        except (SystemExit, KeyboardInterrupt):
                            raise
                        except Exception:
                            msg = ('#ERROR', RemoteError())
                    else:
                        msg = ('#ERROR', RemoteError())
                    send(msg)
            except (SystemExit, KeyboardInterrupt):
                raise
            except Exception, e:
                subWarning('exception in thread serving %r',
                           threading.currentThread().getName())
                subWarning(' ... message was %r', msg)
                subWarning(' ... exception was %r', e)
                connection.close()
                sys.exit(1)

    def fallbackGetValue(self, connection, ident, obj):
        return obj

    def fallbackStr(self, connection, ident, obj):
        return str(obj)

    def fallbackRepr(self, connection, ident, obj):
        return repr(obj)

    def fallbackCmp(self, connection, ident, obj, *args):
Ejemplo n.º 8
0
                                )
                            res_obj, res_exposed = self.id_to_obj[res_ident]
                            token = Token('iter', self.address, res_ident)
                            result = IteratorProxy(token, incref=False)
                            msg = ('#RETURN', result)
                        except (SystemExit, KeyboardInterrupt):
                            raise
                        except Exception:
                            msg = ('#ERROR', RemoteError())
                    else:
                        msg = ('#ERROR', RemoteError())
                    send(msg)
            except (SystemExit, KeyboardInterrupt):
                raise
            except Exception, e:
                subWarning('exception in thread serving %r',
                        threading.currentThread().getName())
                subWarning(' ... message was %r', msg)
                subWarning(' ... exception was %r', e)
                connection.close()
                sys.exit(1)

    def fallbackGetValue(self, connection, ident, obj):
        return obj

    def fallbackStr(self, connection, ident, obj):
        return str(obj)

    def fallbackRepr(self, connection, ident, obj):
        return repr(obj)

    def fallbackCmp(self, connection, ident, obj, *args):