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