summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQwerasd <qwerasd205@users.noreply.github.com>2025-04-09 15:26:28 -0600
committerQwerasd <qwerasd205@users.noreply.github.com>2025-06-20 15:18:41 -0600
commit7cfc906c607d94b19613fff17bf261c36f0fca92 (patch)
tree7cb346f6e1ff9c87c8951564934cf643265d3347
parent77c050c156945a8bc7f1e46f732e33e842a58fe0 (diff)
debug: properly set thread names on macOS
-rw-r--r--src/crash/sentry.zig7
-rw-r--r--src/os/cf_release_thread.zig8
-rw-r--r--src/os/macos.zig4
-rw-r--r--src/renderer/Thread.zig7
-rw-r--r--src/termio/Exec.zig7
-rw-r--r--src/termio/Thread.zig8
6 files changed, 41 insertions, 0 deletions
diff --git a/src/crash/sentry.zig b/src/crash/sentry.zig
index c29184020..820c3e9a1 100644
--- a/src/crash/sentry.zig
+++ b/src/crash/sentry.zig
@@ -81,6 +81,13 @@ pub fn init(gpa: Allocator) !void {
fn initThread(gpa: Allocator) !void {
if (comptime !build_options.sentry) return;
+ // Right now, on Darwin, `std.Thread.setName` can only name the current
+ // thread, and we have no way to get the current thread from within it,
+ // so instead we use this code to name the thread instead.
+ if (builtin.os.tag.isDarwin()) {
+ internal_os.macos.pthread_setname_np(&"sentry-init".*);
+ }
+
var arena = std.heap.ArenaAllocator.init(gpa);
defer arena.deinit();
const alloc = arena.allocator();
diff --git a/src/os/cf_release_thread.zig b/src/os/cf_release_thread.zig
index dbf8e6592..445dc4864 100644
--- a/src/os/cf_release_thread.zig
+++ b/src/os/cf_release_thread.zig
@@ -8,6 +8,7 @@ const std = @import("std");
const builtin = @import("builtin");
const macos = @import("macos");
+const internal_os = @import("../os/main.zig");
const xev = @import("../global.zig").xev;
const BlockingQueue = @import("../datastruct/main.zig").BlockingQueue;
@@ -119,6 +120,13 @@ pub fn threadMain(self: *Thread) void {
fn threadMain_(self: *Thread) !void {
defer log.debug("cf release thread exited", .{});
+ // Right now, on Darwin, `std.Thread.setName` can only name the current
+ // thread, and we have no way to get the current thread from within it,
+ // so instead we use this code to name the thread instead.
+ if (builtin.os.tag.isDarwin()) {
+ internal_os.macos.pthread_setname_np(&"cf_release".*);
+ }
+
// Start the async handlers. We start these first so that they're
// registered even if anything below fails so we can drain the mailbox.
self.wakeup.wait(&self.loop, &self.wakeup_c, Thread, self, wakeupCallback);
diff --git a/src/os/macos.zig b/src/os/macos.zig
index ca7c81a47..100d0fe44 100644
--- a/src/os/macos.zig
+++ b/src/os/macos.zig
@@ -88,6 +88,10 @@ extern "c" fn pthread_set_qos_class_self_np(
relative_priority: c_int,
) c_int;
+pub extern "c" fn pthread_setname_np(
+ name: [*:0]const u8,
+) void;
+
pub const NSOperatingSystemVersion = extern struct {
major: i64,
minor: i64,
diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig
index 1e9c29b26..52f599549 100644
--- a/src/renderer/Thread.zig
+++ b/src/renderer/Thread.zig
@@ -198,6 +198,13 @@ pub fn threadMain(self: *Thread) void {
fn threadMain_(self: *Thread) !void {
defer log.debug("renderer thread exited", .{});
+ // Right now, on Darwin, `std.Thread.setName` can only name the current
+ // thread, and we have no way to get the current thread from within it,
+ // so instead we use this code to name the thread instead.
+ if (builtin.os.tag.isDarwin()) {
+ internal_os.macos.pthread_setname_np(&"renderer".*);
+ }
+
// Setup our crash metadata
crash.sentry.thread_state = .{
.type = .renderer,
diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig
index 317ad13b4..aed7cefb6 100644
--- a/src/termio/Exec.zig
+++ b/src/termio/Exec.zig
@@ -1364,6 +1364,13 @@ pub const ReadThread = struct {
// Always close our end of the pipe when we exit.
defer posix.close(quit);
+ // Right now, on Darwin, `std.Thread.setName` can only name the current
+ // thread, and we have no way to get the current thread from within it,
+ // so instead we use this code to name the thread instead.
+ if (builtin.os.tag.isDarwin()) {
+ internal_os.macos.pthread_setname_np(&"io-reader".*);
+ }
+
// Setup our crash metadata
crash.sentry.thread_state = .{
.type = .io,
diff --git a/src/termio/Thread.zig b/src/termio/Thread.zig
index d8018341d..35da3c2d2 100644
--- a/src/termio/Thread.zig
+++ b/src/termio/Thread.zig
@@ -16,6 +16,7 @@ const ArenaAllocator = std.heap.ArenaAllocator;
const builtin = @import("builtin");
const xev = @import("../global.zig").xev;
const crash = @import("../crash/main.zig");
+const internal_os = @import("../os/main.zig");
const termio = @import("../termio.zig");
const renderer = @import("../renderer.zig");
const BlockingQueue = @import("../datastruct/main.zig").BlockingQueue;
@@ -202,6 +203,13 @@ pub fn threadMain(self: *Thread, io: *termio.Termio) void {
fn threadMain_(self: *Thread, io: *termio.Termio) !void {
defer log.debug("IO thread exited", .{});
+ // Right now, on Darwin, `std.Thread.setName` can only name the current
+ // thread, and we have no way to get the current thread from within it,
+ // so instead we use this code to name the thread instead.
+ if (builtin.os.tag.isDarwin()) {
+ internal_os.macos.pthread_setname_np(&"io".*);
+ }
+
// Setup our crash metadata
crash.sentry.thread_state = .{
.type = .io,