authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-01-01 14:57:03-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-01-01 14:57:03-07:00
log6c0c275b279cfe52758fb9577921e600dd85c436
tree3ba0a4865d1dfa927583d5af121e59fa377c3076
parent3bce5b2f30c2f711a5e8cf481fc8f6381f7b1436
parentc24540d263c6190ad48eee313079dd5d36bed1d6

Merge branch 'LemonBoy-panicthreadid'

closes #6869

6 files changed, 45 insertions(+), 0 deletions(-)

lib/std/c/darwin.zig+3
......@@ -186,6 +186,9 @@ pub const pthread_attr_t = extern struct {
186186 __opaque: [56]u8,
187187};
188188
189const pthread_t = std.c.pthread_t;
190pub extern "c" fn pthread_threadid_np(thread: ?pthread_t, thread_id: *u64) c_int;
191
189192pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void;
190193
191194// Grand Central Dispatch is exposed by libSystem.
lib/std/c/freebsd.zig+2
......@@ -13,6 +13,8 @@ pub extern "c" fn getdents(fd: c_int, buf_ptr: [*]u8, nbytes: usize) usize;
1313pub extern "c" fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) c_int;
1414pub extern "c" fn getrandom(buf_ptr: [*]u8, buf_len: usize, flags: c_uint) isize;
1515
16pub extern "c" fn pthread_getthreadid_np() c_int;
17
1618pub extern "c" fn posix_memalign(memptr: *?*c_void, alignment: usize, size: usize) c_int;
1719pub extern "c" fn malloc_usable_size(?*const c_void) usize;
1820
lib/std/c/netbsd.zig+2
......@@ -14,6 +14,8 @@ pub const _errno = __errno;
1414pub const dl_iterate_phdr_callback = fn (info: *dl_phdr_info, size: usize, data: ?*c_void) callconv(.C) c_int;
1515pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int;
1616
17pub extern "c" fn _lwp_self() lwpid_t;
18
1719pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void;
1820pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int;
1921pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int;
lib/std/c/openbsd.zig+2
......@@ -16,6 +16,8 @@ pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_
1616
1717pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void;
1818
19pub extern "c" fn getthrid() pid_t;
20
1921pub extern "c" fn getdents(fd: c_int, buf_ptr: [*]u8, nbytes: usize) usize;
2022pub extern "c" fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) c_int;
2123
lib/std/debug.zig+6
......@@ -262,6 +262,12 @@ pub fn panicExtra(trace: ?*const builtin.StackTrace, first_trace_addr: ?usize, c
262262 defer held.release();
263263
264264 const stderr = io.getStdErr().writer();
265 if (builtin.single_threaded) {
266 stderr.print("panic: ", .{}) catch os.abort();
267 } else {
268 const current_thread_id = std.Thread.getCurrentThreadId();
269 stderr.print("thread {d} panic: ", .{current_thread_id}) catch os.abort();
270 }
265271 stderr.print(format ++ "\n", args) catch os.abort();
266272 if (trace) |t| {
267273 dumpStackTrace(t.*);
lib/std/thread.zig+30
......@@ -493,4 +493,34 @@ pub const Thread = struct {
493493 };
494494 return @intCast(usize, count);
495495 }
496
497 pub fn getCurrentThreadId() u64 {
498 switch (std.Target.current.os.tag) {
499 .linux => {
500 // Use the syscall directly as musl doesn't provide a wrapper.
501 return @bitCast(u32, os.linux.gettid());
502 },
503 .windows => {
504 return os.windows.kernel32.GetCurrentThreadId();
505 },
506 .macos, .ios, .watchos, .tvos => {
507 var thread_id: u64 = undefined;
508 // Pass thread=null to get the current thread ID.
509 assert(c.pthread_threadid_np(null, &thread_id) == 0);
510 return thread_id;
511 },
512 .netbsd => {
513 return @bitCast(u32, c._lwp_self());
514 },
515 .freebsd => {
516 return @bitCast(u32, c.pthread_getthreadid_np());
517 },
518 .openbsd => {
519 return @bitCast(u32, c.getthrid());
520 },
521 else => {
522 @compileError("getCurrentThreadId not implemented for this platform");
523 },
524 }
525 }
496526};