diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2007-03-26 03:24:36 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2007-03-26 03:24:36 +0000 |
commit | 165f62d0cd771660e4b8d2ba7475e14d0d6f2e9f (patch) | |
tree | 2818158a5c6f250dc928319d7cc6c91788519b78 /firmware/export | |
parent | 5e2984ad80a732f39b8d0df130176e67b30b9469 (diff) | |
download | rockbox-165f62d0cd771660e4b8d2ba7475e14d0d6f2e9f.tar.gz rockbox-165f62d0cd771660e4b8d2ba7475e14d0d6f2e9f.zip |
Fix a hole in the scheduler where collisions between waking blocked threads in mutexes with interrupts waking blocked threads in message queues can occur. Queue posts will put the threads on a separate list that is then added to the running list with IRQs disabled on the next task switch or CPU wakeup. Basically no overhead for other operations. Seems a likely cause of my occasional observation of the backlight fade causing playback threads to stop running and a recently reported blocking violation upon USB plugging. Time will tell but banging the backlight on and off frequently hasn't hiccuped again for me on H120.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12915 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export')
-rw-r--r-- | firmware/export/thread.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/firmware/export/thread.h b/firmware/export/thread.h index c9132af524..279ea44835 100644 --- a/firmware/export/thread.h +++ b/firmware/export/thread.h | |||
@@ -119,6 +119,8 @@ struct core_entry { | |||
119 | struct thread_entry threads[MAXTHREADS]; | 119 | struct thread_entry threads[MAXTHREADS]; |
120 | struct thread_entry *running; | 120 | struct thread_entry *running; |
121 | struct thread_entry *sleeping; | 121 | struct thread_entry *sleeping; |
122 | struct thread_entry *waking; | ||
123 | struct thread_entry **wakeup_list; | ||
122 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME | 124 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME |
123 | int switch_to_irq_level; | 125 | int switch_to_irq_level; |
124 | #define STAY_IRQ_LEVEL -1 | 126 | #define STAY_IRQ_LEVEL -1 |
@@ -193,6 +195,7 @@ void set_irq_level_and_block_thread_w_tmo(struct thread_entry **list, | |||
193 | #endif | 195 | #endif |
194 | #endif | 196 | #endif |
195 | void wakeup_thread(struct thread_entry **thread); | 197 | void wakeup_thread(struct thread_entry **thread); |
198 | void wakeup_thread_irq_safe(struct thread_entry **thread); | ||
196 | #ifdef HAVE_PRIORITY_SCHEDULING | 199 | #ifdef HAVE_PRIORITY_SCHEDULING |
197 | int thread_set_priority(struct thread_entry *thread, int priority); | 200 | int thread_set_priority(struct thread_entry *thread, int priority); |
198 | int thread_get_priority(struct thread_entry *thread); | 201 | int thread_get_priority(struct thread_entry *thread); |