Committed.

- Fixed regression introduced in 890 when "fixing warnings" for
target_call_timer_callbacks_now().
target_call_timer_callbacks_now() did the same as target_call_timer_callbacks().

- Reduced keep_alive()'s job to only deal with GDB keep  alive problems.


Index: C:/workspace/openocd/src/helper/log.c
===================================================================
--- C:/workspace/openocd/src/helper/log.c       (revision 983)
+++ C:/workspace/openocd/src/helper/log.c       (working copy)
@@ -61,14 +61,14 @@
 static int count = 0;

 /* The log_puts() serves to somewhat different goals:
- *
+ *
  * - logging
  * - feeding low-level info to the user in GDB or Telnet
- *
+ *
  * The latter dictates that strings without newline are not logged, lest there
- * will be *MANY log lines when sending one char at the time(e.g.
+ * will be *MANY log lines when sending one char at the time(e.g.
  * target_request.c).
- *
+ *
  */
 static void log_puts(enum log_levels level, const char *file, int
line, const char *function, const char *string)
 {
@@ -91,7 +91,7 @@
                {
                        /* print with count and time information */
                        int t=(int)(timeval_ms()-start);
-#if PRINT_MEM()        
+#if PRINT_MEM()
                        struct mallinfo info;
                        info = mallinfo();
 #endif
@@ -99,7 +99,7 @@
 #if PRINT_MEM()
                                        " %d"
 #endif
-                                       ": %s", log_strings[level+1], count, t, 
file, line, function,
+                                       ": %s", log_strings[level+1], count, t, 
file, line, function,
 #if PRINT_MEM()
                                        info.fordblks,
 #endif
@@ -116,7 +116,7 @@
                }
        } else
        {
-               /* only entire lines are logged. Otherwise it's
+               /* only entire lines are logged. Otherwise it's
                 * single chars intended for the log callbacks. */
        }

@@ -121,7 +121,7 @@
        }

        fflush(log_output);
-       
+
        /* Never forward LOG_LVL_DEBUG, too verbose and they can be found in
the log if need be */
        if (level <= LOG_LVL_INFO)
        {
@@ -154,7 +154,7 @@
                log_puts(level, file, line, function, string);
                free(string);
        }
-       
+
        va_end(ap);
 }

@@ -166,9 +166,9 @@
        count++;
        if (level > debug_level)
                return;
-       
+
        va_start(ap, format);
-       
+
        string = alloc_vprintf(format, ap);
        if (string != NULL)
        {
@@ -176,7 +176,7 @@
                log_puts(level, file, line, function, string);
                free(string);
        }
-       
+
        va_end(ap);
 }

@@ -208,7 +208,7 @@
        if (argc == 1)
        {
                FILE* file = fopen(args[0], "w");
-               
+
                if (file)
                {
                        log_output = file;
@@ -234,7 +234,7 @@
        /* set defaults for daemon configuration, if not set by cmdline or 
cfgfile */
        if (debug_level == -1)
                debug_level = LOG_LVL_INFO;
-       
+
        if (log_output == NULL)
        {
                log_output = stderr;
@@ -239,12 +239,12 @@
        {
                log_output = stderr;
        }
-       
+
        start=last_time=timeval_ms();
-       
+
        return ERROR_OK;
 }
-       
+
 int set_log_output(struct command_context_s *cmd_ctx, FILE *output)
 {
        log_output = output;
@@ -299,7 +299,7 @@
 {
        /* no buffer at the beginning, force realloc to do the job */
        char *string = NULL;
-       
+
        /* start with buffer size suitable for typical messages */
        int size = 128;

@@ -326,7 +326,7 @@
                /* there was just enough or not enough space, allocate more in 
the
next round */
                size *= 2; /* double the buffer size */
        }
-       
+
        /* the returned buffer is by principle guaranteed to be at least one
character longer */
        return string;
 }
@@ -343,10 +343,10 @@

 /* Code must return to the server loop before 1000ms has returned or invoke
  * this function.
- *
+ *
  * The GDB connection will time out if it spends >2000ms and you'll get nasty
  * error messages from GDB:
- *
+ *
  * Ignoring packet error, continuing...
  * Reply contains invalid hex digit 116
  *
@@ -354,13 +354,13 @@
  * in GDB, OpenOCD guarantees that it sends keep-alive packages on the
  * GDB protocol and it is a bug in OpenOCD not to either return to the server
  * loop or invoke keep_alive() every 1000ms.
- *
+ *
  * This function will send a keep alive packet if >500ms has passed
since last time
  * it was invoked.
- *
+ *
  * Note that this function can be invoked often, so it needs to be relatively
  * fast when invoked more often than every 500ms.
- *
+ *
  */
 void keep_alive()
 {
@@ -367,8 +367,8 @@
        current_time=timeval_ms();
        if (current_time-last_time>1000)
        {
-               LOG_WARNING("BUG: keep_alive() was not invoked in the 1000ms
timelimit. GDB alive packet not sent! (%lld)",
current_time-last_time);
-       }
+               LOG_WARNING("BUG: keep_alive() was not invoked in the 1000ms
timelimit. GDB alive packet not sent! (%lld)",
current_time-last_time);
+       }
        if (current_time-last_time>500)
        {
                /* this will keep the GDB connection alive */
@@ -374,14 +374,14 @@
                /* this will keep the GDB connection alive */
                LOG_USER_N("%s", "");

-               /* also process TCL events (we have to do this from 'log.c' 
since its
-                * keep_alive() is the only routine guaranteed to be called at 
least
-                * once per second :( */
-               process_jim_events ();
+               /* DANGER!!!! do not add code to invoke e.g. target event 
processing,
+                * jim timer processing, etc. it can cause infinite recursion +
+                * jim event callbacks need to happen at a well defined time,
+                * not anywhere keep_alive() is invoked.
+                *
+                * These functions should be invoked at a well defined spot in 
server.c
+                */

-        /* process any timer events now */             
-               target_call_timer_callbacks_now();
-               
                last_time=current_time;
        }
 }
Index: C:/workspace/openocd/src/target/target.c
===================================================================
--- C:/workspace/openocd/src/target/target.c    (revision 984)
+++ C:/workspace/openocd/src/target/target.c    (working copy)
@@ -812,6 +812,8 @@
        target_timer_callback_t *next_callback;
        struct timeval now;

+       keep_alive();
+
        gettimeofday(&now, NULL);

        while (callback)
@@ -856,7 +858,7 @@
 /* invoke periodic callbacks immediately */
 int target_call_timer_callbacks_now(void)
 {
-       return target_call_timer_callbacks();
+       return target_call_timer_callbacks_check_time(0);
 }

 int target_alloc_working_area(struct target_s *target, u32 size,
working_area_t **area)


-- 
Øyvind Harboe
http://www.zylin.com/zy1000.html
ARM7 ARM9 XScale Cortex
JTAG debugger and flash programmer
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to