diff --git a/include/tracing/tracing.h b/include/tracing/tracing.h index 896c54cdf6d..44ffbeb8e20 100644 --- a/include/tracing/tracing.h +++ b/include/tracing/tracing.h @@ -256,6 +256,73 @@ */ /* end of mutex_tracing_apis */ + + +/** + * @brief Conditional Variable Tracing APIs + * @defgroup condvar_tracing_apis Conditional Variable Tracing APIs + * @ingroup tracing_apis + * @{ + */ + +/** + * @brief Trace initialization of Conditional Variable + * @param condvar Conditional Variable object + * @param ret Return value + */ +#define sys_port_trace_k_condvar_init(condvar, ret) + +/** + * @brief Trace Conditional Variable signaling start + * @param condvar Conditional Variable object + */ +#define sys_port_trace_k_condvar_signal_enter(condvar) + +/** + * @brief Trace Conditional Variable signaling blocking + * @param condvar Conditional Variable object + * @param timeout Timeout period + */ +#define sys_port_trace_k_condvar_signal_blocking(condvar, timeout) + +/** + * @brief Trace Conditional Variable signaling outcome + * @param condvar Conditional Variable object + * @param ret Return value + */ +#define sys_port_trace_k_condvar_signal_exit(condvar, ret) + +/** + * @brief Trace Conditional Variable broadcast enter + * @param condvar Conditional Variable object + */ +#define sys_port_trace_k_condvar_broadcast_enter(condvar) + +/** + * @brief Trace Conditional Variable broadcast exit + * @param condvar Conditional Variable object + * @param ret Return value + */ +#define sys_port_trace_k_condvar_broadcast_exit(condvar, ret) + +/** + * @brief Trace Conditional Variable wait enter + * @param condvar Conditional Variable object + */ +#define sys_port_trace_k_condvar_wait_enter(condvar) + +/** + * @brief Trace Conditional Variable wait exit + * @param condvar Conditional Variable object + * @param ret Return value + */ +#define sys_port_trace_k_condvar_wait_exit(condvar, ret) + +/** + * @} + */ /* end of condvar_tracing_apis */ + + /** * @} */ diff --git a/kernel/condvar.c b/kernel/condvar.c index 861e5f0bbda..53ce88beb3a 100644 --- a/kernel/condvar.c +++ b/kernel/condvar.c @@ -17,6 +17,9 @@ int z_impl_k_condvar_init(struct k_condvar *condvar) { z_waitq_init(&condvar->wait_q); z_object_init(condvar); + + SYS_PORT_TRACING_OBJ_INIT(k_condvar, condvar, 0); + return 0; } @@ -32,15 +35,23 @@ int z_vrfy_k_condvar_init(struct k_condvar *condvar) int z_impl_k_condvar_signal(struct k_condvar *condvar) { k_spinlock_key_t key = k_spin_lock(&lock); + + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, signal, condvar); + struct k_thread *thread = z_unpend_first_thread(&condvar->wait_q); if (thread != NULL) { + SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_condvar, signal, condvar, K_FOREVER); + arch_thread_return_value_set(thread, 0); z_ready_thread(thread); z_reschedule(&lock, key); } else { k_spin_unlock(&lock, key); } + + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, signal, condvar, 0); + return 0; } @@ -61,6 +72,8 @@ int z_impl_k_condvar_broadcast(struct k_condvar *condvar) key = k_spin_lock(&lock); + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, broadcast, condvar); + /* wake up any threads that are waiting to write */ while ((pending_thread = z_unpend_first_thread(&condvar->wait_q)) != NULL) { @@ -69,6 +82,8 @@ int z_impl_k_condvar_broadcast(struct k_condvar *condvar) z_ready_thread(pending_thread); } + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, broadcast, condvar, woken); + z_reschedule(&lock, key); return woken; @@ -88,12 +103,16 @@ int z_impl_k_condvar_wait(struct k_condvar *condvar, struct k_mutex *mutex, k_spinlock_key_t key; int ret; + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_condvar, wait, condvar); + key = k_spin_lock(&lock); k_mutex_unlock(mutex); ret = z_pend_curr(&lock, key, &condvar->wait_q, timeout); k_mutex_lock(mutex, K_FOREVER); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_condvar, wait, condvar, ret); + return ret; } #ifdef CONFIG_USERSPACE