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)
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')
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