Rev 3431 | Rev 3623 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3431 | Rev 3597 | ||
|---|---|---|---|
| Line 277... | Line 277... | ||
| 277 | * @param arg Thread's implementing function argument. |
277 | * @param arg Thread's implementing function argument. |
| 278 | * @param task Task to which the thread belongs. The caller must |
278 | * @param task Task to which the thread belongs. The caller must |
| 279 | * guarantee that the task won't cease to exist during the |
279 | * guarantee that the task won't cease to exist during the |
| 280 | * call. The task's lock may not be held. |
280 | * call. The task's lock may not be held. |
| 281 | * @param flags Thread flags. |
281 | * @param flags Thread flags. |
| 282 | * @param name Symbolic name. |
282 | * @param name Symbolic name (a copy is made). |
| 283 | * @param uncounted Thread's accounting doesn't affect accumulated task |
283 | * @param uncounted Thread's accounting doesn't affect accumulated task |
| 284 | * accounting. |
284 | * accounting. |
| 285 | * |
285 | * |
| 286 | * @return New thread's structure on success, NULL on failure. |
286 | * @return New thread's structure on success, NULL on failure. |
| 287 | * |
287 | * |
| Line 314... | Line 314... | ||
| 314 | ipl = interrupts_disable(); |
314 | ipl = interrupts_disable(); |
| 315 | t->saved_context.ipl = interrupts_read(); |
315 | t->saved_context.ipl = interrupts_read(); |
| 316 | interrupts_restore(ipl); |
316 | interrupts_restore(ipl); |
| 317 | 317 | ||
| 318 | memcpy(t->name, name, THREAD_NAME_BUFLEN); |
318 | memcpy(t->name, name, THREAD_NAME_BUFLEN); |
| - | 319 | t->name[THREAD_NAME_BUFLEN - 1] = '\0'; |
|
| 319 | 320 | ||
| 320 | t->thread_code = func; |
321 | t->thread_code = func; |
| 321 | t->thread_arg = arg; |
322 | t->thread_arg = arg; |
| 322 | t->ticks = -1; |
323 | t->ticks = -1; |
| 323 | t->cycles = 0; |
324 | t->cycles = 0; |
| Line 706... | Line 707... | ||
| 706 | 707 | ||
| 707 | /** Process syscall to create new thread. |
708 | /** Process syscall to create new thread. |
| 708 | * |
709 | * |
| 709 | */ |
710 | */ |
| 710 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, |
711 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, |
| 711 | thread_id_t *uspace_thread_id) |
712 | size_t name_len, thread_id_t *uspace_thread_id) |
| 712 | { |
713 | { |
| 713 | thread_t *t; |
714 | thread_t *t; |
| 714 | char namebuf[THREAD_NAME_BUFLEN]; |
715 | char namebuf[THREAD_NAME_BUFLEN]; |
| 715 | uspace_arg_t *kernel_uarg; |
716 | uspace_arg_t *kernel_uarg; |
| 716 | int rc; |
717 | int rc; |
| 717 | 718 | ||
| - | 719 | if (name_len > THREAD_NAME_BUFLEN - 1) |
|
| - | 720 | name_len = THREAD_NAME_BUFLEN - 1; |
|
| - | 721 | ||
| 718 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
722 | rc = copy_from_uspace(namebuf, uspace_name, name_len); |
| 719 | if (rc != 0) |
723 | if (rc != 0) |
| 720 | return (unative_t) rc; |
724 | return (unative_t) rc; |
| 721 | 725 | ||
| - | 726 | namebuf[name_len] = '\0'; |
|
| - | 727 | ||
| 722 | /* |
728 | /* |
| 723 | * In case of failure, kernel_uarg will be deallocated in this function. |
729 | * In case of failure, kernel_uarg will be deallocated in this function. |
| 724 | * In case of success, kernel_uarg will be freed in uinit(). |
730 | * In case of success, kernel_uarg will be freed in uinit(). |
| 725 | */ |
731 | */ |
| 726 | kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
732 | kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |