Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
test_mutex_apis.c File Reference
#include <ztest.h>

Macros

#define TIMEOUT   500
 
#define STACK_SIZE   (512 + CONFIG_TEST_EXTRA_STACKSIZE)
 
#define THREAD_HIGH_PRIORITY   1
 
#define THREAD_MID_PRIORITY   3
 
#define THREAD_LOW_PRIORITY   5
 

Functions

 K_MUTEX_DEFINE (kmutex)
 
static K_THREAD_STACK_DEFINE (tstack,(512+CONFIG_TEST_EXTRA_STACKSIZE))
 
static K_THREAD_STACK_DEFINE (tstack2,(512+CONFIG_TEST_EXTRA_STACKSIZE))
 
static K_THREAD_STACK_DEFINE (tstack3,(512+CONFIG_TEST_EXTRA_STACKSIZE))
 
static void tThread_entry_lock_forever (void *p1, void *p2, void *p3)
 
static void tThread_entry_lock_no_wait (void *p1, void *p2, void *p3)
 
static void tThread_entry_lock_timeout_fail (void *p1, void *p2, void *p3)
 
static void tThread_entry_lock_timeout_pass (void *p1, void *p2, void *p3)
 
static void tmutex_test_lock (struct k_mutex *pmutex, void(*entry_fn)(void *, void *, void *))
 
static void tmutex_test_lock_timeout (struct k_mutex *pmutex, void(*entry_fn)(void *, void *, void *))
 
static void tmutex_test_lock_unlock (struct k_mutex *pmutex)
 
static void tThread_T1_priority_inheritance (void *p1, void *p2, void *p3)
 
static void tThread_T2_priority_inheritance (void *p1, void *p2, void *p3)
 
static void tThread_lock_with_time_period (void *p1, void *p2, void *p3)
 
static void tThread_waiter (void *p1, void *p2, void *p3)
 
void test_mutex_reent_lock_forever (void)
 
void test_mutex_reent_lock_no_wait (void)
 
void test_mutex_reent_lock_timeout_fail (void)
 
void test_mutex_reent_lock_timeout_pass (void)
 
void test_mutex_lock_unlock (void)
 
void test_mutex_recursive (void)
 Test recursive mutex. More...
 
void test_mutex_priority_inheritance (void)
 Test mutex's priority inheritance mechanism. More...
 
void test_main (void)
 

Variables

static ZTEST_DMEM int case_type
 
static ZTEST_DMEM int thread_ret = TC_FAIL
 
static struct k_mutex mutex
 
static struct k_thread tdata
 
static struct k_thread tdata2
 
static struct k_thread tdata3
 

Macro Definition Documentation

◆ STACK_SIZE

#define STACK_SIZE   (512 + CONFIG_TEST_EXTRA_STACKSIZE)

◆ THREAD_HIGH_PRIORITY

#define THREAD_HIGH_PRIORITY   1

◆ THREAD_LOW_PRIORITY

#define THREAD_LOW_PRIORITY   5

◆ THREAD_MID_PRIORITY

#define THREAD_MID_PRIORITY   3

◆ TIMEOUT

#define TIMEOUT   500

Function Documentation

◆ K_MUTEX_DEFINE()

K_MUTEX_DEFINE ( kmutex  )

TESTPOINT: init via K_MUTEX_DEFINE

◆ K_THREAD_STACK_DEFINE() [1/3]

static K_THREAD_STACK_DEFINE ( tstack  ,
(512+CONFIG_TEST_EXTRA_STACKSIZE)   
)
static

◆ K_THREAD_STACK_DEFINE() [2/3]

static K_THREAD_STACK_DEFINE ( tstack2  ,
(512+CONFIG_TEST_EXTRA_STACKSIZE)   
)
static

◆ K_THREAD_STACK_DEFINE() [3/3]

static K_THREAD_STACK_DEFINE ( tstack3  ,
(512+CONFIG_TEST_EXTRA_STACKSIZE)   
)
static

◆ test_main()

void test_main ( void  )

test case main entry

◆ test_mutex_lock_unlock()

void test_mutex_lock_unlock ( void  )

TESTPOINT: test k_mutex_init mutex

TESTPOINT: test K_MUTEX_DEFINE mutex

◆ test_mutex_priority_inheritance()

void test_mutex_priority_inheritance ( void  )

Test mutex's priority inheritance mechanism.

To verify mutex provide priority inheritance to prevent prority inversion, and there are 3 cases need to run. The thread T1 hold the mutex first and cases list as below:

  • case 1. When prority T2 > T1, priority inheritance happened.
  • case 2. When prority T1 > T2, priority inheritance won't happened.
  • case 3. When prority T2 > T3 > T1, priority inheritance happened but T2 wait for timeout and T3 got the mutex.

TESTPOINT: run test case 1, given priority T1 < T2

TESTPOINT: The current thread does not own the mutex.

TESTPOINT: run test case 2, given priority T1 > T2, this means priority inheritance won't happen.

TESTPOINT: run test case 3, given priority T1 < T3 < T2, but t2 do not get mutex due to timeout.

◆ test_mutex_recursive()

void test_mutex_recursive ( void  )

Test recursive mutex.

To verify that getting a lock of a mutex already locked will succeed and waiters will be unblocked only when the number of locks reaches zero.

TESTPOINT: when mutex has no owner, we cannot unlock it

TESTPOINT: lock the mutex recursively

TESTPOINT: unlock the mutex recursively

TESTPOINT: waiter thread got the mutex

◆ test_mutex_reent_lock_forever()

void test_mutex_reent_lock_forever ( void  )

TESTPOINT: test k_mutex_init mutex

TESTPOINT: test K_MUTEX_DEFINE mutex

◆ test_mutex_reent_lock_no_wait()

void test_mutex_reent_lock_no_wait ( void  )

TESTPOINT: test k_mutex_init mutex

TESTPOINT: test K_MUTEX_DEFINE mutex

◆ test_mutex_reent_lock_timeout_fail()

void test_mutex_reent_lock_timeout_fail ( void  )

TESTPOINT: test k_mutex_init mutex

TESTPOINT: test K_MUTEX_DEFINE mutex

◆ test_mutex_reent_lock_timeout_pass()

void test_mutex_reent_lock_timeout_pass ( void  )

TESTPOINT: test k_mutex_init mutex

TESTPOINT: test K_MUTEX_DEFINE mutex

◆ tmutex_test_lock()

static void tmutex_test_lock ( struct k_mutex pmutex,
void(*)(void *, void *, void *)  entry_fn 
)
static

◆ tmutex_test_lock_timeout()

static void tmutex_test_lock_timeout ( struct k_mutex pmutex,
void(*)(void *, void *, void *)  entry_fn 
)
static

TESTPOINT: test k_mutex_init mutex

◆ tmutex_test_lock_unlock()

static void tmutex_test_lock_unlock ( struct k_mutex pmutex)
static

◆ tThread_entry_lock_forever()

static void tThread_entry_lock_forever ( void p1,
void p2,
void p3 
)
static

◆ tThread_entry_lock_no_wait()

static void tThread_entry_lock_no_wait ( void p1,
void p2,
void p3 
)
static

◆ tThread_entry_lock_timeout_fail()

static void tThread_entry_lock_timeout_fail ( void p1,
void p2,
void p3 
)
static

◆ tThread_entry_lock_timeout_pass()

static void tThread_entry_lock_timeout_pass ( void p1,
void p2,
void p3 
)
static

◆ tThread_lock_with_time_period()

static void tThread_lock_with_time_period ( void p1,
void p2,
void p3 
)
static

◆ tThread_T1_priority_inheritance()

static void tThread_T1_priority_inheritance ( void p1,
void p2,
void p3 
)
static

◆ tThread_T2_priority_inheritance()

static void tThread_T2_priority_inheritance ( void p1,
void p2,
void p3 
)
static

◆ tThread_waiter()

static void tThread_waiter ( void p1,
void p2,
void p3 
)
static

Variable Documentation

◆ case_type

ZTEST_DMEM int case_type
static

◆ mutex

struct k_mutex mutex
static

◆ tdata

struct k_thread tdata
static

◆ tdata2

struct k_thread tdata2
static

◆ tdata3

struct k_thread tdata3
static

◆ thread_ret

ZTEST_DMEM int thread_ret = TC_FAIL
static