]> git.sur5r.net Git - openocd/commitdiff
- added patch for faster start of OpenOCD
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 10 Jan 2008 19:10:55 +0000 (19:10 +0000)
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 10 Jan 2008 19:10:55 +0000 (19:10 +0000)
(thanks to oyvind harboe for the patch)

git-svn-id: svn://svn.berlios.de/openocd/trunk@250 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/helper/command.c
src/helper/replacements.c

index adaad109344861ec48dbdd27f6e8cfc33ed9f129..e9ea06927759558e72a4189ce3e36ca361af92bd 100644 (file)
@@ -76,9 +76,15 @@ int build_unique_lengths(command_context_t *context, command_t *commands)
        return ERROR_OK;
 }
 
+/* Avoid evaluating this each time we add a command. Reduces overhead from O(n^2) to O(n). 
+ * Makes a difference on ARM7 types machines and is not observable on GHz machines.
+ */
+static int unique_length_dirty=1; 
+
 command_t* register_command(command_context_t *context, command_t *parent, char *name, int (*handler)(struct command_context_s *context, char* name, char** args, int argc), enum command_mode mode, char *help)
 {
        command_t *c, *p;
+       unique_length_dirty=1;
        
        if (!context || !name)
                return NULL;
@@ -127,14 +133,13 @@ command_t* register_command(command_context_t *context, command_t *parent, char
                }
        }
        
-       /* update unique lengths */
-       build_unique_lengths(context, (parent) ? parent : context->commands);
-       
        return c;
 }
 
 int unregister_command(command_context_t *context, char *name)
 {
+       unique_length_dirty=1;
+       
        command_t *c, *p = NULL, *c2;
        
        if ((!context) || (!name))
@@ -309,6 +314,13 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
 {
        command_t *c;
        
+       if (unique_length_dirty)
+       {
+               unique_length_dirty=0;
+               /* update unique lengths */
+               build_unique_lengths(context, context->commands);
+       }
+       
        for (c = commands; c; c = c->next)
        {
                if (strncasecmp(c->name, words[start_word], c->unique_len))
index 49f12d7844c73f0799755463b1be73249c7e0190..7a6729b8129f6938243f9f39022c2a4227453209 100644 (file)
@@ -24,6 +24,7 @@
 /* DANGER!!!! These must be defined *BEFORE* replacements.h and the malloc() macro!!!! */
 
 #include <stdlib.h>
+#include <string.h>
 #include <strings.h>
 /* 
  * clear_malloc