Carl Fredrik Hammar, le Wed 30 Dec 2009 16:38:35 +0100, a écrit : > On Wed, Dec 30, 2009 at 02:01:12PM +0100, Samuel Thibault wrote: > > Carl Fredrik Hammar, le Wed 30 Dec 2009 12:40:02 +0100, a écrit : > > > > > > The notification has been requested by > > > auth_server_authenticate which is waiting for auth_user_authenticate > > > to arive. > > > > Only when the user isn't arrived already. > > Right, but we know it hasn't since the server has posted a pending > operation, otherwise we'd be in the else part of the if.
Right. > > > In the then part of the if statement, the user has found that the > > > server is waiting for the condition to be signaled, which is right > > > time to cancel the notification. > > > > Err, isn't the notification bound to an RPC? > > (really, I don't know anything about these and the Mach documentation > > doesn't help me so much). > > The low-level interface is bound to the port we want notifications about. Ok. I've tried the attached patch (against the current unpatched git head), still no luck: no "auth EINTR" printed, but auth_server_authenticate returned EINTR in ext2fs. Samuel
--- auth.c.orig 2009-12-30 17:18:13.000000000 +0100 +++ auth.c 2009-12-30 17:24:25.000000000 +0100 @@ -306,6 +306,8 @@ s->user = userauth; ports_port_ref (userauth); + mach_port_t old; + error_t err2 = mach_port_request_notification(mach_task_self(), rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); condition_signal (&s->wakeup); mutex_unlock (&pending_lock); @@ -333,7 +335,10 @@ { hurd_ihash_locp_remove (&pending_users, u.locp); err = EINTR; + ____mylog("auth EINTR\n"); } + mach_port_t old; + error_t err2 = mach_port_request_notification(mach_task_self(), rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); } /* The server side has already removed U from the ihash table. */ mutex_unlock (&pending_lock); @@ -393,6 +398,8 @@ /* Give the user the new port and wake the RPC up. */ u->passthrough = newport; + mach_port_t old; + error_t err2 = mach_port_request_notification(mach_task_self(), rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); condition_signal (&u->wakeup); mutex_unlock (&pending_lock); } @@ -415,7 +422,10 @@ { hurd_ihash_locp_remove (&pending_servers, s.locp); err = EINTR; + ____mylog("auth EINTR\n"); } + mach_port_t old; + error_t err2 = mach_port_request_notification(mach_task_self(), rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); } /* The user side has already removed S from the ihash table. */ mutex_unlock (&pending_lock);