123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "ktest_utils.h"
- #include <common/mutex.h>
- #include <common/time.h>
- #include <common/sys/wait.h>
- #include <process/process.h>
- static mutex_t mtx;
- static long ktest_mutex_case0(uint64_t arg0, uint64_t arg1)
- {
- assert(mutex_is_locked(&mtx) == 0);
- mutex_lock(&mtx);
- assert(mutex_is_locked(&mtx) == 1);
- mutex_unlock(&mtx);
- assert(mutex_is_locked(&mtx) == 0);
- assert(mutex_trylock(&mtx) == 1);
- mutex_unlock(&mtx);
- assert(mutex_is_locked(&mtx) == 0);
- }
- static unsigned long ktest_mutex_case1_pid1(uint64_t arg)
- {
- kTEST("ktest_mutex_case1_subproc start.");
- assert(mutex_is_locked(&mtx) == 1);
- mutex_lock(&mtx);
- assert(atomic_read(&mtx.count) == 0);
- assert(list_empty(&mtx.wait_list));
- mutex_unlock(&mtx);
- kTEST("ktest_mutex_case1_subproc exit.");
- return 0;
- }
- static long ktest_mutex_case1(uint64_t arg0, uint64_t arg1)
- {
- if (!assert(mutex_is_locked(&mtx) == 0))
- goto failed;
-
- mutex_lock(&mtx);
-
- pid_t pid = kernel_thread(ktest_mutex_case1_pid1, 0, 0);
-
- usleep(100000);
- while (list_empty(&mtx.wait_list))
- ;
-
- assert(atomic_read(&mtx.count) == 0);
- struct mutex_waiter_t *wt = container_of(list_next(&mtx.wait_list), struct mutex_waiter_t, list);
- assert(wt->pcb->pid == pid);
- mutex_unlock(&mtx);
- int stat = 1;
- waitpid(pid, &stat, 0);
- assert(stat == 0);
- return 0;
- failed:;
- kTEST("mutex test case1 failed.");
- return -1;
- }
- static ktest_case_table kt_mutex_func_table[] = {
- ktest_mutex_case0,
- ktest_mutex_case1,
- };
- uint64_t ktest_test_mutex(uint64_t arg)
- {
- kTEST("Testing mutex...");
- mutex_init(&mtx);
- for (int i = 0; i < sizeof(kt_mutex_func_table) / sizeof(ktest_case_table); ++i)
- {
- kTEST("Testing case %d", i);
- kt_mutex_func_table[i](i, 0);
- }
- kTEST("mutex Test done.");
- return 0;
- }
|