This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] new tcp_open
- From: "Martin M. Hunt" <hunt at redhat dot com>
- To: Orjan Friberg <orjan dot friberg at axis dot com>, gdb-patches at sources dot redhat dot com
- Date: Tue, 18 Dec 2001 02:56:00 -0800
- Subject: Re: [RFA] new tcp_open
- Organization: Red Hat Inc
- References: <200112031918.LAA18199@cygnus.com> <3C1F1D00.A35E3AF@axis.com>
On Tuesday 18 December 2001 02:40 am, Orjan Friberg wrote:
> "Martin M. Hunt" wrote:
> > Problem: Using "target remote" to open a tcp connection to a target
> > board doesn't timeout properly if the target isn't running or you mistype
> > the name or port number. The tcp_open function tries to connect 15 times,
> > each of which can take a couple of minutes to timeout. You can't
> > interrupt the connect from the GUI, which is not updated, or from the
> > command line with a ^C.
> >
> > I propose replacing tcp_open with a new function that does a non-blocking
> > connect with a maximum timeout of 15 seconds. This is easily
> > interruptable by typing ^C or clicking on the stop button. I have tested
> > this with Linux, Solaris, and Cygwin.
>
> In my setup, this patch makes the testsuite run an order of a magnitude
> slower (I downgraded only this file from an otherwise updated tree, and
> it fixes the problem). My target board runs an unsubmitted port (for
> various reasons) of the gdbserver on a Linux 2.4.14 kernel, and my host
> is a Linux 2.2.19. I don't see any recent gdbserver changes that should
> be related to this change. Anyone else seeing this slowdown?
Please give this patch a try and see if it fixes the problem.
Index: ser-tcp.c
===================================================================
RCS file: /cvs/src/src/gdb/ser-tcp.c,v
retrieving revision 1.9
diff -u -p -r1.9 ser-tcp.c
--- ser-tcp.c 2001/12/07 17:57:05 1.9
+++ ser-tcp.c 2001/12/18 10:54:31
@@ -165,6 +165,10 @@ tcp_open (struct serial *scb, const char
tmp = 0;
ioctl (scb->fd, FIONBIO, &tmp);
+ tmp = 1;
+ setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
+ (char *)&tmp, sizeof (tmp));
+
/* If we don't do this, then GDB simply exits
when the remote side dies. */
signal (SIGPIPE, SIG_IGN);
--
Martin Hunt
GDB Engineer
Red Hat, Inc.