Changes in kernel/generic/src/proc/thread.c [8ad7dd1:f22dc820] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
r8ad7dd1 rf22dc820 46 46 #include <synch/spinlock.h> 47 47 #include <synch/waitq.h> 48 #include <synch/workqueue.h>49 #include <synch/rcu.h>50 48 #include <cpu.h> 51 49 #include <str.h> … … 194 192 kmflags &= ~FRAME_HIGHMEM; 195 193 196 uintptr_t stack_phys = 197 frame_alloc(STACK_FRAMES, kmflags, STACK_SIZE - 1); 198 if (!stack_phys) { 194 thread->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); 195 if (!thread->kstack) { 199 196 #ifdef CONFIG_FPU 200 197 if (thread->saved_fpu_context) … … 204 201 } 205 202 206 thread->kstack = (uint8_t *) PA2KA(stack_phys);207 208 203 #ifdef CONFIG_UDEBUG 209 204 mutex_initialize(&thread->udebug.lock, MUTEX_PASSIVE); … … 221 216 thr_destructor_arch(thread); 222 217 223 frame_free(KA2PA(thread->kstack) , STACK_FRAMES);218 frame_free(KA2PA(thread->kstack)); 224 219 225 220 #ifdef CONFIG_FPU … … 265 260 } 266 261 267 /** Invoked right before thread_ready() readies the thread. thread is locked. */268 static void before_thread_is_ready(thread_t *thread)269 {270 ASSERT(irq_spinlock_locked(&thread->lock));271 workq_before_thread_is_ready(thread);272 }273 274 262 /** Make thread ready 275 263 * … … 284 272 285 273 ASSERT(thread->state != Ready); 286 287 before_thread_is_ready(thread);288 274 289 275 int i = (thread->priority < RQ_COUNT - 1) ? 290 276 ++thread->priority : thread->priority; 291 277 292 278 cpu_t *cpu; 293 279 if (thread->wired || thread->nomigrate || thread->fpu_context_engaged) { 294 /* Cannot ready to another CPU */295 280 ASSERT(thread->cpu != NULL); 296 281 cpu = thread->cpu; 297 } else if (thread->stolen) { 298 /* Ready to the stealing CPU */ 282 } else 299 283 cpu = CPU; 300 } else if (thread->cpu) {301 /* Prefer the CPU on which the thread ran last */302 ASSERT(thread->cpu != NULL);303 cpu = thread->cpu;304 } else {305 cpu = CPU;306 }307 284 308 285 thread->state = Ready; … … 320 297 321 298 atomic_inc(&nrdy); 299 // FIXME: Why is the avg value not used 300 // avg = atomic_get(&nrdy) / config.cpu_active; 322 301 atomic_inc(&cpu->nrdy); 323 302 } … … 395 374 thread->task = task; 396 375 397 thread->workq = NULL;398 399 376 thread->fpu_context_exists = false; 400 377 thread->fpu_context_engaged = false; … … 411 388 /* Might depend on previous initialization */ 412 389 thread_create_arch(thread); 413 414 rcu_thread_init(thread);415 390 416 391 if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH) … … 523 498 */ 524 499 ipc_cleanup(); 525 futex_ task_cleanup();500 futex_cleanup(); 526 501 LOG("Cleanup of task %" PRIu64" completed.", TASK->taskid); 527 502 } … … 543 518 /* Not reached */ 544 519 while (true); 545 }546 547 /** Interrupts an existing thread so that it may exit as soon as possible.548 *549 * Threads that are blocked waiting for a synchronization primitive550 * are woken up with a return code of ESYNCH_INTERRUPTED if the551 * blocking call was interruptable. See waitq_sleep_timeout().552 *553 * The caller must guarantee the thread object is valid during the entire554 * function, eg by holding the threads_lock lock.555 *556 * Interrupted threads automatically exit when returning back to user space.557 *558 * @param thread A valid thread object. The caller must guarantee it559 * will remain valid until thread_interrupt() exits.560 */561 void thread_interrupt(thread_t *thread)562 {563 ASSERT(thread != NULL);564 565 irq_spinlock_lock(&thread->lock, true);566 567 thread->interrupted = true;568 bool sleeping = (thread->state == Sleeping);569 570 irq_spinlock_unlock(&thread->lock, true);571 572 if (sleeping)573 waitq_interrupt_sleep(thread);574 }575 576 /** Returns true if the thread was interrupted.577 *578 * @param thread A valid thread object. User must guarantee it will579 * be alive during the entire call.580 * @return true if the thread was already interrupted via thread_interrupt().581 */582 bool thread_interrupted(thread_t *thread)583 {584 ASSERT(thread != NULL);585 586 bool interrupted;587 588 irq_spinlock_lock(&thread->lock, true);589 interrupted = thread->interrupted;590 irq_spinlock_unlock(&thread->lock, true);591 592 return interrupted;593 520 } 594 521
Note:
See TracChangeset
for help on using the changeset viewer.