authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 02:56:59-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 02:56:59-04:00
logc76b0a845fb4176479c8bbf915e57dbdfdb7a594
tree2f14b3db15ac9d6594a59558669fef18917ec377
parentb21bcbd7755d236a313c06e6ff167f5395ab8ed4

fix std threads for linux


1 files changed, 8 insertions(+), 9 deletions(-)

std/os/index.zig+8-9
...@@ -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
24992499
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;
25012501
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);
25072507
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));
25232523
2524 thread_ptr.data.stack_addr = stack_addr;
2525 thread_ptr.data.stack_len = mmap_len;
25242526
2525 if (builtin.os == builtin.Os.windows) {2527 if (builtin.os == builtin.Os.windows) {
2526 // use windows API directly2528 // 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
25332535
2534 // align to page2536 // 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;
25402539
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_SETTLS2551 | 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,