static void mtx4_execute(void) { tprio_t p, p1, p2; p = chThdGetPriorityX(); p1 = p + 1; p2 = p + 2; threads[0] = chThdCreateStatic(wa[0], WA_SIZE, p1, thread4a, "B"); threads[1] = chThdCreateStatic(wa[1], WA_SIZE, p2, thread4b, "A"); chMtxLock(&m2); test_assert(1, chThdGetPriorityX() == p, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(2, chThdGetPriorityX() == p1, "wrong priority level"); chMtxLock(&m1); test_assert(3, chThdGetPriorityX() == p1, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(4, chThdGetPriorityX() == p2, "wrong priority level"); chMtxUnlock(&m1); test_assert(5, chThdGetPriorityX() == p1, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(6, chThdGetPriorityX() == p1, "wrong priority level"); chMtxUnlockAll(); test_assert(7, chThdGetPriorityX() == p, "wrong priority level"); test_wait_threads(); /* Test repeated in order to cover chMtxUnlockS().*/ threads[0] = chThdCreateStatic(wa[0], WA_SIZE, p1, thread4a, "D"); threads[1] = chThdCreateStatic(wa[1], WA_SIZE, p2, thread4b, "C"); chMtxLock(&m2); test_assert(8, chThdGetPriorityX() == p, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(9, chThdGetPriorityX() == p1, "wrong priority level"); chMtxLock(&m1); test_assert(10, chThdGetPriorityX() == p1, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(11, chThdGetPriorityX() == p2, "wrong priority level"); chSysLock(); chMtxUnlockS(&m1); chSchRescheduleS(); chSysUnlock(); test_assert(12, chThdGetPriorityX() == p1, "wrong priority level"); chThdSleepMilliseconds(100); test_assert(13, chThdGetPriorityX() == p1, "wrong priority level"); chMtxUnlockAll(); test_assert(14, chThdGetPriorityX() == p, "wrong priority level"); test_wait_threads(); }
void BaseThread::unlockAllMutexes(void) { chMtxUnlockAll(); }
void UnlockAll(void) { chMtxUnlockAll(); }
static void test_005_006_execute(void) { bool b; tprio_t prio; /* [5.6.1] Getting current thread priority for later checks.*/ test_set_step(1); { prio = chThdGetPriorityX(); } /* [5.6.2] Locking the mutex first time, it must be possible because it is not owned.*/ test_set_step(2); { b = chMtxTryLock(&m1); test_assert(b, "already locked"); } /* [5.6.3] Locking the mutex second time, it must be possible because it is recursive.*/ test_set_step(3); { b = chMtxTryLock(&m1); test_assert(b, "already locked"); } /* [5.6.4] Unlocking the mutex then it must be still owned because recursivity.*/ test_set_step(4); { chMtxUnlock(&m1); test_assert(m1.owner != NULL, "not owned"); } /* [5.6.5] Unlocking the mutex then it must not be owned anymore and the queue must be empty.*/ test_set_step(5); { chMtxUnlock(&m1); test_assert(m1.owner == NULL, "still owned"); test_assert(queue_isempty(&m1.queue), "queue not empty"); } /* [5.6.6] Testing that priority has not changed after operations.*/ test_set_step(6); { test_assert(chThdGetPriorityX() == prio, "wrong priority level"); } /* [5.6.7] Testing consecutive chMtxTryLock()/chMtxTryLockS() calls and a final chMtxUnlockAllS().*/ test_set_step(7); { b = chMtxTryLock(&m1); test_assert(b, "already locked"); chSysLock(); b = chMtxTryLockS(&m1); chSysUnlock(); test_assert(b, "already locked"); test_assert(m1.cnt == 2, "invalid recursion counter"); chSysLock(); chMtxUnlockAllS(); chSysUnlock(); test_assert(m1.owner == NULL, "still owned"); test_assert(queue_isempty(&m1.queue), "queue not empty"); test_assert(m1.cnt == 0, "invalid recursion counter"); } /* [5.6.8] Testing consecutive chMtxLock()/chMtxLockS() calls and a final chMtxUnlockAll().*/ test_set_step(8); { chMtxLock(&m1); test_assert(m1.owner != NULL, "not owned"); chSysLock(); chMtxLockS(&m1); chSysUnlock(); test_assert(m1.owner != NULL, "not owned"); test_assert(m1.cnt == 2, "invalid recursion counter"); chMtxUnlockAll(); test_assert(m1.owner == NULL, "still owned"); test_assert(queue_isempty(&m1.queue), "queue not empty"); test_assert(m1.cnt == 0, "invalid recursion counter"); } /* [5.6.9] Testing that priority has not changed after operations.*/ test_set_step(9); { test_assert(chThdGetPriorityX() == prio, "wrong priority level"); } }