Rev 2268 | Rev 2440 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2268 | Rev 2436 | ||
|---|---|---|---|
| Line 297... | Line 297... | ||
| 297 | spinlock_unlock(&t->task->lock); |
297 | spinlock_unlock(&t->task->lock); |
| 298 | 298 | ||
| 299 | if (destroy_task) |
299 | if (destroy_task) |
| 300 | task_destroy(t->task); |
300 | task_destroy(t->task); |
| 301 | 301 | ||
| - | 302 | /* |
|
| - | 303 | * If the thread had a userspace context, free up its kernel_uarg |
|
| - | 304 | * structure. |
|
| - | 305 | */ |
|
| - | 306 | if (t->flags & THREAD_FLAG_USPACE) { |
|
| - | 307 | ASSERT(t->thread_arg); |
|
| - | 308 | free(t->thread_arg); |
|
| - | 309 | } |
|
| - | 310 | ||
| 302 | slab_free(thread_slab, t); |
311 | slab_free(thread_slab, t); |
| 303 | } |
312 | } |
| 304 | 313 | ||
| 305 | /** Create new thread |
314 | /** Create new thread |
| 306 | * |
315 | * |
| Line 310... | Line 319... | ||
| 310 | * @param arg Thread's implementing function argument. |
319 | * @param arg Thread's implementing function argument. |
| 311 | * @param task Task to which the thread belongs. |
320 | * @param task Task to which the thread belongs. |
| 312 | * @param flags Thread flags. |
321 | * @param flags Thread flags. |
| 313 | * @param name Symbolic name. |
322 | * @param name Symbolic name. |
| 314 | * @param uncounted Thread's accounting doesn't affect accumulated task |
323 | * @param uncounted Thread's accounting doesn't affect accumulated task |
| 315 | * accounting. |
324 | * accounting. |
| 316 | * |
325 | * |
| 317 | * @return New thread's structure on success, NULL on failure. |
326 | * @return New thread's structure on success, NULL on failure. |
| 318 | * |
327 | * |
| 319 | */ |
328 | */ |
| 320 | thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, |
329 | thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, |
| 321 | int flags, char *name, bool uncounted) |
330 | int flags, char *name, bool uncounted) |
| 322 | { |
331 | { |
| 323 | thread_t *t; |
332 | thread_t *t; |
| 324 | ipl_t ipl; |
333 | ipl_t ipl; |
| 325 | 334 | ||
| 326 | t = (thread_t *) slab_alloc(thread_slab, 0); |
335 | t = (thread_t *) slab_alloc(thread_slab, 0); |
| Line 635... | Line 644... | ||
| 635 | } |
644 | } |
| 636 | 645 | ||
| 637 | /** Process syscall to create new thread. |
646 | /** Process syscall to create new thread. |
| 638 | * |
647 | * |
| 639 | */ |
648 | */ |
| 640 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, thread_id_t *uspace_thread_id) |
649 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, |
| - | 650 | thread_id_t *uspace_thread_id) |
|
| 641 | { |
651 | { |
| 642 | thread_t *t; |
652 | thread_t *t; |
| 643 | char namebuf[THREAD_NAME_BUFLEN]; |
653 | char namebuf[THREAD_NAME_BUFLEN]; |
| 644 | uspace_arg_t *kernel_uarg; |
654 | uspace_arg_t *kernel_uarg; |
| 645 | int rc; |
655 | int rc; |
| Line 658... | Line 668... | ||
| 658 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
668 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
| 659 | false); |
669 | false); |
| 660 | if (t) { |
670 | if (t) { |
| 661 | thread_ready(t); |
671 | thread_ready(t); |
| 662 | if (uspace_thread_id != NULL) |
672 | if (uspace_thread_id != NULL) |
| 663 | return (unative_t) copy_to_uspace(uspace_thread_id, &t->tid, |
673 | return (unative_t) copy_to_uspace(uspace_thread_id, |
| 664 | sizeof(t->tid)); |
674 | &t->tid, sizeof(t->tid)); |
| 665 | else |
675 | else |
| 666 | return 0; |
676 | return 0; |
| 667 | } else |
677 | } else |
| 668 | free(kernel_uarg); |
678 | free(kernel_uarg); |
| 669 | 679 | ||