Øyvind Harboe wrote: > > double pointers are horrible. > > Ah, missed that. Well another patch is gladly accepted, meanwhile > it no longer crashes.
Fair. Two versions attached. One which makes the code two lines longer and avoids double pointers, and a remix which uses only a single double pointer and is net one line shorter. //Peter
>From 2794909b0654630d71fe0fd618d7188a450234c4 Mon Sep 17 00:00:00 2001 From: Peter Stuge <[email protected]> Date: Fri, 10 Dec 2010 08:19:23 +0100 Subject: [PATCH] jtag: Avoid double pointers when removing event callbacks --- src/jtag/core.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/jtag/core.c b/src/jtag/core.c index dfedc17..dd6c8d0 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -296,24 +296,26 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv) int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv) { - struct jtag_event_callback **p = &jtag_event_callbacks, *temp; + struct jtag_event_callback *p, *prev, *next; - if (callback == NULL) - { + if (!callback) return ERROR_INVALID_ARGUMENTS; - } - while (*p) + for (p = jtag_event_callbacks, prev = NULL, p, p = next) { - if (((*p)->priv != priv) || ((*p)->callback != callback)) + next = p->next; + + if (p->callback != callback || p->priv != priv) { - p = &(*p)->next; + prev = p; continue; } - temp = *p; - *p = (*p)->next; - free(temp); + if (prev) + prev->next = next; + else + jtag_event_callbacks = next; + free(p); } return ERROR_OK; -- 1.7.2
>From 1063bf4e9dcb722f39f015af47864b3583e6bdb1 Mon Sep 17 00:00:00 2001 From: Peter Stuge <[email protected]> Date: Fri, 10 Dec 2010 08:19:23 +0100 Subject: [PATCH] jtag: Use only one double pointer when removing event callbacks --- src/jtag/core.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/jtag/core.c b/src/jtag/core.c index dfedc17..6a97079 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -296,24 +296,23 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv) int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv) { - struct jtag_event_callback **p = &jtag_event_callbacks, *temp; + struct jtag_event_callback *p, *prev, *next; - if (callback == NULL) - { + if (!callback) return ERROR_INVALID_ARGUMENTS; - } - while (*p) + for (p = jtag_event_callbacks, prev = NULL, p, p = next) { - if (((*p)->priv != priv) || ((*p)->callback != callback)) + next = p->next; + + if (p->callback != callback || p->priv != priv) { - p = &(*p)->next; + prev = p; continue; } - temp = *p; - *p = (*p)->next; - free(temp); + *(prev ? &prev->next : &jtag_event_callbacks) = next; + free(p); } return ERROR_OK; -- 1.7.2
_______________________________________________ Openocd-development mailing list [email protected] https://lists.berlios.de/mailman/listinfo/openocd-development
