diff --git a/framework/src/fwk_thread.c b/framework/src/fwk_thread.c index e90e7f0340f67a06c698926f1cf3a3f2c59b4300..dbcee42ddf8f37cc7632a5ce7f288070e3b3f0c9 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) { @@ -191,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), @@ -284,7 +301,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,7 +313,9 @@ int fwk_thread_put_event(struct fwk_event *event) { int status = FWK_E_PARAM; unsigned int interrupt; + enum thread_interrupt_states intr_state; +#ifdef BUILD_MODE_DEBUG if (!ctx.initialized) { status = FWK_E_INIT; goto error; @@ -304,13 +323,23 @@ int fwk_thread_put_event(struct fwk_event *event) if (event == NULL) goto error; +#endif - 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; + } +#ifdef BUILD_MODE_DEBUG + status = FWK_E_PARAM; if (event->is_notification) { if (!fwk_module_is_valid_notification_id(event->id)) goto error; @@ -334,8 +363,9 @@ int fwk_thread_put_event(struct fwk_event *event) goto error; } } +#endif - return put_event(event); + return put_event(event, intr_state); error: FWK_LOG_CRIT(err_msg_func, status, __func__); @@ -351,9 +381,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; @@ -370,6 +401,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; @@ -403,7 +435,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 +486,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;