Changes in kernel/generic/src/proc/thread.c [f22dc820:669f3d32] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
rf22dc820 r669f3d32 46 46 #include <synch/spinlock.h> 47 47 #include <synch/waitq.h> 48 #include <synch/workqueue.h> 49 #include <synch/rcu.h> 48 50 #include <cpu.h> 49 51 #include <str.h> … … 260 262 } 261 263 264 /** Invoked right before thread_ready() readies the thread. thread is locked. */ 265 static void before_thread_is_ready(thread_t *thread) 266 { 267 ASSERT(irq_spinlock_locked(&thread->lock)); 268 workq_before_thread_is_ready(thread); 269 } 270 262 271 /** Make thread ready 263 272 * … … 272 281 273 282 ASSERT(thread->state != Ready); 283 284 before_thread_is_ready(thread); 274 285 275 286 int i = (thread->priority < RQ_COUNT - 1) ? 276 287 ++thread->priority : thread->priority; 277 278 cpu_t *cpu; 279 if (thread->wired || thread->nomigrate || thread->fpu_context_engaged) { 280 ASSERT(thread->cpu != NULL); 281 cpu = thread->cpu; 282 } else 288 289 /* Check that thread->cpu is set whenever it needs to be. */ 290 ASSERT(thread->cpu != NULL || 291 (!thread->wired && !thread->nomigrate && !thread->fpu_context_engaged)); 292 293 /* 294 * Prefer to run on the same cpu as the last time. Used by wired 295 * threads as well as threads with disabled migration. 296 */ 297 cpu_t *cpu = thread->cpu; 298 if (cpu == NULL) 283 299 cpu = CPU; 284 300 … … 374 390 thread->task = task; 375 391 392 thread->workq = NULL; 393 376 394 thread->fpu_context_exists = false; 377 395 thread->fpu_context_engaged = false; … … 388 406 /* Might depend on previous initialization */ 389 407 thread_create_arch(thread); 408 409 rcu_thread_init(thread); 390 410 391 411 if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH) … … 498 518 */ 499 519 ipc_cleanup(); 500 futex_ cleanup();520 futex_task_cleanup(); 501 521 LOG("Cleanup of task %" PRIu64" completed.", TASK->taskid); 502 522 } … … 518 538 /* Not reached */ 519 539 while (true); 540 } 541 542 /** Interrupts an existing thread so that it may exit as soon as possible. 543 * 544 * Threads that are blocked waiting for a synchronization primitive 545 * are woken up with a return code of ESYNCH_INTERRUPTED if the 546 * blocking call was interruptable. See waitq_sleep_timeout(). 547 * 548 * The caller must guarantee the thread object is valid during the entire 549 * function, eg by holding the threads_lock lock. 550 * 551 * Interrupted threads automatically exit when returning back to user space. 552 * 553 * @param thread A valid thread object. The caller must guarantee it 554 * will remain valid until thread_interrupt() exits. 555 */ 556 void thread_interrupt(thread_t *thread) 557 { 558 ASSERT(thread != NULL); 559 560 irq_spinlock_lock(&thread->lock, true); 561 562 thread->interrupted = true; 563 bool sleeping = (thread->state == Sleeping); 564 565 irq_spinlock_unlock(&thread->lock, true); 566 567 if (sleeping) 568 waitq_interrupt_sleep(thread); 569 } 570 571 /** Returns true if the thread was interrupted. 572 * 573 * @param thread A valid thread object. User must guarantee it will 574 * be alive during the entire call. 575 * @return true if the thread was already interrupted via thread_interrupt(). 576 */ 577 bool thread_interrupted(thread_t *thread) 578 { 579 ASSERT(thread != NULL); 580 581 bool interrupted; 582 583 irq_spinlock_lock(&thread->lock, true); 584 interrupted = thread->interrupted; 585 irq_spinlock_unlock(&thread->lock, true); 586 587 return interrupted; 520 588 } 521 589
Note:
See TracChangeset
for help on using the changeset viewer.