Changeset 07d4271 in mainline for kernel/generic/src/proc/task.c
- Timestamp:
- 2024-01-25T16:22:55Z (12 months ago)
- Branches:
- master
- Children:
- f8b69a1e
- Parents:
- 1a1e124
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2024-01-25 15:56:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2024-01-25 16:22:55)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/task.c
r1a1e124 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); … … 268 269 * 269 270 */ 270 void task_destroy(task_t *task)271 static void task_destroy(task_t *task) 271 272 { 272 273 /* … … 299 300 void task_hold(task_t *task) 300 301 { 301 atomic_inc(&task->refcount);302 refcount_up(&task->refcount); 302 303 } 303 304 … … 311 312 void task_release(task_t *task) 312 313 { 313 if ( (atomic_predec(&task->refcount)) == 0)314 if (refcount_down(&task->refcount)) 314 315 task_destroy(task); 315 316 } … … 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 … … 524 535 static void task_kill_internal(task_t *task) 525 536 { 526 irq_spinlock_lock(&task->lock, false);537 irq_spinlock_lock(&task->lock, true); 527 538 528 539 /* … … 534 545 } 535 546 536 irq_spinlock_unlock(&task->lock, false);547 irq_spinlock_unlock(&task->lock, true); 537 548 } 538 549 … … 552 563 return EPERM; 553 564 554 irq_spinlock_lock(&tasks_lock, true);555 556 565 task_t *task = task_find_by_id(id); 557 if (!task) { 558 irq_spinlock_unlock(&tasks_lock, true); 566 if (!task) 559 567 return ENOENT; 560 }561 568 562 569 task_kill_internal(task); 563 irq_spinlock_unlock(&tasks_lock, true); 564 570 task_release(task); 565 571 return EOK; 566 572 } … … 592 598 } 593 599 594 irq_spinlock_lock(&tasks_lock, true);595 600 task_kill_internal(TASK); 596 irq_spinlock_unlock(&tasks_lock, true);597 598 601 thread_exit(); 599 602 } … … 624 627 if (additional) 625 628 printf("%-8" PRIu64 " %9zu", task->taskid, 626 atomic_load(&task-> refcount));629 atomic_load(&task->lifecount)); 627 630 else 628 631 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" … … 636 639 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c " 637 640 "%9zu\n", task->taskid, ucycles, usuffix, kcycles, 638 ksuffix, atomic_load(&task-> refcount));641 ksuffix, atomic_load(&task->lifecount)); 639 642 else 640 643 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n",
Note:
See TracChangeset
for help on using the changeset viewer.