Rev 1248 | Rev 1458 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1248 | Rev 1288 | ||
|---|---|---|---|
| Line 58... | Line 58... | ||
| 58 | #include <memstr.h> |
58 | #include <memstr.h> |
| 59 | #include <print.h> |
59 | #include <print.h> |
| 60 | #include <mm/slab.h> |
60 | #include <mm/slab.h> |
| 61 | #include <debug.h> |
61 | #include <debug.h> |
| 62 | #include <main/uinit.h> |
62 | #include <main/uinit.h> |
| - | 63 | #include <syscall/copy.h> |
|
| - | 64 | #include <errno.h> |
|
| 63 | 65 | ||
| 64 | char *thread_states[] = {"Invalid", "Running", "Sleeping", "Ready", "Entering", "Exiting"}; /**< Thread states */ |
66 | char *thread_states[] = {"Invalid", "Running", "Sleeping", "Ready", "Entering", "Exiting"}; /**< Thread states */ |
| 65 | 67 | ||
| 66 | /** Lock protecting threads_head list. For locking rules, see declaration thereof. */ |
68 | /** Lock protecting threads_head list. For locking rules, see declaration thereof. */ |
| 67 | SPINLOCK_INITIALIZE(threads_lock); |
69 | SPINLOCK_INITIALIZE(threads_lock); |
| Line 301... | Line 303... | ||
| 301 | t->call_me_with = NULL; |
303 | t->call_me_with = NULL; |
| 302 | 304 | ||
| 303 | timeout_initialize(&t->sleep_timeout); |
305 | timeout_initialize(&t->sleep_timeout); |
| 304 | t->sleep_queue = NULL; |
306 | t->sleep_queue = NULL; |
| 305 | t->timeout_pending = 0; |
307 | t->timeout_pending = 0; |
| - | 308 | ||
| - | 309 | t->in_copy_from_uspace = false; |
|
| - | 310 | t->in_copy_to_uspace = false; |
|
| 306 | 311 | ||
| 307 | t->rwlock_holder_type = RWLOCK_NONE; |
312 | t->rwlock_holder_type = RWLOCK_NONE; |
| 308 | 313 | ||
| 309 | t->task = task; |
314 | t->task = task; |
| 310 | 315 | ||
| Line 460... | Line 465... | ||
| 460 | { |
465 | { |
| 461 | thread_t *t; |
466 | thread_t *t; |
| 462 | char namebuf[THREAD_NAME_BUFLEN]; |
467 | char namebuf[THREAD_NAME_BUFLEN]; |
| 463 | uspace_arg_t *kernel_uarg; |
468 | uspace_arg_t *kernel_uarg; |
| 464 | __u32 tid; |
469 | __u32 tid; |
| - | 470 | int rc; |
|
| 465 | 471 | ||
| 466 | copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
472 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
| - | 473 | if (rc != 0) |
|
| - | 474 | return (__native) rc; |
|
| 467 | 475 | ||
| 468 | kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
476 | kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
| 469 | copy_from_uspace(kernel_uarg, uspace_uarg, sizeof(uspace_arg_t)); |
477 | rc = copy_from_uspace(kernel_uarg, uspace_uarg, sizeof(uspace_arg_t)); |
| - | 478 | if (rc != 0) { |
|
| - | 479 | free(kernel_uarg); |
|
| - | 480 | return (__native) rc; |
|
| - | 481 | } |
|
| 470 | 482 | ||
| 471 | if ((t = thread_create(uinit, kernel_uarg, TASK, 0, namebuf))) { |
483 | if ((t = thread_create(uinit, kernel_uarg, TASK, 0, namebuf))) { |
| 472 | tid = t->tid; |
484 | tid = t->tid; |
| 473 | thread_ready(t); |
485 | thread_ready(t); |
| 474 | return (__native) tid; |
486 | return (__native) tid; |
| 475 | } else { |
487 | } else { |
| 476 | free(kernel_uarg); |
488 | free(kernel_uarg); |
| 477 | } |
489 | } |
| 478 | 490 | ||
| 479 | return (__native) -1; |
491 | return (__native) ENOMEM; |
| 480 | } |
492 | } |
| 481 | 493 | ||
| 482 | /** Process syscall to terminate thread. |
494 | /** Process syscall to terminate thread. |
| 483 | * |
495 | * |
| 484 | */ |
496 | */ |