aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/reports/STM32F103-72.txt12
-rw-r--r--os/kernel/src/chmtx.c58
-rw-r--r--readme.txt2
3 files changed, 51 insertions, 21 deletions
diff --git a/docs/reports/STM32F103-72.txt b/docs/reports/STM32F103-72.txt
index cf20a8f42..d2ff57904 100644
--- a/docs/reports/STM32F103-72.txt
+++ b/docs/reports/STM32F103-72.txt
@@ -5,7 +5,7 @@ Settings: SYSCLK=72, ACR=0x12 (2 wait states)
*** ChibiOS/RT test suite
***
-*** Kernel: 1.5.7unstable
+*** Kernel: 2.1.0unstable
*** GCC Version: 4.5.0
*** Architecture: ARMv7-M
*** Core Variant: Cortex-M3
@@ -95,7 +95,7 @@ Settings: SYSCLK=72, ACR=0x12 (2 wait states)
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.1 (Benchmark, messages #1)
---- Score : 250283 msgs/S, 500566 ctxswc/S
+--- Score : 250284 msgs/S, 500568 ctxswc/S
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.2 (Benchmark, messages #2)
@@ -107,7 +107,7 @@ Settings: SYSCLK=72, ACR=0x12 (2 wait states)
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.4 (Benchmark, context switch)
---- Score : 838936 ctxswc/S
+--- Score : 838944 ctxswc/S
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.5 (Benchmark, threads, full cycle)
@@ -119,11 +119,11 @@ Settings: SYSCLK=72, ACR=0x12 (2 wait states)
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.7 (Benchmark, mass reschedule, 5 threads)
---- Score : 62250 reschedules/S, 373500 ctxswc/S
+--- Score : 62305 reschedules/S, 373830 ctxswc/S
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.8 (Benchmark, round robin context switching)
---- Score : 481288 ctxswc/S
+--- Score : 481292 ctxswc/S
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.9 (Benchmark, I/O Queues throughput)
@@ -139,7 +139,7 @@ Settings: SYSCLK=72, ACR=0x12 (2 wait states)
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.12 (Benchmark, mutexes lock/unlock)
---- Score : 638608 lock+unlock/S
+--- Score : 601192 lock+unlock/S
--- Result: SUCCESS
----------------------------------------------------------------------------
--- Test Case 11.13 (Benchmark, RAM footprint)
diff --git a/os/kernel/src/chmtx.c b/os/kernel/src/chmtx.c
index c3076163a..88b6f4ecd 100644
--- a/os/kernel/src/chmtx.c
+++ b/os/kernel/src/chmtx.c
@@ -145,12 +145,17 @@ void chMtxLockS(Mutex *mp) {
prio_insert(ctp, &mp->m_queue);
ctp->p_u.wtobjp = mp;
chSchGoSleepS(THD_STATE_WTMTX);
- chDbgAssert(mp->m_owner == NULL, "chMtxLockS(), #1", "still owned");
+ /* It is assumed that the thread performing the unlock operation assigns
+ the mutex to this thread.*/
+ chDbgAssert(mp->m_owner == ctp, "chMtxLockS(), #1", "not owner");
+ chDbgAssert(ctp->p_mtxlist == mp, "chMtxLockS(), #2", "not owned");
+ }
+ else {
+ /* It was not owned, inserted in the owned mutexes list.*/
+ mp->m_owner = ctp;
+ mp->m_next = ctp->p_mtxlist;
+ ctp->p_mtxlist = mp;
}
- /* The mutex is now inserted in the owned mutexes list.*/
- mp->m_owner = ctp;
- mp->m_next = ctp->p_mtxlist;
- ctp->p_mtxlist = mp;
}
/**
@@ -216,9 +221,10 @@ Mutex *chMtxUnlock(void) {
as not owned.*/
ump = ctp->p_mtxlist;
ctp->p_mtxlist = ump->m_next;
- ump->m_owner = NULL;
/* If a thread is waiting on the mutex then the fun part begins.*/
if (chMtxQueueNotEmptyS(ump)) {
+ Thread *tp;
+
/* Recalculates the optimal thread priority by scanning the owned
mutexes list.*/
tprio_t newprio = ctp->p_realprio;
@@ -234,9 +240,16 @@ Mutex *chMtxUnlock(void) {
/* Assigns to the current thread the highest priority among all the
waiting threads.*/
ctp->p_prio = newprio;
- /* Awakens the highest priority thread waiting for the unlocked mutex.*/
- chSchWakeupS(fifo_remove(&ump->m_queue), RDY_OK);
+ /* Awakens the highest priority thread waiting for the unlocked mutex and
+ assigns the mutex to it.*/
+ tp = fifo_remove(&ump->m_queue);
+ ump->m_owner = tp;
+ ump->m_next = tp->p_mtxlist;
+ tp->p_mtxlist = ump;
+ chSchWakeupS(tp, RDY_OK);
}
+ else
+ ump->m_owner = NULL;
chSysUnlock();
return ump;
}
@@ -262,9 +275,10 @@ Mutex *chMtxUnlockS(void) {
owned.*/
ump = ctp->p_mtxlist;
ctp->p_mtxlist = ump->m_next;
- ump->m_owner = NULL;
/* If a thread is waiting on the mutex then the fun part begins.*/
if (chMtxQueueNotEmptyS(ump)) {
+ Thread *tp;
+
/* Recalculates the optimal thread priority by scanning the owned
mutexes list.*/
tprio_t newprio = ctp->p_realprio;
@@ -278,8 +292,16 @@ Mutex *chMtxUnlockS(void) {
mp = mp->m_next;
}
ctp->p_prio = newprio;
- chSchReadyI(fifo_remove(&ump->m_queue));
+ /* Awakens the highest priority thread waiting for the unlocked mutex and
+ assigns the mutex to it.*/
+ tp = fifo_remove(&ump->m_queue);
+ ump->m_owner = tp;
+ ump->m_next = tp->p_mtxlist;
+ tp->p_mtxlist = ump;
+ chSchReadyI(tp);
}
+ else
+ ump->m_owner = NULL;
return ump;
}
@@ -296,11 +318,17 @@ void chMtxUnlockAll(void) {
chSysLock();
if (ctp->p_mtxlist != NULL) {
do {
- Mutex *mp = ctp->p_mtxlist;
- ctp->p_mtxlist = mp->m_next;
- mp->m_owner = NULL;
- if (chMtxQueueNotEmptyS(mp))
- chSchReadyI(fifo_remove(&mp->m_queue));
+ Mutex *ump = ctp->p_mtxlist;
+ ctp->p_mtxlist = ump->m_next;
+ if (chMtxQueueNotEmptyS(ump)) {
+ Thread *tp = fifo_remove(&ump->m_queue);
+ ump->m_owner = tp;
+ ump->m_next = tp->p_mtxlist;
+ tp->p_mtxlist = ump;
+ chSchReadyI(tp);
+ }
+ else
+ ump->m_owner = NULL;
} while (ctp->p_mtxlist != NULL);
ctp->p_prio = ctp->p_realprio;
chSchRescheduleS();
diff --git a/readme.txt b/readme.txt
index 7e1310348..a06e62e86 100644
--- a/readme.txt
+++ b/readme.txt
@@ -59,6 +59,8 @@
*****************************************************************************
*** 2.1.0 ***
+- FIX: Fixed instability in Mutexes subsystem (bug 3019099)(backported
+ in 2.0.1).
- FIX: Fixed broken AVR port (bug 3016619)(backported in 2.0.0).
- FIX: Fixed assertion in adcStop() (bug 3015109)(backported in 2.0.0).
- OPT: Simplified the test suite code, now it is smaller.