@@ -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 ,
0 commit comments