summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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
commit74ce435d97ca4f6f81645d755d04123f075aa42b (patch)
tree2b0233e145ef75f485050291928d7531fe7dd01a /src
parent4a2f4e34336dbb662a308e5a881edbba9f3657ec (diff)
downloadopenocd_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.c48
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)