Exemplo n.º 1
0
def Runner(pgrpguard_binary=None):
    child_err_rd, child_err_wr = os.pipe()
    channel_parent, channel_child = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0)

    pid = os.fork()

    if pid:
        os.close(child_err_wr)
        channel_child.close()
        del channel_child
        logging.info("_Server pid = %s" % pid)
        return _Client(pid, channel_parent) # child_err_rd
    else:
        try:
            channel_parent.close()
            del channel_parent
            os.close(child_err_rd)
        except BaseException as e:
            try:
                os.write(2, '%s\n' % e)
            except:
                pass
            os._exit(1)
        set_thread_name("rem-RunnerSrv")
        _run_executor_wrapper(child_err_wr, channel_child, pgrpguard_binary)
Exemplo n.º 2
0
    def _read_loop(self):
        set_thread_name('rem-RunnerSrvRd')

        channel_in = self._channel_in
        stop_request_received = False

        logging_debug('_Server._read_loop started')

        while True:
            try:
                msg = deserialize(channel_in)
            except EOFError:
                logging_debug('_Server._read_loop EOFError')
                break

            if isinstance(msg, NewTaskParamsMessage):
                if stop_request_received:
                    raise RuntimeError("Message in channel after StopServiceRequestMessage")
                self._process_new_process_message(msg)

            elif isinstance(msg, SendSignalRequestMessage):
                self._process_send_signal_message(msg)

            elif isinstance(msg, StopServiceRequestMessage):
                stop_request_received = True
                with self._lock:
                    self._should_stop = True
                    self._send_queue_not_empty.notify()

            else:
                raise RuntimeError('Unknown message type')

        if not stop_request_received:
            raise RuntimeError('Socket closed without StopServiceRequestMessage message')

        self._channel.shutdown(socket.SHUT_RD)
    # TODO
        self._read_stopped = True
        logging_debug('_Server._read_loop finished')
Exemplo n.º 3
0
    def _write_loop(self):
        set_thread_name('rem-RunnerSrvWr')

        channel_out = self._channel_out
        send_queue = self._send_queue

        logging_debug('_Server._write_loop started')

        while True:
            last_iter = False

            with self._lock:
                while not send_queue and not (self._should_stop and not self._active):
                    self._send_queue_not_empty.wait()

                messages = []
                while send_queue:
                    messages.append(send_queue.popleft())

                if self._should_stop and not self._active:
                    last_iter = True
                    logging_debug('_Server._write_loop append(StopServiceResponseMessage)')
                    messages.append(StopServiceResponseMessage())

            for msg in messages:
                serialize(channel_out, msg)
            channel_out.flush()

            if last_iter:
                break

        self._channel.shutdown(socket.SHUT_WR)
        logging_debug('_Server._write_loop finished')

    # TODO
        self._write_stopped = True