diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 155205749f..0b39e29126 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -1195,9 +1195,7 @@ int semaphore_wait(struct semaphore *s, int timeout) | |||
1195 | * in 'semaphore_init'. */ | 1195 | * in 'semaphore_init'. */ |
1196 | void semaphore_release(struct semaphore *s) | 1196 | void semaphore_release(struct semaphore *s) |
1197 | { | 1197 | { |
1198 | #if defined(HAVE_PRIORITY_SCHEDULING) && defined(irq_enabled_checkval) | ||
1199 | unsigned int result = THREAD_NONE; | 1198 | unsigned int result = THREAD_NONE; |
1200 | #endif | ||
1201 | int oldlevel; | 1199 | int oldlevel; |
1202 | 1200 | ||
1203 | oldlevel = disable_irq_save(); | 1201 | oldlevel = disable_irq_save(); |
@@ -1209,11 +1207,7 @@ void semaphore_release(struct semaphore *s) | |||
1209 | KERNEL_ASSERT(s->count == 0, | 1207 | KERNEL_ASSERT(s->count == 0, |
1210 | "semaphore_release->threads queued but count=%d!\n", s->count); | 1208 | "semaphore_release->threads queued but count=%d!\n", s->count); |
1211 | s->queue->retval = OBJ_WAIT_SUCCEEDED; /* indicate explicit wake */ | 1209 | s->queue->retval = OBJ_WAIT_SUCCEEDED; /* indicate explicit wake */ |
1212 | #if defined(HAVE_PRIORITY_SCHEDULING) && defined(irq_enabled_checkval) | ||
1213 | result = wakeup_thread(&s->queue); | 1210 | result = wakeup_thread(&s->queue); |
1214 | #else | ||
1215 | wakeup_thread(&s->queue); | ||
1216 | #endif | ||
1217 | } | 1211 | } |
1218 | else | 1212 | else |
1219 | { | 1213 | { |
@@ -1228,11 +1222,11 @@ void semaphore_release(struct semaphore *s) | |||
1228 | corelock_unlock(&s->cl); | 1222 | corelock_unlock(&s->cl); |
1229 | restore_irq(oldlevel); | 1223 | restore_irq(oldlevel); |
1230 | 1224 | ||
1231 | #if defined(HAVE_PRIORITY_SCHEDULING) && defined(irq_enabled_checkval) | 1225 | #if defined(HAVE_PRIORITY_SCHEDULING) && defined(is_thread_context) |
1232 | /* No thread switch if IRQ disabled - it's probably called via ISR. | 1226 | /* No thread switch if not thread context */ |
1233 | * switch_thread would as well enable them anyway. */ | 1227 | if((result & THREAD_SWITCH) && is_thread_context()) |
1234 | if((result & THREAD_SWITCH) && irq_enabled_checkval(oldlevel)) | ||
1235 | switch_thread(); | 1228 | switch_thread(); |
1236 | #endif | 1229 | #endif |
1230 | (void)result; | ||
1237 | } | 1231 | } |
1238 | #endif /* HAVE_SEMAPHORE_OBJECTS */ | 1232 | #endif /* HAVE_SEMAPHORE_OBJECTS */ |