| ... | ... | @@ -2518,22 +2518,28 @@ pub const Thread = struct { |
| 2518 | 2518 | pub const use_pthreads = is_posix and builtin.link_libc; |
| 2519 | 2519 | |
| 2520 | 2520 | /// An opaque type representing a kernel thread ID. |
| 2521 | | pub const Id = *@OpaqueType(); |
| 2521 | pub const Id = if (use_pthreads) |
| 2522 | c.pthread_t |
| 2523 | else switch (builtin.os) { |
| 2524 | builtin.Os.linux => i32, |
| 2525 | builtin.Os.windows => windows.HANDLE, |
| 2526 | else => @compileError("Unsupported OS"), |
| 2527 | }; |
| 2522 | 2528 | |
| 2523 | 2529 | pub const Data = if (use_pthreads) |
| 2524 | 2530 | struct { |
| 2525 | | handle: c.pthread_t, |
| 2531 | handle: Thread.Id, |
| 2526 | 2532 | stack_addr: usize, |
| 2527 | 2533 | stack_len: usize, |
| 2528 | 2534 | } |
| 2529 | 2535 | else switch (builtin.os) { |
| 2530 | 2536 | builtin.Os.linux => struct { |
| 2531 | | pid: i32, |
| 2537 | handle: Thread.Id, |
| 2532 | 2538 | stack_addr: usize, |
| 2533 | 2539 | stack_len: usize, |
| 2534 | 2540 | }, |
| 2535 | 2541 | builtin.Os.windows => struct { |
| 2536 | | handle: windows.HANDLE, |
| 2542 | handle: Thread.Id, |
| 2537 | 2543 | alloc_start: *c_void, |
| 2538 | 2544 | heap_handle: windows.HANDLE, |
| 2539 | 2545 | }, |
| ... | ... | @@ -2547,26 +2553,17 @@ pub const Thread = struct { |
| 2547 | 2553 | // storage (https://github.com/ziglang/zig/issues/924), we could |
| 2548 | 2554 | // memoize it. |
| 2549 | 2555 | if (use_pthreads) { |
| 2550 | | return @ptrCast(Thread.Id, c.pthread_self()); |
| 2556 | return c.pthread_self(); |
| 2551 | 2557 | } else return switch (builtin.os) { |
| 2552 | | builtin.Os.linux => |
| 2553 | | @intToPtr(Thread.Id, @bitCast(u32, linux.getpid())), |
| 2554 | | builtin.Os.windows => |
| 2555 | | @ptrCast(Thread.Id, windows.GetCurrentThread()), |
| 2558 | builtin.Os.linux => linux.getpid(), |
| 2559 | builtin.Os.windows => windows.GetCurrentThread(), |
| 2556 | 2560 | else => @compileError("Unsupported OS"), |
| 2557 | 2561 | }; |
| 2558 | 2562 | } |
| 2559 | 2563 | |
| 2560 | | /// Returns the ID of this thread object. |
| 2564 | /// Returns the ID of this thread. |
| 2561 | 2565 | pub fn id(self: *const Thread) Thread.Id { |
| 2562 | | if (use_pthreads) { |
| 2563 | | return @ptrCast(Thread.Id, self.data.handle); |
| 2564 | | } else return switch (builtin.os) { |
| 2565 | | builtin.Os.linux => |
| 2566 | | @intToPtr(Thread.Id, @bitCast(u32, self.data.pid)), |
| 2567 | | builtin.Os.windows => @ptrCast(Thread.Id, self.data.handle), |
| 2568 | | else => @compileError("Unsupported OS"), |
| 2569 | | }; |
| 2566 | return self.data.handle; |
| 2570 | 2567 | } |
| 2571 | 2568 | |
| 2572 | 2569 | pub fn wait(self: *const Thread) void { |
| ... | ... | @@ -2583,9 +2580,9 @@ pub const Thread = struct { |
| 2583 | 2580 | } else switch (builtin.os) { |
| 2584 | 2581 | builtin.Os.linux => { |
| 2585 | 2582 | while (true) { |
| 2586 | | const pid_value = @atomicLoad(i32, &self.data.pid, builtin.AtomicOrder.SeqCst); |
| 2583 | const pid_value = @atomicLoad(i32, &self.data.handle, builtin.AtomicOrder.SeqCst); |
| 2587 | 2584 | if (pid_value == 0) break; |
| 2588 | | const rc = linux.futex_wait(@ptrToInt(&self.data.pid), linux.FUTEX_WAIT, pid_value, null); |
| 2585 | const rc = linux.futex_wait(@ptrToInt(&self.data.handle), linux.FUTEX_WAIT, pid_value, null); |
| 2589 | 2586 | switch (linux.getErrno(rc)) { |
| 2590 | 2587 | 0 => continue, |
| 2591 | 2588 | posix.EINTR => continue, |
| ... | ... | @@ -2767,7 +2764,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread |
| 2767 | 2764 | // use linux API directly. TODO use posix.CLONE_SETTLS and initialize thread local storage correctly |
| 2768 | 2765 | const flags = posix.CLONE_VM | posix.CLONE_FS | posix.CLONE_FILES | posix.CLONE_SIGHAND | posix.CLONE_THREAD | posix.CLONE_SYSVSEM | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID | posix.CLONE_DETACHED; |
| 2769 | 2766 | const newtls: usize = 0; |
| 2770 | | const rc = posix.clone(MainFuncs.linuxThreadMain, stack_end, flags, arg, &thread_ptr.data.pid, newtls, &thread_ptr.data.pid); |
| 2767 | const rc = posix.clone(MainFuncs.linuxThreadMain, stack_end, flags, arg, &thread_ptr.data.handle, newtls, &thread_ptr.data.handle); |
| 2771 | 2768 | const err = posix.getErrno(rc); |
| 2772 | 2769 | switch (err) { |
| 2773 | 2770 | 0 => return thread_ptr, |