summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-03-26 03:24:36 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-03-26 03:24:36 +0000
commit165f62d0cd771660e4b8d2ba7475e14d0d6f2e9f (patch)
tree2818158a5c6f250dc928319d7cc6c91788519b78 /firmware/export
parent5e2984ad80a732f39b8d0df130176e67b30b9469 (diff)
downloadrockbox-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.h3
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
195void wakeup_thread(struct thread_entry **thread); 197void wakeup_thread(struct thread_entry **thread);
198void wakeup_thread_irq_safe(struct thread_entry **thread);
196#ifdef HAVE_PRIORITY_SCHEDULING 199#ifdef HAVE_PRIORITY_SCHEDULING
197int thread_set_priority(struct thread_entry *thread, int priority); 200int thread_set_priority(struct thread_entry *thread, int priority);
198int thread_get_priority(struct thread_entry *thread); 201int thread_get_priority(struct thread_entry *thread);