| ... | ... | @@ -2421,7 +2421,7 @@ pub fn spawnThreadAllocator(allocator: &mem.Allocator, context: var, comptime st |
| 2421 | 2421 | // TODO compile-time call graph analysis to determine stack upper bound |
| 2422 | 2422 | // https://github.com/zig-lang/zig/issues/157 |
| 2423 | 2423 | const default_stack_size = 8 * 1024 * 1024; |
| 2424 | | const stack_bytes = try allocator.alloc(u8, default_stack_size); |
| 2424 | const stack_bytes = try allocator.alignedAlloc(u8, os.page_size, default_stack_size); |
| 2425 | 2425 | const thread = try spawnThread(stack_bytes, context, startFn); |
| 2426 | 2426 | thread.allocator = allocator; |
| 2427 | 2427 | return thread; |
| ... | ... | @@ -2431,7 +2431,7 @@ pub fn spawnThreadAllocator(allocator: &mem.Allocator, context: var, comptime st |
| 2431 | 2431 | /// fn startFn(@typeOf(context)) T |
| 2432 | 2432 | /// where T is u8, noreturn, void, or !void |
| 2433 | 2433 | /// caller must call wait on the returned thread |
| 2434 | | pub fn spawnThread(stack: []u8, context: var, comptime startFn: var) SpawnThreadError!&Thread { |
| 2434 | pub fn spawnThread(stack: []align(os.page_size) u8, context: var, comptime startFn: var) SpawnThreadError!&Thread { |
| 2435 | 2435 | const Context = @typeOf(context); |
| 2436 | 2436 | comptime assert(@ArgType(@typeOf(startFn), 0) == Context); |
| 2437 | 2437 | |
| ... | ... | @@ -2481,8 +2481,12 @@ pub fn spawnThread(stack: []u8, context: var, comptime startFn: var) SpawnThread |
| 2481 | 2481 | if (c.pthread_attr_init(&attr) != 0) return SpawnThreadError.SystemResources; |
| 2482 | 2482 | defer assert(c.pthread_attr_destroy(&attr) == 0); |
| 2483 | 2483 | |
| 2484 | // align to page |
| 2485 | stack_end -= stack_end % os.page_size; |
| 2486 | |
| 2484 | 2487 | const stack_size = stack_end - @ptrToInt(stack.ptr); |
| 2485 | | if (c.pthread_attr_setstack(&attr, @ptrCast(&c_void, stack.ptr), stack_size) != 0) { |
| 2488 | const setstack_err = c.pthread_attr_setstack(&attr, @ptrCast(&c_void, stack.ptr), stack_size); |
| 2489 | if (setstack_err != 0) { |
| 2486 | 2490 | return SpawnThreadError.StackTooSmall; // pthreads requires at least 16384 bytes |
| 2487 | 2491 | } |
| 2488 | 2492 | |