Justus Winter, le Fri 13 Dec 2013 15:52:38 +0100, a écrit :
> Currently, it is impossible to properly attribute response messages to
> requests.  Even though rpctrace is single-threaded, its tracee may
> not.  Or there might be more than one tracee.  In any such case it is
> not guaranteed that the reply message we just processed is for the
> request we just printed.  Fix this by printing ellipsis with the port
> name, so that reply messages can be properly attributed:
> 
> task129(pid3312)->mach_port_allocate (3) ...134
> task129(pid3312)->mach_port_deallocate (pn{  1}) ...160
> 134... = 0 pn{ 30}
> 160... = 0

Ack.

> * utils/rpctrace.c (last_reply_port): New variable.
> (print_ellipsis): New function.
> (print_request_header): Optionally print ellipsis and update
> last_reply_port.
> (print_reply_header): Likewise.
> ---
>  utils/rpctrace.c |   28 ++++++++++++++++++++++++++--
>  1 file changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/utils/rpctrace.c b/utils/rpctrace.c
> index f6e255b..9605089 100644
> --- a/utils/rpctrace.c
> +++ b/utils/rpctrace.c
> @@ -1,7 +1,7 @@
>  /* Trace RPCs sent to selected ports
>  
> -   Copyright (C) 1998, 1999, 2001, 2002, 2003, 2005, 2006, 2009, 2011
> -   Free Software Foundation, Inc.
> +   Copyright (C) 1998, 1999, 2001, 2002, 2003, 2005, 2006, 2009, 2011,
> +   2013 Free Software Foundation, Inc.
>  
>     This file is part of the GNU Hurd.
>  
> @@ -1486,10 +1486,27 @@ static const char *const msg_types[] =
>  };
>  #endif
>  
> +/* We keep track of the last reply port used in a request we print to
> +   ostream.  This way we can end incomplete requests with an ellipsis
> +   and the name of the reply port.  When the reply finally arrives, we
> +   start a new line with that port name and an ellipsis, making it
> +   easy to match it to the associated request.  */
> +static mach_port_t last_reply_port;
> +
> +/* Print an ellipsis if necessary.  */
> +static void
> +print_ellipsis (void)
> +{
> +  if (MACH_PORT_VALID (last_reply_port))
> +    fprintf (ostream, " ...%u\n", (unsigned int) last_reply_port);
> +}
> +
>  static void
>  print_request_header (struct sender_info *receiver, mach_msg_header_t *msg)
>  {
>    const char *msgname = msgid_name (msg->msgh_id);
> +  print_ellipsis ();
> +  last_reply_port = msg->msgh_local_port;
>  
>    if (TRACED_INFO (receiver)->name != 0)
>      fprintf (ostream, "%4s->", TRACED_INFO (receiver)->name);
> @@ -1507,6 +1524,13 @@ static void
>  print_reply_header (struct send_once_info *info, mig_reply_header_t *reply,
>                   struct req_info *req)
>  {
> +  if (last_reply_port != info->pi.pi.port_right)
> +    {
> +      print_ellipsis ();
> +      fprintf (ostream, "%u...", (unsigned int) info->pi.pi.port_right);
> +    }
> +  last_reply_port = MACH_PORT_NULL;
> +
>    /* We have printed a partial line for the request message,
>       and now we have the corresponding reply.  */
>    if (reply->Head.msgh_id == req->req_id + 100)
> -- 
> 1.7.10.4
> 
> 

-- 
Samuel
<m> argh, pi est plus grand que 2. Ca casse tout
 -+- #ens-mim -+-

Reply via email to