diff options
author | Øyvind Harboe <oyvind.harboe@zylin.com> | 2009-12-15 15:43:38 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2009-12-16 08:09:35 +0100 |
commit | 74ce435d97ca4f6f81645d755d04123f075aa42b (patch) | |
tree | 2b0233e145ef75f485050291928d7531fe7dd01a /src | |
parent | 4a2f4e34336dbb662a308e5a881edbba9f3657ec (diff) | |
download | openocd+libswd-74ce435d97ca4f6f81645d755d04123f075aa42b.tar.gz openocd+libswd-74ce435d97ca4f6f81645d755d04123f075aa42b.tar.bz2 openocd+libswd-74ce435d97ca4f6f81645d755d04123f075aa42b.tar.xz openocd+libswd-74ce435d97ca4f6f81645d755d04123f075aa42b.zip |
server: server loop will exhaust data inputs before sleeping
By exhausting data on input, the performance will be more
consistent + the code more clearly distinguishes between
polling and processing. A test showed gdb packet load
performance go from ~1550kByte/s to 1650kBytes/s + being
more stable.
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/server.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/src/server/server.c b/src/server/server.c index 75a6bed0..f762704d 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -292,9 +292,10 @@ int server_loop(struct command_context *command_context) { struct service *service; + bool poll = true; + /* used in select() */ fd_set read_fds; - struct timeval tv; int fd_max; /* used in accept() */ @@ -305,10 +306,6 @@ int server_loop(struct command_context *command_context) LOG_ERROR("couldn't set SIGPIPE to SIG_IGN"); #endif - /* do regular tasks after at most 10ms */ - tv.tv_sec = 0; - tv.tv_usec = 10000; - while (!shutdown_openocd) { /* monitor sockets for activity */ @@ -351,12 +348,24 @@ int server_loop(struct command_context *command_context) #endif #endif - openocd_sleep_prelude(); - kept_alive(); - - /* Only while we're sleeping we'll let others run */ - retval = socket_select(fd_max + 1, &read_fds, NULL, NULL, &tv); - openocd_sleep_postlude(); + struct timeval tv; + tv.tv_sec = 0; + if (poll) + { + /* we're just polling this iteration, this is faster on embedded + * hosts */ + tv.tv_usec = 0; + retval = socket_select(fd_max + 1, &read_fds, NULL, NULL, &tv); + } else + { + /* Every 100ms */ + tv.tv_usec = 100000; + /* Only while we're sleeping we'll let others run */ + openocd_sleep_prelude(); + kept_alive(); + retval = socket_select(fd_max + 1, &read_fds, NULL, NULL, &tv); + openocd_sleep_postlude(); + } if (retval == -1) { @@ -385,15 +394,20 @@ int server_loop(struct command_context *command_context) #endif } - target_call_timer_callbacks(); - process_jim_events(command_context); - if (retval == 0) { - /* do regular tasks after at most 100ms */ - tv.tv_sec = 0; - tv.tv_usec = 10000; + /* We only execute these callbacks when there was nothing to do or we timed out */ + target_call_timer_callbacks(); + process_jim_events(command_context); + FD_ZERO(&read_fds); /* eCos leaves read_fds unchanged in this case! */ + + /* We timed out/there was nothing to do, timeout rather than poll next time */ + poll = false; + } else + { + /* There was something to do, next time we'll just poll */ + poll = true; } for (service = services; service; service = service->next) |