Changes in kernel/generic/src/proc/task.c [5a5269d:07d4271] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/task.c
r5a5269d r07d4271 158 158 return rc; 159 159 160 atomic_store(&task->refcount, 0);161 160 atomic_store(&task->lifecount, 0); 162 161 … … 201 200 if (!task) 202 201 return NULL; 202 203 refcount_init(&task->refcount); 203 204 204 205 task_create_arch(task); … … 224 225 225 226 task->answerbox.active = true; 227 228 task->debug_sections = NULL; 226 229 227 230 #ifdef CONFIG_UDEBUG … … 266 269 * 267 270 */ 268 void task_destroy(task_t *task)271 static void task_destroy(task_t *task) 269 272 { 270 273 /* … … 297 300 void task_hold(task_t *task) 298 301 { 299 atomic_inc(&task->refcount);302 refcount_up(&task->refcount); 300 303 } 301 304 … … 309 312 void task_release(task_t *task) 310 313 { 311 if ( (atomic_predec(&task->refcount)) == 0)314 if (refcount_down(&task->refcount)) 312 315 task_destroy(task); 313 316 } … … 385 388 irq_spinlock_lock(&tasks_lock, true); 386 389 irq_spinlock_lock(&TASK->lock, false); 387 irq_spinlock_lock(&threads_lock, false);388 390 389 391 /* Set task name */ 390 392 str_cpy(TASK->name, TASK_NAME_BUFLEN, namebuf); 391 393 392 irq_spinlock_unlock(&threads_lock, false);393 394 irq_spinlock_unlock(&TASK->lock, false); 394 395 irq_spinlock_unlock(&tasks_lock, true); … … 416 417 /** Find task structure corresponding to task ID. 417 418 * 418 * The tasks_lock must be already held by the caller of this function and419 * interrupts must be disabled.420 *421 419 * @param id Task ID. 422 420 * 423 * @return Task structure addressor NULL if there is no such task ID.421 * @return Task reference or NULL if there is no such task ID. 424 422 * 425 423 */ 426 424 task_t *task_find_by_id(task_id_t id) 427 425 { 428 assert(interrupts_disabled()); 429 assert(irq_spinlock_locked(&tasks_lock)); 426 task_t *task = NULL; 427 428 irq_spinlock_lock(&tasks_lock, true); 430 429 431 430 odlink_t *odlink = odict_find_eq(&tasks, &id, NULL); 432 if (odlink != NULL) 433 return odict_get_instance(odlink, task_t, ltasks); 434 435 return NULL; 431 if (odlink != NULL) { 432 task = odict_get_instance(odlink, task_t, ltasks); 433 434 /* 435 * The directory of tasks can't hold a reference, since that would 436 * prevent task from ever being destroyed. That means we have to 437 * check for the case where the task is already being destroyed, but 438 * not yet removed from the directory. 439 */ 440 if (!refcount_try_up(&task->refcount)) 441 task = NULL; 442 } 443 444 irq_spinlock_unlock(&tasks_lock, true); 445 446 return task; 436 447 } 437 448 … … 506 517 /* Current values of threads */ 507 518 list_foreach(task->threads, th_link, thread_t, thread) { 508 irq_spinlock_lock(&thread->lock, false);509 510 519 /* Process only counted threads */ 511 520 if (!thread->uncounted) { … … 515 524 } 516 525 517 uret += thread->ucycles;518 kret += thread->kcycles;526 uret += atomic_time_read(&thread->ucycles); 527 kret += atomic_time_read(&thread->kcycles); 519 528 } 520 521 irq_spinlock_unlock(&thread->lock, false);522 529 } 523 530 … … 528 535 static void task_kill_internal(task_t *task) 529 536 { 530 irq_spinlock_lock(&task->lock, false); 531 irq_spinlock_lock(&threads_lock, false); 537 irq_spinlock_lock(&task->lock, true); 532 538 533 539 /* … … 536 542 537 543 list_foreach(task->threads, th_link, thread_t, thread) { 538 bool sleeping = false; 539 540 irq_spinlock_lock(&thread->lock, false); 541 542 thread->interrupted = true; 543 if (thread->state == Sleeping) 544 sleeping = true; 545 546 irq_spinlock_unlock(&thread->lock, false); 547 548 if (sleeping) 549 waitq_interrupt_sleep(thread); 544 thread_interrupt(thread); 550 545 } 551 546 552 irq_spinlock_unlock(&threads_lock, false); 553 irq_spinlock_unlock(&task->lock, false); 547 irq_spinlock_unlock(&task->lock, true); 554 548 } 555 549 … … 569 563 return EPERM; 570 564 571 irq_spinlock_lock(&tasks_lock, true);572 573 565 task_t *task = task_find_by_id(id); 574 if (!task) { 575 irq_spinlock_unlock(&tasks_lock, true); 566 if (!task) 576 567 return ENOENT; 577 }578 568 579 569 task_kill_internal(task); 580 irq_spinlock_unlock(&tasks_lock, true); 581 570 task_release(task); 582 571 return EOK; 583 572 } … … 609 598 } 610 599 611 irq_spinlock_lock(&tasks_lock, true);612 600 task_kill_internal(TASK); 613 irq_spinlock_unlock(&tasks_lock, true);614 615 601 thread_exit(); 616 602 } … … 641 627 if (additional) 642 628 printf("%-8" PRIu64 " %9zu", task->taskid, 643 atomic_load(&task-> refcount));629 atomic_load(&task->lifecount)); 644 630 else 645 631 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" … … 653 639 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c " 654 640 "%9zu\n", task->taskid, ucycles, usuffix, kcycles, 655 ksuffix, atomic_load(&task-> refcount));641 ksuffix, atomic_load(&task->lifecount)); 656 642 else 657 643 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n",
Note:
See TracChangeset
for help on using the changeset viewer.