From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31428 invoked by alias); 19 Jun 2009 13:41:42 -0000 Received: (qmail 31364 invoked by uid 22791); 19 Jun 2009 13:41:40 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 19 Jun 2009 13:41:33 +0000 Received: (qmail 5233 invoked from network); 19 Jun 2009 13:41:29 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 Jun 2009 13:41:29 -0000 From: Pedro Alves To: Aleksandar Ristovski Subject: Re: [patch] gdbserver: qXfer multiprocess Date: Fri, 19 Jun 2009 13:41:00 -0000 User-Agent: KMail/1.9.10 Cc: gdb-patches@sourceware.org References: <200906171905.13381.pedro@codesourcery.com> <4A393E82.90900@qnx.com> In-Reply-To: <4A393E82.90900@qnx.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200906191442.16707.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-06/txt/msg00499.txt.bz2 On Wednesday 17 June 2009 20:05:38, Aleksandar Ristovski wrote: > Pedro Alves wrote: > > Thanks. This is still not complete, though. > > > > You need to make sure that the "multi_process" flag stays turned off > > if the backend doesn't support MP, otherwise, things like > > Ok, then something like this? > - strcat (own_buf, ";multiprocess+"); > + if (target_supports_multiprocess ()) > + strcat (own_buf, ";multiprocess+"); > + else > + /* Override GDB's ability to support multiprocess. */ > + multi_process = 0; Indentation is off here. I'd prefer if we didn't turn the flag on at all in the first place. Checked in as below. Thanks. -- Pedro Alves * target.h (struct target_ops) : New callback. (target_supports_multi_process): New. * server.c (handle_query): Even if GDB reports support, only enable multi-process if the target also supports it. Report multi-process support only if the target backend supports it. * linux-low.c (linux_supports_multi_process): New function. (linux_target_ops): Install it as target_supports_multi_process callback. --- gdb/gdbserver/linux-low.c | 7 +++++++ gdb/gdbserver/server.c | 11 ++++++++--- gdb/gdbserver/target.h | 7 +++++++ 3 files changed, 22 insertions(+), 3 deletions(-) Index: src/gdb/gdbserver/target.h =================================================================== --- src.orig/gdb/gdbserver/target.h 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/target.h 2009-06-19 14:34:09.000000000 +0100 @@ -275,6 +275,9 @@ struct target_ops /* Switch to non-stop (1) or all-stop (0) mode. Return 0 on success, -1 otherwise. */ int (*start_non_stop) (int); + + /* Returns true if the target supports multi-process debugging. */ + int (*supports_multi_process) (void); }; extern struct target_ops *the_target; @@ -311,6 +314,10 @@ void set_target_ops (struct target_ops * #define target_async(enable) \ (the_target->async ? (*the_target->async) (enable) : 0) +#define target_supports_multi_process() \ + (the_target->supports_multi_process ? \ + (*the_target->supports_multi_process) () : 0) + /* Start non-stop mode, returns 0 on success, -1 on failure. */ int start_non_stop (int nonstop); Index: src/gdb/gdbserver/server.c =================================================================== --- src.orig/gdb/gdbserver/server.c 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/server.c 2009-06-19 14:34:09.000000000 +0100 @@ -1074,9 +1074,13 @@ handle_query (char *own_buf, int packet_ p != NULL; p = strtok (NULL, ";")) { - /* Record if GDB knows about multiprocess support. */ if (strcmp (p, "multiprocess+") == 0) - multi_process = 1; + { + /* GDB supports and wants multi-process support if + possible. */ + if (target_supports_multi_process ()) + multi_process = 1; + } } sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1); @@ -1106,7 +1110,8 @@ handle_query (char *own_buf, int packet_ if (the_target->qxfer_osdata != NULL) strcat (own_buf, ";qXfer:osdata:read+"); - strcat (own_buf, ";multiprocess+"); + if (target_supports_multi_process ()) + strcat (own_buf, ";multiprocess+"); if (target_supports_non_stop ()) strcat (own_buf, ";QNonStop+"); Index: src/gdb/gdbserver/linux-low.c =================================================================== --- src.orig/gdb/gdbserver/linux-low.c 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/linux-low.c 2009-06-19 14:34:09.000000000 +0100 @@ -3008,6 +3008,12 @@ linux_start_non_stop (int nonstop) return 0; } +static int +linux_supports_multi_process (void) +{ + return 1; +} + static struct target_ops linux_target_ops = { linux_create_inferior, linux_attach, @@ -3045,6 +3051,7 @@ static struct target_ops linux_target_op linux_supports_non_stop, linux_async, linux_start_non_stop, + linux_supports_multi_process }; static void 2009-06-19 Aleksandar Ristovski Pedro Alves * target.h (struct target_ops) : New callback. (target_supports_multi_process): New. * server.c (handle_query): Even if GDB reports support, only enable multi-process if the target also supports it. Report multi-process support only if the target backend supports it. * linux-low.c (linux_supports_multi_process): New function. (linux_target_ops): Install it as target_supports_multi_process callback. --- gdb/gdbserver/linux-low.c | 7 +++++++ gdb/gdbserver/server.c | 11 ++++++++--- gdb/gdbserver/target.h | 7 +++++++ 3 files changed, 22 insertions(+), 3 deletions(-) Index: src/gdb/gdbserver/target.h =================================================================== --- src.orig/gdb/gdbserver/target.h 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/target.h 2009-06-19 14:34:09.000000000 +0100 @@ -275,6 +275,9 @@ struct target_ops /* Switch to non-stop (1) or all-stop (0) mode. Return 0 on success, -1 otherwise. */ int (*start_non_stop) (int); + + /* Returns true if the target supports multi-process debugging. */ + int (*supports_multi_process) (void); }; extern struct target_ops *the_target; @@ -311,6 +314,10 @@ void set_target_ops (struct target_ops * #define target_async(enable) \ (the_target->async ? (*the_target->async) (enable) : 0) +#define target_supports_multi_process() \ + (the_target->supports_multi_process ? \ + (*the_target->supports_multi_process) () : 0) + /* Start non-stop mode, returns 0 on success, -1 on failure. */ int start_non_stop (int nonstop); Index: src/gdb/gdbserver/server.c =================================================================== --- src.orig/gdb/gdbserver/server.c 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/server.c 2009-06-19 14:34:09.000000000 +0100 @@ -1074,9 +1074,13 @@ handle_query (char *own_buf, int packet_ p != NULL; p = strtok (NULL, ";")) { - /* Record if GDB knows about multiprocess support. */ if (strcmp (p, "multiprocess+") == 0) - multi_process = 1; + { + /* GDB supports and wants multi-process support if + possible. */ + if (target_supports_multi_process ()) + multi_process = 1; + } } sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1); @@ -1106,7 +1110,8 @@ handle_query (char *own_buf, int packet_ if (the_target->qxfer_osdata != NULL) strcat (own_buf, ";qXfer:osdata:read+"); - strcat (own_buf, ";multiprocess+"); + if (target_supports_multi_process ()) + strcat (own_buf, ";multiprocess+"); if (target_supports_non_stop ()) strcat (own_buf, ";QNonStop+"); Index: src/gdb/gdbserver/linux-low.c =================================================================== --- src.orig/gdb/gdbserver/linux-low.c 2009-06-19 14:26:36.000000000 +0100 +++ src/gdb/gdbserver/linux-low.c 2009-06-19 14:34:09.000000000 +0100 @@ -3008,6 +3008,12 @@ linux_start_non_stop (int nonstop) return 0; } +static int +linux_supports_multi_process (void) +{ + return 1; +} + static struct target_ops linux_target_ops = { linux_create_inferior, linux_attach, @@ -3045,6 +3051,7 @@ static struct target_ops linux_target_op linux_supports_non_stop, linux_async, linux_start_non_stop, + linux_supports_multi_process }; static void