From 0d4f8fc824c1d07cf385b13483f703456322d4ae Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 7 Apr 2008 17:29:21 +0000 Subject: Spen fixed various issues w.r.t. setting up the sockets for optimal performance. git-svn-id: svn://svn.berlios.de/openocd/trunk@545 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/server/gdb_server.c | 4 ---- src/server/server.c | 50 ++++++++++++++++++++++--------------------------- 2 files changed, 22 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 6ac9364d..9a5b81a4 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -90,7 +90,6 @@ int gdb_last_signal(target_t *target) } } -#ifndef _WIN32 int check_pending(connection_t *connection, int timeout_s, int *got_data) { /* a non-blocking socket will block if there is 0 bytes available on the socket, @@ -131,7 +130,6 @@ int check_pending(connection_t *connection, int timeout_s, int *got_data) *got_data=FD_ISSET(connection->fd, &read_fds)!=0; return ERROR_OK; } -#endif int gdb_get_char(connection_t *connection, int* next_char) { @@ -159,11 +157,9 @@ int gdb_get_char(connection_t *connection, int* next_char) for (;;) { -#ifndef _WIN32 retval=check_pending(connection, 1, NULL); if (retval!=ERROR_OK) return retval; -#endif gdb_con->buf_cnt = read_socket(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE); if (gdb_con->buf_cnt > 0) { diff --git a/src/server/server.c b/src/server/server.c index 33bf00cf..21a8ebab 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -52,9 +52,7 @@ int add_connection(service_t *service, command_context_t *cmd_ctx) unsigned int address_size; connection_t *c, **p; int retval; -#ifndef _WIN32 int flag=1; -#endif c = malloc(sizeof(connection_t)); c->fd = -1; @@ -66,34 +64,17 @@ int add_connection(service_t *service, command_context_t *cmd_ctx) c->next = NULL; address_size = sizeof(c->sin); -#ifndef _WIN32 - int segsize=65536; - setsockopt(service->fd, IPPROTO_TCP, TCP_MAXSEG, &segsize, sizeof(int)); - int window_size = 128 * 1024; - - /* These setsockopt()s must happen before the accept() */ - - setsockopt(service->fd, SOL_SOCKET, SO_SNDBUF, - (char *) &window_size, sizeof(window_size)); - - setsockopt(service->fd, SOL_SOCKET, SO_RCVBUF, - (char *) &window_size, sizeof(window_size)); -#endif c->fd = accept(service->fd, (struct sockaddr *)&service->sin, &address_size); -#ifndef _WIN32 - // This increases performance dramatically for e.g. GDB load which - // does not have a sliding window protocol. - retval=setsockopt(c->fd, /* socket affected */ - IPPROTO_TCP, /* set option at TCP level */ - TCP_NODELAY, /* name of option */ - (char *) &flag, /* the cast is historical - cruft */ - sizeof(int)); /* length of option value */ - setsockopt(c->fd, IPPROTO_TCP, TCP_MAXSEG, &segsize, sizeof(int)); -#endif - - + + /* This increases performance dramatically for e.g. GDB load which + * does not have a sliding window protocol. */ + retval=setsockopt(c->fd, /* socket affected */ + IPPROTO_TCP, /* set option at TCP level */ + TCP_NODELAY, /* name of option */ + (char *)&flag, /* the cast is historical cruft */ + sizeof(int)); /* length of option value */ + LOG_INFO("accepting '%s' connection from %i", service->name, c->sin.sin_port); if ((retval = service->new_connection(c)) == ERROR_OK) { @@ -184,6 +165,19 @@ int add_service(char *name, enum connection_type type, unsigned short port, int exit(-1); } +#ifndef _WIN32 + int segsize=65536; + setsockopt(c->fd, IPPROTO_TCP, TCP_MAXSEG, &segsize, sizeof(int)); +#endif + int window_size = 128 * 1024; + + /* These setsockopt()s must happen before the listen() */ + + setsockopt(c->fd, SOL_SOCKET, SO_SNDBUF, + (char *)&window_size, sizeof(window_size)); + setsockopt(c->fd, SOL_SOCKET, SO_RCVBUF, + (char *)&window_size, sizeof(window_size)); + if (listen(c->fd, 1) == -1) { LOG_ERROR("couldn't listen on socket: %s", strerror(errno)); -- cgit v1.2.3