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>
This commit is contained in:
parent
4a2f4e3433
commit
74ce435d97
|
@ -292,9 +292,10 @@ int server_loop(struct command_context *command_context)
|
||||||
{
|
{
|
||||||
struct service *service;
|
struct service *service;
|
||||||
|
|
||||||
|
bool poll = true;
|
||||||
|
|
||||||
/* used in select() */
|
/* used in select() */
|
||||||
fd_set read_fds;
|
fd_set read_fds;
|
||||||
struct timeval tv;
|
|
||||||
int fd_max;
|
int fd_max;
|
||||||
|
|
||||||
/* used in accept() */
|
/* used in accept() */
|
||||||
|
@ -305,10 +306,6 @@ int server_loop(struct command_context *command_context)
|
||||||
LOG_ERROR("couldn't set SIGPIPE to SIG_IGN");
|
LOG_ERROR("couldn't set SIGPIPE to SIG_IGN");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* do regular tasks after at most 10ms */
|
|
||||||
tv.tv_sec = 0;
|
|
||||||
tv.tv_usec = 10000;
|
|
||||||
|
|
||||||
while (!shutdown_openocd)
|
while (!shutdown_openocd)
|
||||||
{
|
{
|
||||||
/* monitor sockets for activity */
|
/* monitor sockets for activity */
|
||||||
|
@ -351,12 +348,24 @@ int server_loop(struct command_context *command_context)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
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();
|
openocd_sleep_prelude();
|
||||||
kept_alive();
|
kept_alive();
|
||||||
|
|
||||||
/* Only while we're sleeping we'll let others run */
|
|
||||||
retval = socket_select(fd_max + 1, &read_fds, NULL, NULL, &tv);
|
retval = socket_select(fd_max + 1, &read_fds, NULL, NULL, &tv);
|
||||||
openocd_sleep_postlude();
|
openocd_sleep_postlude();
|
||||||
|
}
|
||||||
|
|
||||||
if (retval == -1)
|
if (retval == -1)
|
||||||
{
|
{
|
||||||
|
@ -385,15 +394,20 @@ int server_loop(struct command_context *command_context)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (retval == 0)
|
||||||
|
{
|
||||||
|
/* We only execute these callbacks when there was nothing to do or we timed out */
|
||||||
target_call_timer_callbacks();
|
target_call_timer_callbacks();
|
||||||
process_jim_events(command_context);
|
process_jim_events(command_context);
|
||||||
|
|
||||||
if (retval == 0)
|
|
||||||
{
|
|
||||||
/* do regular tasks after at most 100ms */
|
|
||||||
tv.tv_sec = 0;
|
|
||||||
tv.tv_usec = 10000;
|
|
||||||
FD_ZERO(&read_fds); /* eCos leaves read_fds unchanged in this case! */
|
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)
|
for (service = services; service; service = service->next)
|
||||||
|
|
Loading…
Reference in New Issue