|
|
|
@ -73,13 +73,12 @@ int z_impl_k_mutex_init(struct k_mutex *mutex)
@@ -73,13 +73,12 @@ int z_impl_k_mutex_init(struct k_mutex *mutex)
|
|
|
|
|
mutex->owner = NULL; |
|
|
|
|
mutex->lock_count = 0U; |
|
|
|
|
|
|
|
|
|
sys_trace_mutex_init(mutex); |
|
|
|
|
|
|
|
|
|
z_waitq_init(&mutex->wait_q); |
|
|
|
|
|
|
|
|
|
SYS_TRACING_OBJ_INIT(k_mutex, mutex); |
|
|
|
|
z_object_init(mutex); |
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_INIT); |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_INIT(k_mutex, mutex, 0); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -124,7 +123,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
@@ -124,7 +123,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
|
|
|
|
|
|
|
|
|
|
__ASSERT(!arch_is_in_isr(), "mutexes cannot be used inside ISRs"); |
|
|
|
|
|
|
|
|
|
sys_trace_mutex_lock(mutex); |
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_mutex, lock, mutex, timeout); |
|
|
|
|
|
|
|
|
|
key = k_spin_lock(&lock); |
|
|
|
|
|
|
|
|
|
if (likely((mutex->lock_count == 0U) || (mutex->owner == _current))) { |
|
|
|
@ -141,17 +141,22 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
@@ -141,17 +141,22 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
|
|
|
|
|
mutex->owner_orig_prio); |
|
|
|
|
|
|
|
|
|
k_spin_unlock(&lock, key); |
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, 0); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (unlikely(K_TIMEOUT_EQ(timeout, K_NO_WAIT))) { |
|
|
|
|
k_spin_unlock(&lock, key); |
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, -EBUSY); |
|
|
|
|
|
|
|
|
|
return -EBUSY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_mutex, lock, mutex, timeout); |
|
|
|
|
|
|
|
|
|
new_prio = new_prio_for_inheritance(_current->base.prio, |
|
|
|
|
mutex->owner->base.prio); |
|
|
|
|
|
|
|
|
@ -169,7 +174,7 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
@@ -169,7 +174,7 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
|
|
|
|
|
got_mutex ? 'y' : 'n'); |
|
|
|
|
|
|
|
|
|
if (got_mutex == 0) { |
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); |
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, 0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -195,7 +200,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
@@ -195,7 +200,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
|
|
|
|
|
k_spin_unlock(&lock, key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); |
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, -EAGAIN); |
|
|
|
|
|
|
|
|
|
return -EAGAIN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -215,13 +221,19 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
@@ -215,13 +221,19 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
|
|
|
|
|
|
|
|
|
|
__ASSERT(!arch_is_in_isr(), "mutexes cannot be used inside ISRs"); |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_mutex, unlock, mutex); |
|
|
|
|
|
|
|
|
|
CHECKIF(mutex->owner == NULL) { |
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, -EINVAL); |
|
|
|
|
|
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
/*
|
|
|
|
|
* The current thread does not own the mutex. |
|
|
|
|
*/ |
|
|
|
|
CHECKIF(mutex->owner != _current) { |
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, -EPERM); |
|
|
|
|
|
|
|
|
|
return -EPERM; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -233,7 +245,6 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
@@ -233,7 +245,6 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
|
|
|
|
|
*/ |
|
|
|
|
__ASSERT_NO_MSG(mutex->lock_count > 0U); |
|
|
|
|
|
|
|
|
|
sys_trace_mutex_unlock(mutex); |
|
|
|
|
z_sched_lock(); |
|
|
|
|
|
|
|
|
|
LOG_DBG("mutex %p lock_count: %d", mutex, mutex->lock_count); |
|
|
|
@ -277,7 +288,8 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
@@ -277,7 +288,8 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex)
|
|
|
|
|
|
|
|
|
|
k_mutex_unlock_return: |
|
|
|
|
k_sched_unlock(); |
|
|
|
|
sys_trace_end_call(SYS_TRACE_ID_MUTEX_UNLOCK); |
|
|
|
|
|
|
|
|
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, 0); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|