Changes in kernel/generic/src/proc/thread.c [8ad7dd1:cd3b380] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
r8ad7dd1 rcd3b380 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> … … 265 263 } 266 264 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 265 /** Make thread ready 275 266 * … … 284 275 285 276 ASSERT(thread->state != Ready); 286 287 before_thread_is_ready(thread);288 277 289 278 int i = (thread->priority < RQ_COUNT - 1) ? 290 279 ++thread->priority : thread->priority; 291 280 292 281 cpu_t *cpu; 293 282 if (thread->wired || thread->nomigrate || thread->fpu_context_engaged) { 294 /* Cannot ready to another CPU */295 283 ASSERT(thread->cpu != NULL); 296 284 cpu = thread->cpu; 297 } else if (thread->stolen) { 298 /* Ready to the stealing CPU */ 285 } else 299 286 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 287 308 288 thread->state = Ready; … … 320 300 321 301 atomic_inc(&nrdy); 302 // FIXME: Why is the avg value not used 303 // avg = atomic_get(&nrdy) / config.cpu_active; 322 304 atomic_inc(&cpu->nrdy); 323 305 } … … 395 377 thread->task = task; 396 378 397 thread->workq = NULL;398 399 379 thread->fpu_context_exists = false; 400 380 thread->fpu_context_engaged = false; … … 411 391 /* Might depend on previous initialization */ 412 392 thread_create_arch(thread); 413 414 rcu_thread_init(thread);415 393 416 394 if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH) … … 523 501 */ 524 502 ipc_cleanup(); 525 futex_ task_cleanup();503 futex_cleanup(); 526 504 LOG("Cleanup of task %" PRIu64" completed.", TASK->taskid); 527 505 } … … 543 521 /* Not reached */ 544 522 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 523 } 594 524
Note:
See TracChangeset
for help on using the changeset viewer.