From 4e7d212bf6bce518acb127c5bef8e99da1c3ce8d Mon Sep 17 00:00:00 2001 From: Jim Quigley Date: Mon, 21 Sep 2020 12:03:06 +0100 Subject: [PATCH 1/3] fwk: Avoid duplicate calls in event framework If we know whether or not the therad is running in an interrupt context we don't need to check this again, saving a few cycles. Change-Id: I91e32ae0ec8c6f5dc5114f760fc764920c70e371 Signed-off-by: Jim Quigley --- framework/src/fwk_thread.c | 45 +++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/framework/src/fwk_thread.c b/framework/src/fwk_thread.c index e90e7f034..d62a64bfa 100644 --- a/framework/src/fwk_thread.c +++ b/framework/src/fwk_thread.c @@ -41,6 +41,12 @@ enum wait_states { WAITING_FOR_RESPONSE = 1, }; +enum thread_interrupt_states { + UNKNOWN_THREAD = 0, + INTERRUPT_THREAD = 1, + NOT_INTERRUPT_THREAD = 2, +}; + /* * Static functions */ @@ -79,11 +85,14 @@ static struct fwk_event *duplicate_event(struct fwk_event *event) return allocated_event; } -static int put_event(struct fwk_event *event) +static int put_event( + struct fwk_event *event, + enum thread_interrupt_states intr_state) { struct fwk_event *allocated_event; unsigned int interrupt; bool is_wakeup_event = false; + int status; if (event->is_delayed_response) { allocated_event = __fwk_thread_search_delayed_response( @@ -117,7 +126,14 @@ static int put_event(struct fwk_event *event) if (is_wakeup_event) ctx.cookie = event->cookie; - if (fwk_interrupt_get_current(&interrupt) != FWK_SUCCESS) + if (intr_state == UNKNOWN_THREAD) { + status = fwk_interrupt_get_current(&interrupt); + if (status != FWK_SUCCESS) + intr_state = NOT_INTERRUPT_THREAD; + else + intr_state = INTERRUPT_THREAD; + } + if (intr_state == NOT_INTERRUPT_THREAD) fwk_list_push_tail(&ctx.event_queue, &allocated_event->slist_node); else fwk_list_push_tail(&ctx.isr_event_queue, &allocated_event->slist_node); @@ -179,7 +195,7 @@ static void process_next_event(void) async_response_event.is_response = true; async_response_event.response_requested = false; if (!async_response_event.is_delayed_response) - put_event(&async_response_event); + put_event(&async_response_event, UNKNOWN_THREAD); else { allocated_event = duplicate_event(&async_response_event); if (allocated_event != NULL) { @@ -284,7 +300,7 @@ int __fwk_thread_put_notification(struct fwk_event *event) event->is_response = false; event->is_notification = true; - return put_event(event); + return put_event(event, UNKNOWN_THREAD); } #endif @@ -296,6 +312,7 @@ int fwk_thread_put_event(struct fwk_event *event) { int status = FWK_E_PARAM; unsigned int interrupt; + enum thread_interrupt_states intr_state; if (!ctx.initialized) { status = FWK_E_INIT; @@ -305,12 +322,20 @@ int fwk_thread_put_event(struct fwk_event *event) if (event == NULL) goto error; - if ((fwk_interrupt_get_current(&interrupt) != FWK_SUCCESS) && - (ctx.current_event != NULL)) + status = fwk_interrupt_get_current(&interrupt); + if (status != FWK_SUCCESS) + intr_state = NOT_INTERRUPT_THREAD; + else + intr_state = INTERRUPT_THREAD; + + if ((intr_state == NOT_INTERRUPT_THREAD) && (ctx.current_event != NULL)) event->source_id = ctx.current_event->target_id; - else if (!fwk_module_is_valid_entity_id(event->source_id)) + else if (!fwk_module_is_valid_entity_id(event->source_id)) { + status = FWK_E_PARAM; goto error; + } + status = FWK_E_PARAM; if (event->is_notification) { if (!fwk_module_is_valid_notification_id(event->id)) goto error; @@ -335,7 +360,7 @@ int fwk_thread_put_event(struct fwk_event *event) } } - return put_event(event); + return put_event(event, intr_state); error: FWK_LOG_CRIT(err_msg_func, status, __func__); @@ -403,7 +428,7 @@ int fwk_thread_put_event_and_wait(struct fwk_event *event, event->response_requested = true; event->is_notification = false; - status = put_event(event); + status = put_event(event, NOT_INTERRUPT_THREAD); if (status != FWK_SUCCESS) goto exit; @@ -454,7 +479,7 @@ int fwk_thread_put_event_and_wait(struct fwk_event *event, response_event.is_response = true; response_event.response_requested = false; if (!response_event.is_delayed_response) { - status = put_event(&response_event); + status = put_event(&response_event, UNKNOWN_THREAD); if (status != FWK_SUCCESS) goto exit; ctx.cookie = response_event.cookie; -- GitLab From 7f782efa6f5e9f74cb5aeb08ecf282364f16c901 Mon Sep 17 00:00:00 2001 From: Jim Quigley Date: Mon, 21 Sep 2020 13:13:11 +0100 Subject: [PATCH 2/3] fwk: Some checks in event handling should be for DEBUG builds only We can remove some of the data checking in the event handler for release builds, saving a few cycles. Change-Id: Ie77a35de5cacdc9f13fa690e75a9d5d12999d4e8 Signed-off-by: Jim Quigley --- framework/src/fwk_thread.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/src/fwk_thread.c b/framework/src/fwk_thread.c index d62a64bfa..e3bed4528 100644 --- a/framework/src/fwk_thread.c +++ b/framework/src/fwk_thread.c @@ -314,6 +314,7 @@ int fwk_thread_put_event(struct fwk_event *event) unsigned int interrupt; enum thread_interrupt_states intr_state; +#ifdef BUILD_MODE_DEBUG if (!ctx.initialized) { status = FWK_E_INIT; goto error; @@ -321,6 +322,7 @@ int fwk_thread_put_event(struct fwk_event *event) if (event == NULL) goto error; +#endif status = fwk_interrupt_get_current(&interrupt); if (status != FWK_SUCCESS) @@ -335,6 +337,7 @@ int fwk_thread_put_event(struct fwk_event *event) goto error; } +#ifdef BUILD_MODE_DEBUG status = FWK_E_PARAM; if (event->is_notification) { if (!fwk_module_is_valid_notification_id(event->id)) @@ -359,6 +362,7 @@ int fwk_thread_put_event(struct fwk_event *event) goto error; } } +#endif return put_event(event, intr_state); @@ -376,9 +380,10 @@ int fwk_thread_put_event_and_wait(struct fwk_event *event, struct fwk_event response_event; struct fwk_event *next_event; struct fwk_event *allocated_event; - unsigned int interrupt; int status = FWK_E_PARAM; enum wait_states wait_state = WAITING_FOR_EVENT; +#ifdef BUILD_MODE_DEBUG + unsigned int interrupt; if (!ctx.initialized) { status = FWK_E_INIT; @@ -395,6 +400,7 @@ int fwk_thread_put_event_and_wait(struct fwk_event *event, status = FWK_E_STATE; goto error; } +#endif if (ctx.current_event != NULL) event->source_id = ctx.current_event->target_id; -- GitLab From b1bf8454f2834eacdaad831b54d1304d523ca9af Mon Sep 17 00:00:00 2001 From: Jim Quigley Date: Wed, 23 Sep 2020 09:44:25 +0100 Subject: [PATCH 3/3] fwk: Remove excessive output from event handling This patch removes an error message which does not provide much insight but is regularly emitted. Change-Id: I0bba3d31a34e77bfc4a971c8f4269e526857b9de Signed-off-by: Jim Quigley --- framework/src/fwk_thread.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/fwk_thread.c b/framework/src/fwk_thread.c index e3bed4528..dbcee42dd 100644 --- a/framework/src/fwk_thread.c +++ b/framework/src/fwk_thread.c @@ -207,7 +207,8 @@ static void process_next_event(void) } } else { status = process_event(event, &async_response_event); - if ((status != FWK_SUCCESS) && (status != FWK_PENDING)) { + if ((status != FWK_SUCCESS) && (status != FWK_PENDING) && + (status != FWK_E_PARAM)) { FWK_LOG_CRIT( "[FWK] Process event (%s: %s -> %s) (%d)\n", FWK_ID_STR(event->id), -- GitLab