| ... | ... | @@ -893,6 +893,7 @@ const LinuxThreadImpl = struct { |
| 893 | 893 | }; |
| 894 | 894 | |
| 895 | 895 | fn spawn(config: SpawnConfig, comptime f: anytype, args: anytype) !Impl { |
| 896 | const page_size = std.mem.page_size; |
| 896 | 897 | const Args = @TypeOf(args); |
| 897 | 898 | const Instance = struct { |
| 898 | 899 | fn_args: Args, |
| ... | ... | @@ -915,11 +916,11 @@ const LinuxThreadImpl = struct { |
| 915 | 916 | var instance_offset: usize = undefined; |
| 916 | 917 | |
| 917 | 918 | const map_bytes = blk: { |
| 918 | | var bytes: usize = std.mem.page_size; |
| 919 | var bytes: usize = page_size; |
| 919 | 920 | guard_offset = bytes; |
| 920 | 921 | |
| 921 | | bytes += std.math.max(std.mem.page_size, config.stack_size); |
| 922 | | bytes = std.mem.alignForward(bytes, std.mem.page_size); |
| 922 | bytes += std.math.max(page_size, config.stack_size); |
| 923 | bytes = std.mem.alignForward(bytes, page_size); |
| 923 | 924 | stack_offset = bytes; |
| 924 | 925 | |
| 925 | 926 | bytes = std.mem.alignForward(bytes, linux.tls.tls_image.alloc_align); |
| ... | ... | @@ -930,7 +931,7 @@ const LinuxThreadImpl = struct { |
| 930 | 931 | instance_offset = bytes; |
| 931 | 932 | bytes += @sizeOf(Instance); |
| 932 | 933 | |
| 933 | | bytes = std.mem.alignForward(bytes, std.mem.page_size); |
| 934 | bytes = std.mem.alignForward(bytes, page_size); |
| 934 | 935 | break :blk bytes; |
| 935 | 936 | }; |
| 936 | 937 | |
| ... | ... | @@ -954,7 +955,7 @@ const LinuxThreadImpl = struct { |
| 954 | 955 | |
| 955 | 956 | // map everything but the guard page as read/write |
| 956 | 957 | os.mprotect( |
| 957 | | mapped[guard_offset..], |
| 958 | @alignCast(page_size, mapped[guard_offset..]), |
| 958 | 959 | os.PROT.READ | os.PROT.WRITE, |
| 959 | 960 | ) catch |err| switch (err) { |
| 960 | 961 | error.AccessDenied => unreachable, |