authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 00:07:32-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 00:07:32-04:00
loga42542099392cf189b96bdd77ecd88feadfb6382
tree723f625b401ca2bfbe1c343d2f19e472a514ba65
parent998e25a01e8b3ada235aee4a9f785a7454de4b3f

make pthreads threads work on darwin

darwin pthreads adds a restriction that the stack start and end must be page aligned

2 files changed, 9 insertions(+), 5 deletions(-)

std/os/index.zig+7-3
...@@ -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 bound2421 // TODO compile-time call graph analysis to determine stack upper bound
2422 // https://github.com/zig-lang/zig/issues/1572422 // 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)) T2431/// fn startFn(@typeOf(context)) T
2432/// where T is u8, noreturn, void, or !void2432/// where T is u8, noreturn, void, or !void
2433/// caller must call wait on the returned thread2433/// caller must call wait on the returned thread
2434pub fn spawnThread(stack: []u8, context: var, comptime startFn: var) SpawnThreadError!&Thread {2434pub 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);
24372437
...@@ -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);
24832483
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 bytes2490 return SpawnThreadError.StackTooSmall; // pthreads requires at least 16384 bytes
2487 }2491 }
24882492
std/os/test.zig+2-2
...@@ -57,8 +57,8 @@ test "spawn threads" {...@@ -57,8 +57,8 @@ test "spawn threads" {
57 const thread1 = try std.os.spawnThreadAllocator(&direct_allocator.allocator, {}, start1);57 const thread1 = try std.os.spawnThreadAllocator(&direct_allocator.allocator, {}, start1);
58 const thread4 = try std.os.spawnThreadAllocator(&direct_allocator.allocator, &shared_ctx, start2);58 const thread4 = try std.os.spawnThreadAllocator(&direct_allocator.allocator, &shared_ctx, start2);
5959
60 var stack1: [20 * 1024]u8 = undefined;60 var stack1: [20 * 1024]u8 align(os.page_size) = undefined;
61 var stack2: [20 * 1024]u8 = undefined;61 var stack2: [20 * 1024]u8 align(os.page_size) = undefined;
6262
63 const thread2 = try std.os.spawnThread(stack1[0..], &shared_ctx, start2);63 const thread2 = try std.os.spawnThread(stack1[0..], &shared_ctx, start2);
64 const thread3 = try std.os.spawnThread(stack2[0..], &shared_ctx, start2);64 const thread3 = try std.os.spawnThread(stack2[0..], &shared_ctx, start2);