target memory allocation can be implemented not to show
bogus error messages.

E.g. when trying a big allocation first and then a
smaller one if that fails.

Signed-off-by: Øyvind Harboe <[email protected]>
---
 src/target/target.c |   17 ++++++++++++++---
 src/target/target.h |    8 ++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/target/target.c b/src/target/target.c
index 73594fb..a3a1b0a 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1111,7 +1111,7 @@ int target_call_timer_callbacks_now(void)
        return target_call_timer_callbacks_check_time(0);
 }
 
-int target_alloc_working_area(struct target *target, uint32_t size, struct 
working_area **area)
+int target_alloc_working_area_try(struct target *target, uint32_t size, struct 
working_area **area)
 {
        struct working_area *c = target->working_areas;
        struct working_area *new_wa = NULL;
@@ -1189,8 +1189,6 @@ int target_alloc_working_area(struct target *target, 
uint32_t size, struct worki
 
                if (free_size < size)
                {
-                       LOG_WARNING("not enough working area 
available(requested %u, free %u)",
-                                   (unsigned)(size), (unsigned)(free_size));
                        return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
                }
 
@@ -1231,6 +1229,19 @@ int target_alloc_working_area(struct target *target, 
uint32_t size, struct worki
        return ERROR_OK;
 }
 
+int target_alloc_working_area(struct target *target, uint32_t size, struct 
working_area **area)
+{
+       int retval;
+
+       retval = target_alloc_working_area_try(target, size, area);
+       if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
+       {
+               LOG_WARNING("not enough working area available(requested %u)", 
(unsigned)(size));
+       }
+       return retval;
+
+}
+
 static int target_free_working_area_restore(struct target *target, struct 
working_area *area, int restore)
 {
        if (area->free)
diff --git a/src/target/target.h b/src/target/target.h
index 0292945..4a48e5a 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -452,6 +452,14 @@ const char *target_state_name( struct target *target );
  */
 int target_alloc_working_area(struct target *target,
                uint32_t size, struct working_area **area);
+/* Same as target_alloc_working_area, except that no error is logged
+ * when ERROR_TARGET_RESOURCE_NOT_AVAILABLE is returned.
+ *
+ * This allows the calling code to *try* to allocate target memory
+ * and have a fallback to another behavior(slower?).
+ */
+int target_alloc_working_area_try(struct target *target,
+               uint32_t size, struct working_area **area);
 int target_free_working_area(struct target *target, struct working_area *area);
 void target_free_all_working_areas(struct target *target);
 
-- 
1.6.3.3

_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to