Hello, Michael Kelly, le mer. 25 mars 2026 17:34:46 +0000, a ecrit: > The actual return code from the server can be stored in SYSRETURN. In > effect, changing: > > mach_msg_header_t head; > err = __mach_msg (&head, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, sizeof > head, > reply_ports[nthreads], > _hurd_interrupted_rpc_timeout, MACH_PORT_NULL); > to: > > mach_msg_header_t* head = (mach_msg_header_t*)state->basic.rdi; > mach_msg_size_t rcv_size = (mach_msg_size_t)state->basic.r10; > > err = __mach_msg (head, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, rcv_size, > reply_ports[nthreads], > _hurd_interrupted_rpc_timeout, > MACH_PORT_NULL); > > state->basic.SYSRETURN = err; > state_changed = 1; > > I was able to run the test case (calls to write() with simultaneous > SIGSTOP/SIGCONT) successfully with this change and some minor rearrangement > of the code.
That looks good to me! > This is only a partial solution as there are several places > where EINTR is potentially returned to the client inappropriately. Possibly the other ones can't be helped with and that will be fine enough. > I'll probably need some guidance with the appropriate behaviour under > other failure conditions, for example, if the interrupt operation > cannot be delivered. If it cannot be delivered, that can't be helped. If it's the server that doesn't support the interrupt protocol, we cannot do anything about it, servers have to support it. Samuel
