authorgravatar for kris.tate+github@gmail.comkristopher tate <kris.tate+github@gmail.com> 2018-08-05 03:38:51+09:00
committergravatar for mdsteele@alum.mit.eduMatthew D. Steele <mdsteele@alum.mit.edu> 2018-08-04 14:38:51-04:00
loga25824e033d11a8ada0d444efab9ac08a93185af
treef1d4d73e85ca4c73487e3c927b5842388e8d799a
parent86d1cc8e2fffed9c93e41b28605d764e6b1749dc

zig/std/os/index.zig: clean-up thread id; (#1)

Ref #1316 #1330

1 files changed, 18 insertions(+), 21 deletions(-)

std/os/index.zig+18-21
......@@ -2518,22 +2518,28 @@ pub const Thread = struct {
25182518 pub const use_pthreads = is_posix and builtin.link_libc;
25192519
25202520 /// 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 };
25222528
25232529 pub const Data = if (use_pthreads)
25242530 struct {
2525 handle: c.pthread_t,
2531 handle: Thread.Id,
25262532 stack_addr: usize,
25272533 stack_len: usize,
25282534 }
25292535 else switch (builtin.os) {
25302536 builtin.Os.linux => struct {
2531 pid: i32,
2537 handle: Thread.Id,
25322538 stack_addr: usize,
25332539 stack_len: usize,
25342540 },
25352541 builtin.Os.windows => struct {
2536 handle: windows.HANDLE,
2542 handle: Thread.Id,
25372543 alloc_start: *c_void,
25382544 heap_handle: windows.HANDLE,
25392545 },
......@@ -2547,26 +2553,17 @@ pub const Thread = struct {
25472553 // storage (https://github.com/ziglang/zig/issues/924), we could
25482554 // memoize it.
25492555 if (use_pthreads) {
2550 return @ptrCast(Thread.Id, c.pthread_self());
2556 return c.pthread_self();
25512557 } 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(),
25562560 else => @compileError("Unsupported OS"),
25572561 };
25582562 }
25592563
2560 /// Returns the ID of this thread object.
2564 /// Returns the ID of this thread.
25612565 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;
25702567 }
25712568
25722569 pub fn wait(self: *const Thread) void {
......@@ -2583,9 +2580,9 @@ pub const Thread = struct {
25832580 } else switch (builtin.os) {
25842581 builtin.Os.linux => {
25852582 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);
25872584 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);
25892586 switch (linux.getErrno(rc)) {
25902587 0 => continue,
25912588 posix.EINTR => continue,
......@@ -2767,7 +2764,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
27672764 // use linux API directly. TODO use posix.CLONE_SETTLS and initialize thread local storage correctly
27682765 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;
27692766 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);
27712768 const err = posix.getErrno(rc);
27722769 switch (err) {
27732770 0 => return thread_ptr,