summaryrefslogtreecommitdiff
path: root/kern/thread.c
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-04-26 15:47:47 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-05-20 10:56:15 +0200
commit6eb79f812ee43a4e9142de61a5821e0cc8c52bb1 (patch)
tree40bf469bc4c852bd605949d29033b46ae2fb1775 /kern/thread.c
parent3c3d3614673c93bf1b1f47d612d8067455d06920 (diff)
kern: gracefully handle resource shortage
* kern/thread.c (stack_alloc): Report resource shortage. * kern/sched_prim.h (stack_alloc): Adjust declaration accordingly. * kern/thread_swap.c (thread_doswapin): Report resource shortage. (swapin_thread_continue): If the swap-in fails, put the thread back on the queue and go back to sleep. * kern/thread_swap.h (thread_doswapin): Adjust declaration accordingly.
Diffstat (limited to 'kern/thread.c')
-rw-r--r--kern/thread.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/kern/thread.c b/kern/thread.c
index 009884c..f52c95b 100644
--- a/kern/thread.c
+++ b/kern/thread.c
@@ -171,7 +171,7 @@ boolean_t stack_alloc_try(
* May block.
*/
-void stack_alloc(
+kern_return_t stack_alloc(
thread_t thread,
void (*resume)(thread_t))
{
@@ -195,15 +195,15 @@ void stack_alloc(
(void) splx(s);
if (stack == 0) {
+ kern_return_t kr;
/*
* Kernel stacks should be naturally aligned,
* so that it is easy to find the starting/ending
* addresses of a stack given an address in the middle.
*/
-
- if (kmem_alloc_aligned(kmem_map, &stack, KERNEL_STACK_SIZE)
- != KERN_SUCCESS)
- panic("stack_alloc");
+ kr = kmem_alloc_aligned(kmem_map, &stack, KERNEL_STACK_SIZE);
+ if (kr != KERN_SUCCESS)
+ return kr;
#if MACH_DEBUG
stack_init(stack);
@@ -211,6 +211,7 @@ void stack_alloc(
}
stack_attach(thread, stack, resume);
+ return KERN_SUCCESS;
}
/*