X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=173beb8656f08ffb4b4d0c37ea5ddbaa03fbd8b6;hb=c6e323b9838254b338310ec165a5345635c5d177;hp=a02d4a5c3e4b8b4979d46ff6cf909657c82cdb9d;hpb=7b2906de246bc37af99d432b3edf12e9f5f63521;p=openocd diff --git a/src/server/server.c b/src/server/server.c index a02d4a5c..173beb86 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -28,7 +28,7 @@ #endif #include "server.h" -#include "target.h" +#include #include "openocd.h" #include "tcl_server.h" #include "telnet_server.h" @@ -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 (); - 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) @@ -487,8 +501,12 @@ void sig_handler(int sig) { } #endif -int server_init(struct command_context *cmd_ctx) +int server_preinit(void) { + /* this currently only calls WSAStartup on native win32 systems + * before any socket operations are performed. + * This is an issue if you call init in your config script */ + #ifdef _WIN32 WORD wVersionRequested; WSADATA wsaData; @@ -518,6 +536,11 @@ int server_init(struct command_context *cmd_ctx) signal(SIGABRT, sig_handler); #endif + return ERROR_OK; +} + +int server_init(struct command_context *cmd_ctx) +{ int ret = tcl_init(cmd_ctx); if (ERROR_OK != ret) return ret; @@ -540,9 +563,11 @@ int server_quit(void) /* tell the server we want to shut down */ COMMAND_HANDLER(handle_shutdown_command) { + LOG_USER("shutdown command invoked"); + shutdown_openocd = 1; - return ERROR_COMMAND_CLOSE_CONNECTION; + return ERROR_OK; } static const struct command_registration server_command_handlers[] = {