On Thu, Sep 1, 2016 at 12:38 PM, Richard Braun <rbr...@sceen.net> wrote:
> > > Most modern microkernels use synchronous IPC > > > that just block, and many operations on top of them do block. The > > > overall system on the other hand must be careful to avoid such > > > deadlocks. > > > > OK, I read the Mach documentation for mach_msg() and concluded that it > was > > like a POSIX read(), that I could operate it in a mode where the kernel > > absolutely would not block my process, and would return EWOULDBLOCK > > instead. That's basically a kernel guarantee, at least as much as it is. > > (Notice that it doesn't guarantee how long the system call will take - 1 > > ms? 1 s? 1 week? - because it's not a real time system, which is why I > > say "as much as it is") > > Yes, you can think of mach_msg as such a system call. Note that if > the timeout is 0, it will return immediately instead of blocking, > which is what a real-time system would do too. Real time systems > aren't about that at all. > > > Are you now saying that's not how it works on Mach/Hurd? If so, please > let > > me know, because I've been under a big misunderstanding that I need to > get > > cleared up! > > I think your mistake here is using MACH_SEND_TIMEOUT instead of > MACH_RCV_TIMEOUT. Your message certainly was sent, so there is no > reason to get a timeout error for that. > Here's the call: mach_msg(msg, MACH_SEND_MSG | MACH_SEND_TIMEOUT, msg->msgh_size, 0, msg->msgh_remote_port, 0, MACH_PORT_NULL); Why should I specify MACH_RCV_TIMEOUT? It's not a receive call. The way my code is structured, one thread handles the traffic from the network to IPC, and a separate thread handles the traffic from IPC to the network. This call is in the network-to-IPC thread. This thread never receives anything except network traffic, which it blocks for. I want a non-blocking send. This one blocks if the message is vm_map, the memory object passed in is goofed, and the message is targeted at a task port on the local kernel (and it doesn't have to be the task that calls mach_msg). > Now that you know you should be using MACH_RCV_TIMEOUT, you should see > that no server can block you indefinitely. Just so we're on the same page here, should that call above block or not? I just tried it again with MACH_RCV_TIMEOUT; it does the same thing. agape brent