Tracing: Conditional variable tracing

Add conditional variable tracing hooks, default tracing hooks,
and documentation.

Signed-off-by: Torbjörn Leksell <torbjorn.leksell@percepio.com>
This commit is contained in:
Torbjörn Leksell 2021-03-26 10:37:05 +01:00 committed by Anas Nashif
commit b93ff29e4b
2 changed files with 86 additions and 0 deletions

View file

@ -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 */
/**
* @}
*/

View file

@ -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