Changes in kernel/generic/src/proc/task.c [5bcf1f9:be06914] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/task.c
r5bcf1f9 rbe06914 151 151 atomic_set(&task->refcount, 0); 152 152 atomic_set(&task->lifecount, 0); 153 atomic_set(&task->active_calls, 0); 153 154 154 155 irq_spinlock_initialize(&task->lock, "task_t_lock"); … … 290 291 } 291 292 292 #ifdef __32_BITS__ 293 294 /** Syscall for reading task ID from userspace (32 bits) 295 * 296 * @param uspace_taskid Pointer to user-space buffer 297 * where to store current task ID. 293 /** Syscall for reading task ID from userspace. 294 * 295 * @param uspace_task_id Userspace address of 8-byte buffer 296 * where to store current task ID. 298 297 * 299 298 * @return Zero on success or an error code from @ref errno.h. 300 299 * 301 300 */ 302 sysarg_t sys_task_get_id(sysarg64_t *uspace_taskid)301 unative_t sys_task_get_id(task_id_t *uspace_task_id) 303 302 { 304 303 /* … … 306 305 * the lifespan of the task. 307 306 */ 308 return ( sysarg_t) copy_to_uspace(uspace_taskid, &TASK->taskid,307 return (unative_t) copy_to_uspace(uspace_task_id, &TASK->taskid, 309 308 sizeof(TASK->taskid)); 310 309 } 311 312 #endif /* __32_BITS__ */313 314 #ifdef __64_BITS__315 316 /** Syscall for reading task ID from userspace (64 bits)317 *318 * @return Current task ID.319 *320 */321 sysarg_t sys_task_get_id(void)322 {323 /*324 * No need to acquire lock on TASK because taskid remains constant for325 * the lifespan of the task.326 */327 return TASK->taskid;328 }329 330 #endif /* __64_BITS__ */331 310 332 311 /** Syscall for setting the task name. … … 340 319 * 341 320 */ 342 sysarg_t sys_task_set_name(const char *uspace_name, size_t name_len) 343 { 321 unative_t sys_task_set_name(const char *uspace_name, size_t name_len) 322 { 323 int rc; 344 324 char namebuf[TASK_NAME_BUFLEN]; 345 325 346 326 /* Cap length of name and copy it from userspace. */ 327 347 328 if (name_len > TASK_NAME_BUFLEN - 1) 348 329 name_len = TASK_NAME_BUFLEN - 1; 349 330 350 intrc = copy_from_uspace(namebuf, uspace_name, name_len);331 rc = copy_from_uspace(namebuf, uspace_name, name_len); 351 332 if (rc != 0) 352 return ( sysarg_t) rc;333 return (unative_t) rc; 353 334 354 335 namebuf[name_len] = '\0'; 355 356 /*357 * As the task name is referenced also from the358 * threads, lock the threads' lock for the course359 * of the update.360 */361 362 irq_spinlock_lock(&tasks_lock, true);363 irq_spinlock_lock(&TASK->lock, false);364 irq_spinlock_lock(&threads_lock, false);365 366 /* Set task name */367 336 str_cpy(TASK->name, TASK_NAME_BUFLEN, namebuf); 368 337 369 irq_spinlock_unlock(&threads_lock, false);370 irq_spinlock_unlock(&TASK->lock, false);371 irq_spinlock_unlock(&tasks_lock, true);372 373 338 return EOK; 374 }375 376 /** Syscall to forcefully terminate a task377 *378 * @param uspace_taskid Pointer to task ID in user space.379 *380 * @return 0 on success or an error code from @ref errno.h.381 *382 */383 sysarg_t sys_task_kill(task_id_t *uspace_taskid)384 {385 task_id_t taskid;386 int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(taskid));387 if (rc != 0)388 return (sysarg_t) rc;389 390 return (sysarg_t) task_kill(taskid);391 339 } 392 340 … … 461 409 static void task_kill_internal(task_t *task) 462 410 { 411 link_t *cur; 412 413 /* 414 * Interrupt all threads. 415 */ 463 416 irq_spinlock_lock(&task->lock, false); 464 irq_spinlock_lock(&threads_lock, false);465 466 /*467 * Interrupt all threads.468 */469 470 link_t *cur;471 417 for (cur = task->th_head.next; cur != &task->th_head; cur = cur->next) { 472 418 thread_t *thread = list_get_instance(cur, thread_t, th_link); … … 485 431 } 486 432 487 irq_spinlock_unlock(&threads_lock, false);488 433 irq_spinlock_unlock(&task->lock, false); 489 434 } … … 515 460 irq_spinlock_unlock(&tasks_lock, true); 516 461 517 return EOK;518 }519 520 /** Kill the currently running task.521 *522 * @param notify Send out fault notifications.523 *524 * @return Zero on success or an error code from errno.h.525 *526 */527 void task_kill_self(bool notify)528 {529 /*530 * User space can subscribe for FAULT events to take action531 * whenever a task faults (to take a dump, run a debugger, etc.).532 * The notification is always available, but unless udebug is enabled,533 * that's all you get.534 */535 if (notify) {536 if (event_is_subscribed(EVENT_FAULT)) {537 /* Notify the subscriber that a fault occurred. */538 event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid),539 UPPER32(TASK->taskid), (sysarg_t) THREAD);540 541 #ifdef CONFIG_UDEBUG542 /* Wait for a debugging session. */543 udebug_thread_fault();544 #endif545 }546 }547 548 irq_spinlock_lock(&tasks_lock, true);549 task_kill_internal(TASK);550 irq_spinlock_unlock(&tasks_lock, true);551 552 thread_exit();553 }554 555 /** Process syscall to terminate the current task.556 *557 * @param notify Send out fault notifications.558 *559 */560 sysarg_t sys_task_exit(sysarg_t notify)561 {562 task_kill_self(notify);563 564 /* Unreachable */565 462 return EOK; 566 463 } … … 581 478 #ifdef __32_BITS__ 582 479 if (*additional) 583 printf("%-8" PRIu64 " %9 " PRIua, task->taskid,584 atomic_get(&task->refcount) );480 printf("%-8" PRIu64 " %9lu %7lu", task->taskid, 481 atomic_get(&task->refcount), atomic_get(&task->active_calls)); 585 482 else 586 483 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" … … 592 489 #ifdef __64_BITS__ 593 490 if (*additional) 594 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c "595 "%9" PRIua, task->taskid, ucycles, usuffix, kcycles,596 ksuffix, atomic_get(&task->refcount));491 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c %9lu %7lu", 492 task->taskid, ucycles, usuffix, kcycles, ksuffix, 493 atomic_get(&task->refcount), atomic_get(&task->active_calls)); 597 494 else 598 495 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n", … … 604 501 for (i = 0; i < IPC_MAX_PHONES; i++) { 605 502 if (task->phones[i].callee) 606 printf(" % zu:%p", i, task->phones[i].callee);503 printf(" %" PRIs ":%p", i, task->phones[i].callee); 607 504 } 608 505 printf("\n");
Note:
See TracChangeset
for help on using the changeset viewer.