From: Øyvind H. <go...@us...> - 2009-12-16 08:12:20
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 74ce435d97ca4f6f81645d755d04123f075aa42b (commit) from 4a2f4e34336dbb662a308e5a881edbba9f3657ec (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 74ce435d97ca4f6f81645d755d04123f075aa42b Author: Ãyvind Harboe <oyv...@zy...> Date: Tue Dec 15 15:43:38 2009 +0100 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 <oyv...@zy...> diff --git a/src/server/server.c b/src/server/server.c index 75a6bed..f762704 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) ----------------------------------------------------------------------- Summary of changes: src/server/server.c | 48 +++++++++++++++++++++++++++++++----------------- 1 files changed, 31 insertions(+), 17 deletions(-) hooks/post-receive -- Main OpenOCD repository |