| ... | @@ -2499,13 +2499,13 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread | ... | @@ -2499,13 +2499,13 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread |
| 2499 | | 2499 | |
| 2500 | const MAP_GROWSDOWN = if (builtin.os == builtin.Os.linux) linux.MAP_GROWSDOWN else 0; | 2500 | const MAP_GROWSDOWN = if (builtin.os == builtin.Os.linux) linux.MAP_GROWSDOWN else 0; |
| 2501 | | 2501 | |
| 2502 | const stack_len = default_stack_size; | 2502 | const mmap_len = default_stack_size; |
| 2503 | const stack_addr = posix.mmap(null, stack_len, posix.PROT_READ|posix.PROT_WRITE, | 2503 | const stack_addr = posix.mmap(null, mmap_len, posix.PROT_READ|posix.PROT_WRITE, |
| 2504 | posix.MAP_PRIVATE|posix.MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); | 2504 | posix.MAP_PRIVATE|posix.MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); |
| 2505 | if (stack_addr == posix.MAP_FAILED) return error.OutOfMemory; | 2505 | if (stack_addr == posix.MAP_FAILED) return error.OutOfMemory; |
| 2506 | errdefer assert(posix.munmap(stack_addr, stack_len) == 0); | 2506 | errdefer assert(posix.munmap(stack_addr, mmap_len) == 0); |
| 2507 | | 2507 | |
| 2508 | var stack_end: usize = stack_addr + stack_len; | 2508 | var stack_end: usize = stack_addr + mmap_len; |
| 2509 | var arg: usize = undefined; | 2509 | var arg: usize = undefined; |
| 2510 | if (@sizeOf(Context) != 0) { | 2510 | if (@sizeOf(Context) != 0) { |
| 2511 | stack_end -= @sizeOf(Context); | 2511 | stack_end -= @sizeOf(Context); |
| ... | @@ -2521,6 +2521,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread | ... | @@ -2521,6 +2521,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread |
| 2521 | assert(stack_end >= stack_addr); | 2521 | assert(stack_end >= stack_addr); |
| 2522 | const thread_ptr = @alignCast(@alignOf(Thread), @intToPtr(&Thread, stack_end)); | 2522 | const thread_ptr = @alignCast(@alignOf(Thread), @intToPtr(&Thread, stack_end)); |
| 2523 | | 2523 | |
| | 2524 | thread_ptr.data.stack_addr = stack_addr; |
| | 2525 | thread_ptr.data.stack_len = mmap_len; |
| 2524 | | 2526 | |
| 2525 | if (builtin.os == builtin.Os.windows) { | 2527 | if (builtin.os == builtin.Os.windows) { |
| 2526 | // use windows API directly | 2528 | // use windows API directly |
| ... | @@ -2533,10 +2535,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread | ... | @@ -2533,10 +2535,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread |
| 2533 | | 2535 | |
| 2534 | // align to page | 2536 | // align to page |
| 2535 | stack_end -= stack_end % os.page_size; | 2537 | stack_end -= stack_end % os.page_size; |
| 2536 | assert(c.pthread_attr_setstack(&attr, @intToPtr(&c_void, stack_addr), stack_len) == 0); | 2538 | assert(c.pthread_attr_setstack(&attr, @intToPtr(&c_void, stack_addr), stack_end - stack_addr) == 0); |
| 2537 | | | |
| 2538 | thread_ptr.data.stack_addr = stack_addr; | | |
| 2539 | thread_ptr.data.stack_len = stack_len; | | |
| 2540 | | 2539 | |
| 2541 | const err = c.pthread_create(&thread_ptr.data.handle, &attr, MainFuncs.posixThreadMain, @intToPtr(&c_void, arg)); | 2540 | const err = c.pthread_create(&thread_ptr.data.handle, &attr, MainFuncs.posixThreadMain, @intToPtr(&c_void, arg)); |
| 2542 | switch (err) { | 2541 | switch (err) { |
| ... | @@ -2552,7 +2551,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread | ... | @@ -2552,7 +2551,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread |
| 2552 | | posix.CLONE_THREAD | posix.CLONE_SYSVSEM // | posix.CLONE_SETTLS | 2551 | | posix.CLONE_THREAD | posix.CLONE_SYSVSEM // | posix.CLONE_SETTLS |
| 2553 | | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID | posix.CLONE_DETACHED; | 2552 | | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID | posix.CLONE_DETACHED; |
| 2554 | const newtls: usize = 0; | 2553 | const newtls: usize = 0; |
| 2555 | const rc = posix.clone(MainFuncs.linuxThreadMain, stack_end, flags, arg, &thread_ptr.pid, newtls, &thread_ptr.pid); | 2554 | const rc = posix.clone(MainFuncs.linuxThreadMain, stack_end, flags, arg, &thread_ptr.data.pid, newtls, &thread_ptr.data.pid); |
| 2556 | const err = posix.getErrno(rc); | 2555 | const err = posix.getErrno(rc); |
| 2557 | switch (err) { | 2556 | switch (err) { |
| 2558 | 0 => return thread_ptr, | 2557 | 0 => return thread_ptr, |