summaryrefslogtreecommitdiff
path: root/firmware/kernel.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-10-21 19:10:03 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-10-21 19:10:03 +0000
commit6fac8fcc93fa1fc8a6f288f57258f1c8443cf9db (patch)
tree2644e1ca78bec0c345d790d23c1c93ebcd709558 /firmware/kernel.c
parentd4f382252d01102d997281a1f2cb58ffd6b33f97 (diff)
downloadrockbox-6fac8fcc93fa1fc8a6f288f57258f1c8443cf9db.tar.gz
rockbox-6fac8fcc93fa1fc8a6f288f57258f1c8443cf9db.zip
Be sure to register a new mutex owner _before_ waking it. Won't be an issue now but would be with mutex recursion on one used for > 1 core where ownership transfer and cs entry/recursion are allowed to run in parallel (by design). TODO: Add true exchange to wakeup_thread but that's not really important for the time being.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15251 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r--firmware/kernel.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c
index 4e56c2919a..006a06dfe0 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -1076,7 +1076,13 @@ void mutex_unlock(struct mutex *m)
1076#endif 1076#endif
1077 1077
1078 /* transfer to next queued thread if any */ 1078 /* transfer to next queued thread if any */
1079 m->thread = wakeup_thread_no_listlock(&m->queue); 1079
1080 /* This can become busy using SWP but is safe since only one thread
1081 will be changing things at a time. Allowing timeout waits will
1082 change that however but not now. There is also a hazard the thread
1083 could be killed before performing the wakeup but that's just
1084 irresponsible. :-) */
1085 m->thread = m->queue;
1080 1086
1081 if(m->thread == NULL) 1087 if(m->thread == NULL)
1082 { 1088 {
@@ -1087,6 +1093,7 @@ void mutex_unlock(struct mutex *m)
1087 } 1093 }
1088 else /* another thread is waiting - remain locked */ 1094 else /* another thread is waiting - remain locked */
1089 { 1095 {
1096 wakeup_thread_no_listlock(&m->queue);
1090#if CONFIG_CORELOCK == SW_CORELOCK 1097#if CONFIG_CORELOCK == SW_CORELOCK
1091 corelock_unlock(&m->cl); 1098 corelock_unlock(&m->cl);
1092#elif CONFIG_CORELOCK == CORELOCK_SWAP 1099#elif CONFIG_CORELOCK == CORELOCK_SWAP