Changes in kernel/generic/src/proc/thread.c [669f3d32:f22dc820] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
r669f3d32 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> … … 262 260 } 263 261 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 271 262 /** Make thread ready 272 263 * … … 281 272 282 273 ASSERT(thread->state != Ready); 283 284 before_thread_is_ready(thread);285 274 286 275 int i = (thread->priority < RQ_COUNT - 1) ? 287 276 ++thread->priority : thread->priority; 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) 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 299 283 cpu = CPU; 300 284 … … 390 374 thread->task = task; 391 375 392 thread->workq = NULL;393 394 376 thread->fpu_context_exists = false; 395 377 thread->fpu_context_engaged = false; … … 406 388 /* Might depend on previous initialization */ 407 389 thread_create_arch(thread); 408 409 rcu_thread_init(thread);410 390 411 391 if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH) … … 518 498 */ 519 499 ipc_cleanup(); 520 futex_ task_cleanup();500 futex_cleanup(); 521 501 LOG("Cleanup of task %" PRIu64" completed.", TASK->taskid); 522 502 } … … 538 518 /* Not reached */ 539 519 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 primitive545 * are woken up with a return code of ESYNCH_INTERRUPTED if the546 * blocking call was interruptable. See waitq_sleep_timeout().547 *548 * The caller must guarantee the thread object is valid during the entire549 * 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 it554 * 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 will574 * 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;588 520 } 589 521
Note:
See TracChangeset
for help on using the changeset viewer.