diff --git a/kernel/sem.c b/kernel/sem.c index 78e93adb62c..6821b793d8d 100644 --- a/kernel/sem.c +++ b/kernel/sem.c @@ -66,17 +66,21 @@ int z_impl_k_sem_init(struct k_sem *sem, unsigned int initial_count, * Limit cannot be zero and count cannot be greater than limit */ CHECKIF(limit == 0U || limit > K_SEM_MAX_LIMIT || initial_count > limit) { + SYS_PORT_TRACING_OBJ_FUNC(k_sem, init, sem, -EINVAL); + return -EINVAL; } sem->count = initial_count; sem->limit = limit; + + SYS_PORT_TRACING_OBJ_FUNC(k_sem, init, sem, 0); + sys_trace_semaphore_init(sem); z_waitq_init(&sem->wait_q); #if defined(CONFIG_POLL) sys_dlist_init(&sem->poll_events); #endif - SYS_TRACING_OBJ_INIT(k_sem, sem); z_object_init(sem); @@ -109,6 +113,8 @@ void z_impl_k_sem_give(struct k_sem *sem) k_spinlock_key_t key = k_spin_lock(&lock); struct k_thread *thread; + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_sem, give, sem); + sys_trace_semaphore_give(sem); thread = z_unpend_first_thread(&sem->wait_q); @@ -121,6 +127,9 @@ void z_impl_k_sem_give(struct k_sem *sem) } z_reschedule(&lock, key); + + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_sem, give, sem); + sys_trace_end_call(SYS_TRACE_ID_SEMA_GIVE); } @@ -141,6 +150,9 @@ int z_impl_k_sem_take(struct k_sem *sem, k_timeout_t timeout) K_TIMEOUT_EQ(timeout, K_NO_WAIT)), ""); k_spinlock_key_t key = k_spin_lock(&lock); + + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_sem, take, sem, timeout); + sys_trace_semaphore_take(sem); if (likely(sem->count > 0U)) { @@ -156,9 +168,13 @@ int z_impl_k_sem_take(struct k_sem *sem, k_timeout_t timeout) goto out; } + SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_sem, take, sem, timeout); + ret = z_pend_curr(&lock, key, &sem->wait_q, timeout); out: + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_sem, take, sem, timeout, ret); + sys_trace_end_call(SYS_TRACE_ID_SEMA_TAKE); return ret; } @@ -177,6 +193,9 @@ void z_impl_k_sem_reset(struct k_sem *sem) z_ready_thread(thread); } sem->count = 0; + + SYS_PORT_TRACING_OBJ_FUNC(k_sem, reset, sem); + handle_poll_events(sem); z_reschedule(&lock, key);