mutex_tc.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-09.01 luckyzjq the first version
  9. * 2023-09-15 xqyjlj change stack size in cpu64
  10. */
  11. #define __RT_IPC_SOURCE__
  12. #include <rtthread.h>
  13. #include <stdlib.h>
  14. #include "utest.h"
  15. #ifdef ARCH_CPU_64BIT
  16. #define THREAD_STACKSIZE 8192
  17. #else
  18. #define THREAD_STACKSIZE 4096
  19. #endif
  20. static struct rt_mutex static_mutex;
  21. #ifdef RT_USING_HEAP
  22. static rt_mutex_t dynamic_mutex;
  23. #endif /* RT_USING_HEAP */
  24. static volatile int _sync_flag;
  25. /* init test */
  26. static void test_static_mutex_init(void)
  27. {
  28. rt_err_t result = -RT_ERROR;
  29. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  30. if (RT_EOK != result)
  31. {
  32. uassert_true(RT_FALSE);
  33. }
  34. result = rt_mutex_detach(&static_mutex);
  35. if (RT_EOK != result)
  36. {
  37. uassert_true(RT_FALSE);
  38. }
  39. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  40. if (RT_EOK != result)
  41. {
  42. uassert_true(RT_FALSE);
  43. }
  44. result = rt_mutex_detach(&static_mutex);
  45. if (RT_EOK != result)
  46. {
  47. uassert_true(RT_FALSE);
  48. }
  49. uassert_true(RT_TRUE);
  50. }
  51. /* static take test */
  52. static void static_mutex_take_entry(void *param)
  53. {
  54. rt_err_t result;
  55. rt_mutex_t mutex;
  56. int rand_num = rand() % 0x1000;
  57. mutex = (rt_mutex_t)param;
  58. result = rt_mutex_take(mutex, rand_num);
  59. if (RT_EOK == result)
  60. {
  61. uassert_true(RT_FALSE);
  62. }
  63. _sync_flag++;
  64. }
  65. static void test_static_mutex_take(void)
  66. {
  67. rt_err_t result;
  68. _sync_flag = 0;
  69. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  70. if (RT_EOK != result)
  71. {
  72. uassert_true(RT_FALSE);
  73. return;
  74. }
  75. /* take mutex and not release */
  76. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  77. if (RT_EOK != result)
  78. uassert_true(RT_FALSE);
  79. rt_thread_t tid = rt_thread_create("mutex_th",
  80. static_mutex_take_entry,
  81. &static_mutex,
  82. THREAD_STACKSIZE,
  83. 10,
  84. 10);
  85. if (RT_NULL == tid)
  86. {
  87. uassert_true(RT_FALSE);
  88. return;
  89. }
  90. /* startup thread take second */
  91. rt_thread_startup(tid);
  92. while (_sync_flag != 1)
  93. {
  94. rt_thread_mdelay(10);
  95. }
  96. result = rt_mutex_detach(&static_mutex);
  97. if (RT_EOK != result)
  98. uassert_true(RT_FALSE);
  99. uassert_true(RT_TRUE);
  100. }
  101. /* static release test */
  102. static void static_mutex_release_entry(void *param)
  103. {
  104. rt_err_t result;
  105. rt_mutex_t mutex;
  106. int rand_num = rand() % 0x1000;
  107. mutex = (rt_mutex_t)param;
  108. result = rt_mutex_take(mutex, rand_num);
  109. if (RT_EOK != result)
  110. {
  111. uassert_true(RT_FALSE);
  112. }
  113. _sync_flag++;
  114. }
  115. static void test_static_mutex_release(void)
  116. {
  117. rt_err_t result;
  118. _sync_flag = 0;
  119. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  120. if (RT_EOK != result)
  121. {
  122. uassert_true(RT_FALSE);
  123. return;
  124. }
  125. result = rt_mutex_release(&static_mutex);
  126. uassert_true(result < 0);
  127. /* take mutex */
  128. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  129. if (RT_EOK != result)
  130. uassert_true(RT_FALSE);
  131. /* release mutex */
  132. result = rt_mutex_release(&static_mutex);
  133. if (RT_EOK != result)
  134. uassert_true(RT_FALSE);
  135. rt_thread_t tid = rt_thread_create("mutex_th",
  136. static_mutex_release_entry,
  137. &static_mutex,
  138. THREAD_STACKSIZE,
  139. 10,
  140. 10);
  141. if (RT_NULL == tid)
  142. {
  143. uassert_true(RT_FALSE);
  144. return;
  145. }
  146. /* startup thread and take mutex second */
  147. rt_thread_startup(tid);
  148. while (_sync_flag != 1)
  149. {
  150. rt_thread_mdelay(10);
  151. }
  152. result = rt_mutex_detach(&static_mutex);
  153. if (RT_EOK != result)
  154. uassert_true(RT_FALSE);
  155. uassert_true(RT_TRUE);
  156. }
  157. /* static trytake test */
  158. static void static_mutex_trytake_entry(void *param)
  159. {
  160. rt_err_t result;
  161. rt_mutex_t mutex;
  162. mutex = (rt_mutex_t)param;
  163. result = rt_mutex_trytake(mutex);
  164. if (RT_EOK == result)
  165. {
  166. uassert_true(RT_FALSE);
  167. }
  168. _sync_flag++;
  169. }
  170. static void test_static_mutex_trytake(void)
  171. {
  172. rt_err_t result;
  173. _sync_flag = 0;
  174. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  175. if (RT_EOK != result)
  176. {
  177. uassert_true(RT_FALSE);
  178. return;
  179. }
  180. /* take mutex and not release */
  181. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  182. if (RT_EOK != result)
  183. uassert_true(RT_FALSE);
  184. rt_thread_t tid = rt_thread_create("mutex_th",
  185. static_mutex_trytake_entry,
  186. &static_mutex,
  187. THREAD_STACKSIZE,
  188. 10,
  189. 10);
  190. if (RT_NULL == tid)
  191. {
  192. uassert_true(RT_FALSE);
  193. return;
  194. }
  195. /* startup thread and trytake mutex second */
  196. rt_thread_startup(tid);
  197. while (_sync_flag != 1)
  198. {
  199. rt_thread_mdelay(10);
  200. }
  201. result = rt_mutex_detach(&static_mutex);
  202. if (RT_EOK != result)
  203. uassert_true(RT_FALSE);
  204. uassert_true(RT_TRUE);
  205. }
  206. static rt_thread_t tid1 = RT_NULL;
  207. static rt_thread_t tid2 = RT_NULL;
  208. static rt_thread_t tid3 = RT_NULL;
  209. /* static mutex priority reverse test */
  210. static void static_thread1_entry(void *param)
  211. {
  212. /* let system schedule */
  213. rt_thread_mdelay(100);
  214. /* thread3 hode mutex thread2 take mutex */
  215. /* check thread2 and thread3 priority */
  216. if (RT_SCHED_PRIV(tid2).current_priority != RT_SCHED_PRIV(tid3).current_priority)
  217. {
  218. uassert_true(RT_FALSE);
  219. }
  220. else
  221. {
  222. uassert_true(RT_TRUE);
  223. }
  224. _sync_flag++;
  225. }
  226. static void static_thread2_entry(void *param)
  227. {
  228. rt_err_t result;
  229. rt_mutex_t mutex = (rt_mutex_t)param;
  230. /* let system schedule */
  231. rt_thread_mdelay(50);
  232. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  233. if (result == RT_EOK)
  234. {
  235. rt_mutex_release(mutex);
  236. }
  237. _sync_flag++;
  238. }
  239. static void static_thread3_entry(void *param)
  240. {
  241. rt_tick_t tick;
  242. rt_err_t result;
  243. rt_mutex_t mutex = (rt_mutex_t)param;
  244. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  245. if (result != RT_EOK)
  246. {
  247. uassert_true(RT_FALSE);
  248. }
  249. tick = rt_tick_get();
  250. while (rt_tick_get() - tick < (RT_TICK_PER_SECOND / 2));
  251. rt_mutex_release(mutex);
  252. _sync_flag++;
  253. }
  254. static void test_static_pri_reverse(void)
  255. {
  256. rt_err_t result;
  257. tid1 = RT_NULL;
  258. tid2 = RT_NULL;
  259. tid3 = RT_NULL;
  260. _sync_flag = 0;
  261. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  262. if (RT_EOK != result)
  263. {
  264. uassert_true(RT_FALSE);
  265. return;
  266. }
  267. /* thread1 */
  268. tid1 = rt_thread_create("thread1",
  269. static_thread1_entry,
  270. &static_mutex,
  271. UTEST_THR_STACK_SIZE,
  272. 10 - 1,
  273. 10);
  274. if (tid1 != RT_NULL)
  275. rt_thread_startup(tid1);
  276. /* thread2 */
  277. tid2 = rt_thread_create("thread2",
  278. static_thread2_entry,
  279. &static_mutex,
  280. UTEST_THR_STACK_SIZE,
  281. 10,
  282. 10);
  283. if (tid2 != RT_NULL)
  284. rt_thread_startup(tid2);
  285. /* thread3 */
  286. tid3 = rt_thread_create("thread3",
  287. static_thread3_entry,
  288. &static_mutex,
  289. UTEST_THR_STACK_SIZE,
  290. 10 + 1,
  291. 10);
  292. if (tid3 != RT_NULL)
  293. rt_thread_startup(tid3);
  294. while (_sync_flag != 3)
  295. {
  296. rt_thread_mdelay(10);
  297. }
  298. result = rt_mutex_detach(&static_mutex);
  299. if (RT_EOK != result)
  300. uassert_true(RT_FALSE);
  301. uassert_true(RT_TRUE);
  302. }
  303. /* create test */
  304. static void test_dynamic_mutex_create(void)
  305. {
  306. rt_err_t result = -RT_ERROR;
  307. /* PRIO mode */
  308. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  309. if (RT_NULL == dynamic_mutex)
  310. {
  311. uassert_true(RT_FALSE);
  312. }
  313. result = rt_mutex_delete(dynamic_mutex);
  314. if (RT_EOK != result)
  315. {
  316. uassert_true(RT_FALSE);
  317. }
  318. /* FIFO mode */
  319. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  320. if (RT_NULL == dynamic_mutex)
  321. {
  322. uassert_true(RT_FALSE);
  323. }
  324. result = rt_mutex_delete(dynamic_mutex);
  325. if (RT_EOK != result)
  326. {
  327. uassert_true(RT_FALSE);
  328. }
  329. uassert_true(RT_TRUE);
  330. }
  331. /* dynamic take test */
  332. static void dynamic_mutex_take_entry(void *param)
  333. {
  334. rt_err_t result;
  335. rt_mutex_t mutex;
  336. int rand_num = rand() % 0x1000;
  337. mutex = (rt_mutex_t)param;
  338. result = rt_mutex_take(mutex, rand_num);
  339. if (RT_EOK == result)
  340. {
  341. uassert_true(RT_FALSE);
  342. }
  343. _sync_flag++;
  344. }
  345. static void test_dynamic_mutex_take(void)
  346. {
  347. rt_err_t result;
  348. _sync_flag = 0;
  349. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  350. if (RT_NULL == dynamic_mutex)
  351. {
  352. uassert_true(RT_FALSE);
  353. return;
  354. }
  355. /* take mutex and not release */
  356. result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
  357. if (RT_EOK != result)
  358. uassert_true(RT_FALSE);
  359. rt_thread_t tid = rt_thread_create("mutex_th",
  360. dynamic_mutex_take_entry,
  361. dynamic_mutex,
  362. THREAD_STACKSIZE,
  363. 10,
  364. 10);
  365. if (RT_NULL == tid)
  366. {
  367. uassert_true(RT_FALSE);
  368. return;
  369. }
  370. /* startup thread take second */
  371. rt_thread_startup(tid);
  372. while (_sync_flag != 1)
  373. {
  374. rt_thread_mdelay(10);
  375. }
  376. result = rt_mutex_delete(dynamic_mutex);
  377. if (RT_EOK != result)
  378. uassert_true(RT_FALSE);
  379. uassert_true(RT_TRUE);
  380. }
  381. /* dynamic release test */
  382. static void dynamic_mutex_release_entry(void *param)
  383. {
  384. rt_err_t result;
  385. rt_mutex_t mutex;
  386. int rand_num = rand() % 0x1000;
  387. mutex = (rt_mutex_t)param;
  388. result = rt_mutex_take(mutex, rand_num);
  389. if (RT_EOK != result)
  390. {
  391. uassert_true(RT_FALSE);
  392. }
  393. _sync_flag++;
  394. }
  395. static void test_dynamic_mutex_release(void)
  396. {
  397. rt_err_t result;
  398. _sync_flag = 0;
  399. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  400. if (RT_NULL == dynamic_mutex)
  401. {
  402. uassert_true(RT_FALSE);
  403. return;
  404. }
  405. result = rt_mutex_release(dynamic_mutex);
  406. uassert_true(result < 0);
  407. /* take mutex */
  408. result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
  409. if (RT_EOK != result)
  410. uassert_true(RT_FALSE);
  411. /* release mutex */
  412. result = rt_mutex_release(dynamic_mutex);
  413. if (RT_EOK != result)
  414. uassert_true(RT_FALSE);
  415. rt_thread_t tid = rt_thread_create("mutex_th",
  416. dynamic_mutex_release_entry,
  417. dynamic_mutex,
  418. THREAD_STACKSIZE,
  419. 10,
  420. 10);
  421. if (RT_NULL == tid)
  422. {
  423. uassert_true(RT_FALSE);
  424. return;
  425. }
  426. /* startup thread and take mutex second */
  427. rt_thread_startup(tid);
  428. while (_sync_flag != 1)
  429. {
  430. rt_thread_mdelay(10);
  431. }
  432. result = rt_mutex_delete(dynamic_mutex);
  433. if (RT_EOK != result)
  434. uassert_true(RT_FALSE);
  435. uassert_true(RT_TRUE);
  436. }
  437. /* dynamic trytake test */
  438. static void dynamic_mutex_trytake_entry(void *param)
  439. {
  440. rt_err_t result;
  441. rt_mutex_t mutex;
  442. mutex = (rt_mutex_t)param;
  443. result = rt_mutex_trytake(mutex);
  444. if (RT_EOK == result)
  445. {
  446. uassert_true(RT_FALSE);
  447. }
  448. _sync_flag++;
  449. }
  450. static void test_dynamic_mutex_trytake(void)
  451. {
  452. rt_err_t result;
  453. _sync_flag = 0;
  454. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  455. if (RT_NULL == dynamic_mutex)
  456. {
  457. uassert_true(RT_FALSE);
  458. return;
  459. }
  460. /* take mutex and not release */
  461. result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
  462. if (RT_EOK != result)
  463. uassert_true(RT_FALSE);
  464. rt_thread_t tid = rt_thread_create("mutex_th",
  465. dynamic_mutex_trytake_entry,
  466. dynamic_mutex,
  467. THREAD_STACKSIZE,
  468. 10,
  469. 10);
  470. if (RT_NULL == tid)
  471. {
  472. uassert_true(RT_FALSE);
  473. return;
  474. }
  475. /* startup thread and trytake mutex second */
  476. rt_thread_startup(tid);
  477. while (_sync_flag != 1)
  478. {
  479. rt_thread_mdelay(10);
  480. }
  481. result = rt_mutex_delete(dynamic_mutex);
  482. if (RT_EOK != result)
  483. uassert_true(RT_FALSE);
  484. uassert_true(RT_TRUE);
  485. }
  486. /* dynamic mutex priority reverse test */
  487. static void dynamic_thread1_entry(void *param)
  488. {
  489. /* let system schedule */
  490. rt_thread_mdelay(100);
  491. /* thread3 hode mutex thread2 take mutex */
  492. /* check thread2 and thread3 priority */
  493. if (RT_SCHED_PRIV(tid2).current_priority != RT_SCHED_PRIV(tid3).current_priority)
  494. {
  495. uassert_true(RT_FALSE);
  496. }
  497. else
  498. {
  499. uassert_true(RT_TRUE);
  500. }
  501. _sync_flag++;
  502. }
  503. static void dynamic_thread2_entry(void *param)
  504. {
  505. rt_err_t result;
  506. rt_mutex_t mutex = (rt_mutex_t)param;
  507. /* let system schedule */
  508. rt_thread_mdelay(50);
  509. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  510. if (result == RT_EOK)
  511. {
  512. rt_mutex_release(mutex);
  513. }
  514. _sync_flag++;
  515. }
  516. static void dynamic_thread3_entry(void *param)
  517. {
  518. rt_tick_t tick;
  519. rt_err_t result;
  520. rt_mutex_t mutex = (rt_mutex_t)param;
  521. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  522. if (result != RT_EOK)
  523. {
  524. uassert_true(RT_FALSE);
  525. }
  526. tick = rt_tick_get();
  527. while (rt_tick_get() - tick < (RT_TICK_PER_SECOND / 2));
  528. rt_mutex_release(mutex);
  529. _sync_flag++;
  530. }
  531. static void test_dynamic_pri_reverse(void)
  532. {
  533. rt_err_t result;
  534. tid1 = RT_NULL;
  535. tid2 = RT_NULL;
  536. tid3 = RT_NULL;
  537. _sync_flag = 0;
  538. dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
  539. if (RT_NULL == dynamic_mutex)
  540. {
  541. uassert_true(RT_FALSE);
  542. return;
  543. }
  544. /* thread1 */
  545. tid1 = rt_thread_create("thread1",
  546. dynamic_thread1_entry,
  547. dynamic_mutex,
  548. UTEST_THR_STACK_SIZE,
  549. 10 - 1,
  550. 10);
  551. if (tid1 != RT_NULL)
  552. rt_thread_startup(tid1);
  553. /* thread2 */
  554. tid2 = rt_thread_create("thread2",
  555. dynamic_thread2_entry,
  556. dynamic_mutex,
  557. UTEST_THR_STACK_SIZE,
  558. 10,
  559. 10);
  560. if (tid2 != RT_NULL)
  561. rt_thread_startup(tid2);
  562. /* thread3 */
  563. tid3 = rt_thread_create("thread3",
  564. dynamic_thread3_entry,
  565. dynamic_mutex,
  566. UTEST_THR_STACK_SIZE,
  567. 10 + 1,
  568. 10);
  569. if (tid3 != RT_NULL)
  570. rt_thread_startup(tid3);
  571. while (_sync_flag != 3)
  572. {
  573. rt_thread_mdelay(10);
  574. }
  575. result = rt_mutex_delete(dynamic_mutex);
  576. if (RT_EOK != result)
  577. uassert_true(RT_FALSE);
  578. uassert_true(RT_TRUE);
  579. }
  580. static void recursive_lock_test_entry(void *param)
  581. {
  582. rt_err_t result;
  583. rt_mutex_t mutex = (rt_mutex_t)param;
  584. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  585. uassert_true(result == RT_EOK);
  586. uassert_true(_sync_flag == 0);
  587. result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
  588. uassert_true(result == RT_EOK);
  589. _sync_flag++;
  590. }
  591. static void test_recurse_lock(void)
  592. {
  593. rt_err_t result;
  594. _sync_flag = 0;
  595. result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
  596. uassert_true(result == RT_EOK);
  597. /* take mutex and not release */
  598. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  599. uassert_true(result == RT_EOK);
  600. /* take mutex twice */
  601. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  602. uassert_true(result == RT_EOK);
  603. rt_thread_t tid = rt_thread_create("mutex_th",
  604. recursive_lock_test_entry,
  605. &static_mutex,
  606. THREAD_STACKSIZE,
  607. 10,
  608. 10);
  609. _sync_flag = -1;
  610. if (tid != RT_NULL)
  611. rt_thread_startup(tid);
  612. result = rt_mutex_release(&static_mutex);
  613. uassert_true(result == RT_EOK);
  614. _sync_flag = 0;
  615. result = rt_mutex_release(&static_mutex);
  616. uassert_true(result == RT_EOK);
  617. while (_sync_flag != 1)
  618. {
  619. rt_thread_mdelay(10);
  620. }
  621. result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
  622. uassert_true(result == RT_EOK);
  623. result = rt_mutex_detach(&static_mutex);
  624. uassert_true(result == RT_EOK);
  625. }
  626. static rt_err_t utest_tc_init(void)
  627. {
  628. #ifdef RT_USING_HEAP
  629. dynamic_mutex = RT_NULL;
  630. #endif /* RT_USING_HEAP */
  631. return RT_EOK;
  632. }
  633. static rt_err_t utest_tc_cleanup(void)
  634. {
  635. #ifdef RT_USING_HEAP
  636. dynamic_mutex = RT_NULL;
  637. #endif /* RT_USING_HEAP */
  638. return RT_EOK;
  639. }
  640. static void testcase(void)
  641. {
  642. UTEST_UNIT_RUN(test_static_mutex_init);
  643. UTEST_UNIT_RUN(test_static_mutex_take);
  644. UTEST_UNIT_RUN(test_static_mutex_release);
  645. UTEST_UNIT_RUN(test_static_mutex_trytake);
  646. UTEST_UNIT_RUN(test_static_pri_reverse);
  647. #ifdef RT_USING_HEAP
  648. UTEST_UNIT_RUN(test_dynamic_mutex_create);
  649. UTEST_UNIT_RUN(test_dynamic_mutex_take);
  650. UTEST_UNIT_RUN(test_dynamic_mutex_release);
  651. UTEST_UNIT_RUN(test_dynamic_mutex_trytake);
  652. UTEST_UNIT_RUN(test_dynamic_pri_reverse);
  653. #endif
  654. UTEST_UNIT_RUN(test_recurse_lock);
  655. }
  656. UTEST_TC_EXPORT(testcase, "testcases.kernel.mutex_tc", utest_tc_init, utest_tc_cleanup, 1000);
  657. /********************* end of file ************************/