server: server loop will exhaust data inputs before sleeping
authorØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 15 Dec 2009 14:43:38 +0000 (15:43 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 16 Dec 2009 07:09:35 +0000 (08:09 +0100)
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>
src/server/server.c

index 75a6bed08be6dcb48532c4b7b10561e9031a5877..f762704dd3412f6c6761aeca0c14518311093626 100644 (file)
@@ -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)

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)