* [RFA] new tcp_open
@ 2001-12-03 11:18 Martin M. Hunt
2001-12-03 12:02 ` Andrew Cagney
2001-12-18 2:41 ` Orjan Friberg
0 siblings, 2 replies; 13+ messages in thread
From: Martin M. Hunt @ 2001-12-03 11:18 UTC (permalink / raw)
To: gdb-patches
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.
--
Martin Hunt
GDB Engineer
Red Hat, Inc.
2001-12-03 Martin M. Hunt <hunt@redhat.com>
* ser-tcp.c (tcp_open): Rewrite to use a non-blocking connect.
Allow UI and CLI to abort connect. Instead of trying 15 times
with very long timeouts, just try one connect with a maximum timeout
of 15 seconds.
Here is the new function, followed by the patch:
#define TIMEOUT 30
/* Open a tcp socket */
static int
tcp_open (struct serial *scb, const char *name)
{
char *port_str, hostname[100];
int n, port, tmp;
struct hostent *hostent;
struct sockaddr_in sockaddr;
port_str = strchr (name, ':');
if (!port_str)
error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
tmp = min (port_str - name, (int) sizeof hostname - 1);
strncpy (hostname, name, tmp); /* Don't want colon */
hostname[tmp] = '\000'; /* Tie off host name */
port = atoi (port_str + 1);
/* default hostname is localhost */
if (!hostname[0])
strcpy (hostname, "localhost");
hostent = gethostbyname (hostname);
if (!hostent)
{
fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
errno = ENOENT;
return -1;
}
scb->fd = socket (PF_INET, SOCK_STREAM, 0);
if (scb->fd < 0)
return -1;
sockaddr.sin_family = PF_INET;
sockaddr.sin_port = htons (port);
memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
sizeof (struct in_addr));
/* set socket nonblocking */
tmp = 1;
ioctl (scb->fd, FIONBIO, &tmp);
/* Use Non-blocking connect. connect() will return 0 if connected already. */
n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
if (n)
{
/* looks like we need to wait for the connect */
struct timeval t;
fd_set rset, wset;
int secs = 0;
FD_ZERO (&rset);
do
{
/* While we wait for the connect to complete */
/* poll the UI so it can update or the user can */
/* interrupt. */
if (ui_loop_hook)
{
if (ui_loop_hook (0))
{
errno = EINTR;
tcp_close (scb);
return -1;
}
}
FD_SET (scb->fd, &rset);
wset = rset;
t.tv_sec = 0;
t.tv_usec = 500000; /* 0.5 seconds */
n = select (scb->fd + 1, &rset, &wset, NULL, &t);
secs++;
}
while (n == 0 && secs <= TIMEOUT);
if (n < 0 || secs > TIMEOUT)
{
if (secs > TIMEOUT)
errno = ETIMEDOUT;
tcp_close (scb);
return -1;
}
}
/* Got something. Is it an error? */
{
int res, err, len;
len = sizeof(err);
res = getsockopt (scb->fd, SOL_SOCKET, SO_ERROR, &err, &len);
if (res < 0 || err)
{
if (err)
errno = err;
tcp_close (scb);
return -1;
}
}
/* turn off nonblocking */
tmp = 0;
ioctl (scb->fd, FIONBIO, &tmp);
/* If we don't do this, then GDB simply exits
when the remote side dies. */
signal (SIGPIPE, SIG_IGN);
return 0;
}
And the patch:
Index: ser-tcp.c
===================================================================
RCS file: /cvs/src/src/gdb/ser-tcp.c,v
retrieving revision 1.7
diff -u -p -r1.7 ser-tcp.c
--- ser-tcp.c 2001/08/02 09:08:03 1.7
+++ ser-tcp.c 2001/12/03 18:29:41
@@ -24,6 +24,7 @@
#include "ser-unix.h"
#include <sys/types.h>
+#include <sys/ioctl.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -36,90 +37,122 @@
static int tcp_open (struct serial *scb, const char *name);
static void tcp_close (struct serial *scb);
-
+extern int (*ui_loop_hook) (int);
void _initialize_ser_tcp (void);
+
+#define TIMEOUT 30
-/* Open up a raw tcp socket */
+/* Open a tcp socket */
static int
tcp_open (struct serial *scb, const char *name)
{
- char *port_str;
- int port;
+ char *port_str, hostname[100];
+ int n, port, tmp;
struct hostent *hostent;
struct sockaddr_in sockaddr;
- int tmp;
- char hostname[100];
- struct protoent *protoent;
- int i;
port_str = strchr (name, ':');
if (!port_str)
- error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
+ error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
tmp = min (port_str - name, (int) sizeof hostname - 1);
strncpy (hostname, name, tmp); /* Don't want colon */
hostname[tmp] = '\000'; /* Tie off host name */
port = atoi (port_str + 1);
+ /* default hostname is localhost */
if (!hostname[0])
strcpy (hostname, "localhost");
hostent = gethostbyname (hostname);
-
if (!hostent)
{
fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
errno = ENOENT;
return -1;
}
-
- for (i = 1; i <= 15; i++)
- {
- scb->fd = socket (PF_INET, SOCK_STREAM, 0);
- if (scb->fd < 0)
- return -1;
-
- /* Allow rapid reuse of this port. */
- tmp = 1;
- setsockopt (scb->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
-
- /* Enable TCP keep alive process. */
- tmp = 1;
- setsockopt (scb->fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
-
- sockaddr.sin_family = PF_INET;
- sockaddr.sin_port = htons (port);
- memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
- sizeof (struct in_addr));
-
- if (!connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)))
- break;
- close (scb->fd);
- scb->fd = -1;
-
-/* We retry for ECONNREFUSED because that is often a temporary condition, which
- happens when the server is being restarted. */
+ scb->fd = socket (PF_INET, SOCK_STREAM, 0);
+ if (scb->fd < 0)
+ return -1;
+
+ sockaddr.sin_family = PF_INET;
+ sockaddr.sin_port = htons (port);
+ memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
+ sizeof (struct in_addr));
- if (errno != ECONNREFUSED)
- return -1;
+ /* set socket nonblocking */
+ tmp = 1;
+ ioctl (scb->fd, FIONBIO, &tmp);
- sleep (1);
+ /* Use Non-blocking connect. connect() will return 0 if connected already. */
+ n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
+ if (n)
+ {
+ /* looks like we need to wait for the connect */
+ struct timeval t;
+ fd_set rset, wset;
+ int secs = 0;
+ FD_ZERO (&rset);
+
+ do
+ {
+ /* While we wait for the connect to complete */
+ /* poll the UI so it can update or the user can */
+ /* interrupt. */
+ if (ui_loop_hook)
+ {
+ if (ui_loop_hook (0))
+ {
+ errno = EINTR;
+ tcp_close (scb);
+ return -1;
+ }
+ }
+
+ FD_SET (scb->fd, &rset);
+ wset = rset;
+ t.tv_sec = 0;
+ t.tv_usec = 500000; /* 0.5 seconds */
+
+ n = select (scb->fd + 1, &rset, &wset, NULL, &t);
+ secs++;
+ }
+ while (n == 0 && secs <= TIMEOUT);
+
+ if (n < 0 || secs > TIMEOUT)
+ {
+ if (secs > TIMEOUT)
+ errno = ETIMEDOUT;
+ tcp_close (scb);
+ return -1;
+ }
}
- protoent = getprotobyname ("tcp");
- if (!protoent)
- return -1;
- tmp = 1;
- if (setsockopt (scb->fd, protoent->p_proto, TCP_NODELAY,
- (char *) &tmp, sizeof (tmp)))
- return -1;
-
- signal (SIGPIPE, SIG_IGN); /* If we don't do this, then GDB simply exits
- when the remote side dies. */
+ /* Got something. Is it an error? */
+ {
+ int res, err, len;
+ len = sizeof(err);
+ res = getsockopt (scb->fd, SOL_SOCKET, SO_ERROR, &err, &len);
+ if (res < 0 || err)
+ {
+ if (err)
+ errno = err;
+ tcp_close (scb);
+ return -1;
+ }
+ }
+
+ /* turn off nonblocking */
+ tmp = 0;
+ ioctl (scb->fd, FIONBIO, &tmp);
+
+ /* If we don't do this, then GDB simply exits
+ when the remote side dies. */
+ signal (SIGPIPE, SIG_IGN);
return 0;
}
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [RFA] new tcp_open
2001-12-03 11:18 [RFA] new tcp_open Martin M. Hunt
@ 2001-12-03 12:02 ` Andrew Cagney
2001-12-03 13:26 ` Martin M. Hunt
2001-12-18 2:41 ` Orjan Friberg
1 sibling, 1 reply; 13+ messages in thread
From: Andrew Cagney @ 2001-12-03 12:02 UTC (permalink / raw)
To: Martin M. Hunt; +Cc: gdb-patches
Outch!
> /* Use Non-blocking connect. connect() will return 0 if connected already. */
> n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
> if (n)
> {
Should this also be checking errno to confirm that it was EINPROGRESS?
Little point in trying to connect to a socket that isn't valid.
> t.tv_usec = 500000; /* 0.5 seconds */
>
> n = select (scb->fd + 1, &rset, &wset, NULL, &t);
> secs++;
> }
> while (n == 0 && secs <= TIMEOUT);
Can I just suggest tinkering with this so that the 15 seconds is clearer
- at present it happens cos 0.5 * 30 = 15.
> /* While we wait for the connect to complete */
> /* poll the UI so it can update or the user can */
> /* interrupt. */
That should be a single comment block.
Could you please also add a comment to serial.h indicating that
serial_open() has the potential to block so that the code must handle
that and a true asynchronous open() interface may need to eventually be
added to GDB.
The only other potential problem I can see is with FIONBIO. Hopefully
that is fairly common and where it turns out to not be available
something can be worked out.
Tried it on cygwin?
Otherwise, yes approved.
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [RFA] new tcp_open
2001-12-03 12:02 ` Andrew Cagney
@ 2001-12-03 13:26 ` Martin M. Hunt
2001-12-03 13:36 ` Andrew Cagney
0 siblings, 1 reply; 13+ messages in thread
From: Martin M. Hunt @ 2001-12-03 13:26 UTC (permalink / raw)
To: Andrew Cagney; +Cc: gdb-patches
On Monday 03 December 2001 12:02 pm, Andrew Cagney wrote:
> Outch!
>
> > /* Use Non-blocking connect. connect() will return 0 if connected
> > already. */ n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof
> > (sockaddr)); if (n)
> > {
>
> Should this also be checking errno to confirm that it was EINPROGRESS?
> Little point in trying to connect to a socket that isn't valid.
The select handles it, but that isn't obvious. I'll insert the standard
error check after the connect.
> > t.tv_usec = 500000; /* 0.5 seconds */
> >
> > n = select (scb->fd + 1, &rset, &wset, NULL, &t);
> > secs++;
> > }
> > while (n == 0 && secs <= TIMEOUT);
>
> Can I just suggest tinkering with this so that the 15 seconds is clearer
> - at present it happens cos 0.5 * 30 = 15.
Yeah, it did make more sense when the select was timing out at 1 second
intervals, but I decided to lower it to make the GUI more responsive.
How about this?
/* seconds to wait for connect */
#define TIMEOUT 15
/* how many times per second to poll ui_loop_hook */
#define POLL_INTERVAL 2
[...]
t.tv_sec = 0;
t.tv_usec = 1000000 / POLL_INTERVAL;
n = select (scb->fd + 1, &rset, &wset, NULL, &t);
polls++;
}
while (n == 0 && polls <= TIMEOUT * POLL_INTERVAL);
if (n < 0 || polls > TIMEOUT * POLL_INTERVAL)
{
if (polls > TIMEOUT * POLL_INTERVAL)
errno = ETIMEDOUT;
tcp_close (scb);
return -1;
}
> The only other potential problem I can see is with FIONBIO. Hopefully
> that is fairly common and where it turns out to not be available
> something can be worked out.
It really should be available everywhere. This is standard socket stuff. If
for some reason the socket does not get set to non-blocking, it will block,
but still connect.
> Tried it on cygwin?
Yes. It works.
--
Martin Hunt
GDB Engineer
Red Hat, Inc.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-03 11:18 [RFA] new tcp_open Martin M. Hunt
2001-12-03 12:02 ` Andrew Cagney
@ 2001-12-18 2:41 ` Orjan Friberg
2001-12-18 2:57 ` Martin M. Hunt
1 sibling, 1 reply; 13+ messages in thread
From: Orjan Friberg @ 2001-12-18 2:41 UTC (permalink / raw)
To: gdb-patches; +Cc: Martin M. Hunt
"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?
--
Orjan Friberg
Axis Communications AB
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-18 2:41 ` Orjan Friberg
@ 2001-12-18 2:57 ` Martin M. Hunt
2001-12-18 3:22 ` Andrew Cagney
2001-12-18 3:40 ` Orjan Friberg
0 siblings, 2 replies; 13+ messages in thread
From: Martin M. Hunt @ 2001-12-18 2:57 UTC (permalink / raw)
To: Orjan Friberg, gdb-patches
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.
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [RFA] new tcp_open
2001-12-18 2:57 ` Martin M. Hunt
@ 2001-12-18 3:22 ` Andrew Cagney
2001-12-18 12:29 ` Martin M. Hunt
2001-12-18 3:40 ` Orjan Friberg
1 sibling, 1 reply; 13+ messages in thread
From: Andrew Cagney @ 2001-12-18 3:22 UTC (permalink / raw)
To: Martin M. Hunt; +Cc: Orjan Friberg, gdb-patches
>
> 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);
>
>
If it does, feel free to check it, and any other related changes in :-)
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-18 3:22 ` Andrew Cagney
@ 2001-12-18 12:29 ` Martin M. Hunt
2001-12-19 15:32 ` Elena Zannoni
0 siblings, 1 reply; 13+ messages in thread
From: Martin M. Hunt @ 2001-12-18 12:29 UTC (permalink / raw)
To: Andrew Cagney; +Cc: Orjan Friberg, gdb-patches
Checked in.
Martin
On Tuesday 18 December 2001 03:21 am, Andrew Cagney wrote:
> > 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);
>
> If it does, feel free to check it, and any other related changes in :-)
>
>
> Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-18 12:29 ` Martin M. Hunt
@ 2001-12-19 15:32 ` Elena Zannoni
2001-12-20 3:39 ` Martin M. Hunt
0 siblings, 1 reply; 13+ messages in thread
From: Elena Zannoni @ 2001-12-19 15:32 UTC (permalink / raw)
To: Martin M. Hunt; +Cc: Andrew Cagney, Orjan Friberg, gdb-patches
Martin, I am getting these warnings on solaris (with ,-Werror):
cc1: warnings being treated as errors
/es/scratch/ezannoni/uberbaum/src/gdb/ser-tcp.c: In function `tcp_open':
/es/scratch/ezannoni/uberbaum/src/gdb/ser-tcp.c:154: warning: passing arg 4 of `getsockopt' from incompatible pointer type
make: *** [ser-tcp.o] Error 1
Elena
Martin M. Hunt writes:
> Checked in.
>
> Martin
>
> On Tuesday 18 December 2001 03:21 am, Andrew Cagney wrote:
> > > 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);
> >
> > If it does, feel free to check it, and any other related changes in :-)
> >
> >
> > Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-19 15:32 ` Elena Zannoni
@ 2001-12-20 3:39 ` Martin M. Hunt
2001-12-20 3:04 ` Andrew Cagney
0 siblings, 1 reply; 13+ messages in thread
From: Martin M. Hunt @ 2001-12-20 3:39 UTC (permalink / raw)
To: Elena Zannoni; +Cc: Andrew Cagney, gdb-patches
Those warnings were always there. My patch reverted those lines back
to what was there before. However, it does appear that changing the char *
cast to a void * would eliminate the warning and should probably work
everywhere. Systems that based their sockets on very old BSD have char *
instead of void * in their setsockopt prototypes.
I tested void * on Linux and Windows and neither complain. I have been
trying all day on a Solaris box, but it just can't seem to compile
GDB in less than a couple of days. How can a big Ultrasparc with
a load average of 0.08 take > 12 hours to build GDB???
Martin
On Wednesday 19 December 2001 02:45 pm, Elena Zannoni wrote:
> Martin, I am getting these warnings on solaris (with ,-Werror):
>
>
> cc1: warnings being treated as errors
> /es/scratch/ezannoni/uberbaum/src/gdb/ser-tcp.c: In function `tcp_open':
> /es/scratch/ezannoni/uberbaum/src/gdb/ser-tcp.c:154: warning: passing arg 4
> of `getsockopt' from incompatible pointer type make: *** [ser-tcp.o] Error
> 1
>
> Elena
>
> Martin M. Hunt writes:
> > Checked in.
> >
> > Martin
> >
> > On Tuesday 18 December 2001 03:21 am, Andrew Cagney wrote:
> > > > 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);
> > >
> > > If it does, feel free to check it, and any other related changes in
> > > :-)
> > >
> > >
> > > Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-20 3:39 ` Martin M. Hunt
@ 2001-12-20 3:04 ` Andrew Cagney
0 siblings, 0 replies; 13+ messages in thread
From: Andrew Cagney @ 2001-12-20 3:04 UTC (permalink / raw)
To: Martin M. Hunt; +Cc: Elena Zannoni, gdb-patches
> Those warnings were always there. My patch reverted those lines back
> to what was there before. However, it does appear that changing the char *
> cast to a void * would eliminate the warning and should probably work
> everywhere. Systems that based their sockets on very old BSD have char *
> instead of void * in their setsockopt prototypes.
Can I suggest either removing the cast or making it ``void *'' with a
comment to the effect that looser OS's such as solaris 2.5.1 have a
``char*'' as that argument.
Modern OS's and the Single UNIX spec have ``void *'' as the parameter -
I checked Red Hat 7.2 and NetBSD 1.5.2 and Solaris 2.7.
http://www.opengroup.org/onlinepubs/007908799/xns/getsockopt.html
> I tested void * on Linux and Windows and neither complain. I have been
> trying all day on a Solaris box, but it just can't seem to compile
> GDB in less than a couple of days. How can a big Ultrasparc with
> a load average of 0.08 take > 12 hours to build GDB???
configure appears to be getting really slow again :-/
Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [RFA] new tcp_open
2001-12-18 2:57 ` Martin M. Hunt
2001-12-18 3:22 ` Andrew Cagney
@ 2001-12-18 3:40 ` Orjan Friberg
1 sibling, 0 replies; 13+ messages in thread
From: Orjan Friberg @ 2001-12-18 3:40 UTC (permalink / raw)
To: Martin M. Hunt; +Cc: gdb-patches
"Martin M. Hunt" wrote:
>
> Please give this patch a try and see if it fixes the problem.
It does. Thanks a bunch.
--
Orjan Friberg
Axis Communications AB
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2001-12-20 11:39 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-12-03 11:18 [RFA] new tcp_open Martin M. Hunt
2001-12-03 12:02 ` Andrew Cagney
2001-12-03 13:26 ` Martin M. Hunt
2001-12-03 13:36 ` Andrew Cagney
2001-12-03 22:13 ` Martin M. Hunt
2001-12-18 2:41 ` Orjan Friberg
2001-12-18 2:57 ` Martin M. Hunt
2001-12-18 3:22 ` Andrew Cagney
2001-12-18 12:29 ` Martin M. Hunt
2001-12-19 15:32 ` Elena Zannoni
2001-12-20 3:39 ` Martin M. Hunt
2001-12-20 3:04 ` Andrew Cagney
2001-12-18 3:40 ` Orjan Friberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox