aboutsummaryrefslogtreecommitdiff
path: root/src/deps
diff options
context:
space:
mode:
Diffstat (limited to 'src/deps')
-rw-r--r--src/deps/PLCrashReport.bindings.h10
-rw-r--r--src/deps/PLCrashReport.m74
-rw-r--r--src/deps/PLCrashReport.zig42
-rw-r--r--src/deps/backtrace.zig159
m---------src/deps/libbacktrace0
m---------src/deps/mimalloc0
6 files changed, 159 insertions, 126 deletions
diff --git a/src/deps/PLCrashReport.bindings.h b/src/deps/PLCrashReport.bindings.h
deleted file mode 100644
index 2fbfc9bac..000000000
--- a/src/deps/PLCrashReport.bindings.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdbool.h>
-#include <stdint.h>
-
-extern bool PLCrashReportStart(const char *version, const char *basePath);
-extern void PLCrashReportHandler(void *context);
-
-extern void PLCrashReportGenerate();
-extern void *PLCrashReportLoadPending();
-
-extern uint16_t copyCrashReportPath(char *buf[1024]);
diff --git a/src/deps/PLCrashReport.m b/src/deps/PLCrashReport.m
deleted file mode 100644
index ecd099424..000000000
--- a/src/deps/PLCrashReport.m
+++ /dev/null
@@ -1,74 +0,0 @@
-#include "PLCrashReport.bindings.h"
-
-#include <PLCrashReporter/PLCrashReporter.h>
-
-NSString *crash_folder;
-
-@interface PLCrashReporter (PrivateMethods)
-
-- (id)initWithApplicationIdentifier:(NSString *)applicationIdentifier
- appVersion:(NSString *)applicationVersion
- appMarketingVersion:(NSString *)applicationMarketingVersion
- configuration:(PLCrashReporterConfig *)configuration;
-
-@end
-
-void pl_crash_reporter_post_crash_callback(siginfo_t *info, ucontext_t *uap,
- void *context) {
- PLCrashReportHandler(context);
-}
-
-static PLCrashReporter *reporter;
-
-NSString *v;
-NSString *basePath_;
-static void *handler;
-bool PLCrashReportStart(const char *version, const char *basePath) {
- PLCrashReporterConfig *config;
- basePath_ = [NSString stringWithUTF8String:basePath];
-
- handler = &pl_crash_reporter_post_crash_callback;
- PLCrashReporterCallbacks callbacks = {
- .version = 0, .context = NULL, .handleSignal = handler};
- config = [[PLCrashReporterConfig alloc]
- initWithSignalHandlerType:PLCrashReporterSignalHandlerTypeBSD
- symbolicationStrategy:
- PLCrashReporterSymbolicationStrategyNone
- shouldRegisterUncaughtExceptionHandler:YES
- basePath:basePath_];
-
- v = [[NSString alloc] initWithBytesNoCopy:version
- length:strlen(version)
- encoding:NSUTF8StringEncoding
- freeWhenDone:NO];
- reporter = [[PLCrashReporter alloc] initWithApplicationIdentifier:@"bun"
- appVersion:v
- appMarketingVersion:v
- configuration:config];
-
- [reporter setValue:basePath_ forKey:@"_crashReportDirectory"];
- [reporter setCrashCallbacks:&callbacks];
-
- return [reporter enableCrashReporter];
-}
-
-void PLCrashReportGenerate() { [reporter generateLiveReport]; }
-void *PLCrashReportLoadPending() {
- return [reporter loadPendingCrashReportData];
-}
-
-uint16_t copyCrashReportPath(char *buf[1024]) {
- NSString *crashReportPath = [reporter crashReportPath];
- [crashReportPath getBytes:buf
- maxLength:(1024 - 1)
- usedLength:NULL
- encoding:NSUTF8StringEncoding
- options:0
- range:NSMakeRange(0, [crashReportPath length])
- remainingRange:NULL];
- size_t len = [crashReportPath length];
- if (len > 1024) {
- len = 0;
- }
- return (uint16_t)len;
-}
diff --git a/src/deps/PLCrashReport.zig b/src/deps/PLCrashReport.zig
deleted file mode 100644
index 9625cf441..000000000
--- a/src/deps/PLCrashReport.zig
+++ /dev/null
@@ -1,42 +0,0 @@
-const root = @import("root");
-const std = @import("std");
-
-extern fn PLCrashReportStart(version: [*:0]const u8, base_path: [*:0]const u8) bool;
-extern fn PLCrashReportGenerate() void;
-extern fn PLCrashReportLoadPending() ?*anyopaque;
-extern fn copyCrashReportPath(buf: *[1024]u8) u16;
-
-pub export fn PLCrashReportHandler(_: ?*anyopaque) void {
- root.PLCrashReportHandler();
-}
-
-pub fn start(
- comptime version: [*:0]const u8,
-) bool {
- has_started = true;
- var base_path_buf: [1024]u8 = undefined;
- var base_path: [:0]const u8 = "";
- const crash_path = "/crash/" ++ version ++ "/";
- if (std.os.getenvZ("BUN_INSTALL")) |bun_install| {
- @memcpy(&base_path_buf, bun_install.ptr, bun_install.len);
- std.mem.copy(u8, base_path_buf[bun_install.len..], crash_path);
- base_path_buf[bun_install.len + crash_path.len] = 0;
- base_path = base_path_buf[0 .. bun_install.len + crash_path.len :0];
- } else {
- base_path = "/tmp/bun" ++ crash_path;
- base_path_buf["/tmp/bun".len + crash_path.len] = 0;
- }
- return PLCrashReportStart(version, base_path.ptr);
-}
-
-pub fn generate() void {
- return PLCrashReportGenerate();
-}
-var has_started = false;
-
-pub fn crashReportPath(buf: *[1024]u8) []const u8 {
- if (!has_started) return "";
-
- const len = copyCrashReportPath(buf);
- return buf[0..len];
-}
diff --git a/src/deps/backtrace.zig b/src/deps/backtrace.zig
new file mode 100644
index 000000000..8448642de
--- /dev/null
+++ b/src/deps/backtrace.zig
@@ -0,0 +1,159 @@
+pub const backtrace_state = struct_backtrace_state;
+pub const struct_backtrace_state = opaque {};
+pub const backtrace_error_callback = ?fn (
+ ?*anyopaque,
+ [*c]const u8,
+ c_int,
+) callconv(.C) void;
+pub extern fn backtrace_create_state(
+ filename: [*c]const u8,
+ threaded: c_int,
+ error_callback: backtrace_error_callback,
+ data: ?*anyopaque,
+) ?*struct_backtrace_state;
+pub const backtrace_full_callback = ?fn (
+ ?*anyopaque,
+ usize,
+ [*c]const u8,
+ c_int,
+ [*c]const u8,
+) callconv(.C) c_int;
+pub extern fn backtrace_full(
+ state: ?*struct_backtrace_state,
+ skip: c_int,
+ callback: backtrace_full_callback,
+ error_callback: backtrace_error_callback,
+ data: ?*anyopaque,
+) c_int;
+pub const backtrace_simple_callback = ?fn (?*anyopaque, usize) callconv(.C) c_int;
+pub extern fn backtrace_simple(
+ state: ?*struct_backtrace_state,
+ skip: c_int,
+ callback: backtrace_simple_callback,
+ error_callback: backtrace_error_callback,
+ data: ?*anyopaque,
+) c_int;
+pub extern fn backtrace_print(state: ?*struct_backtrace_state, skip: c_int, [*c]anyopaque) void;
+pub extern fn backtrace_pcinfo(
+ state: ?*struct_backtrace_state,
+ pc: usize,
+ callback: backtrace_full_callback,
+ error_callback: backtrace_error_callback,
+ data: ?*anyopaque,
+) c_int;
+pub const backtrace_syminfo_callback = ?fn (?*anyopaque, usize, [*c]const u8, usize, usize) callconv(.C) void;
+pub extern fn backtrace_syminfo(
+ state: ?*struct_backtrace_state,
+ addr: usize,
+ callback: backtrace_syminfo_callback,
+ error_callback: backtrace_error_callback,
+ data: ?*anyopaque,
+) c_int;
+
+pub const BACKTRACE_SUPPORTED = @as(c_int, 1);
+pub const BACKTRACE_USES_MALLOC = @as(c_int, 0);
+pub const BACKTRACE_SUPPORTS_THREADS = @as(c_int, 1);
+pub const BACKTRACE_SUPPORTS_DATA = @as(c_int, 1);
+
+fn error_callback(data: *anyopaque, msg: [*c]u8, errnum: c_int) callconv(.C) void {
+ _ = data;
+ _ = msg;
+ _ = errnum;
+}
+
+pub const StackFrame = struct {
+ pc: usize,
+ filename: []const u8,
+ function_name: []const u8,
+ line_number: c_int,
+};
+
+pub const PrintCallback = fn (ctx: ?*anyopaque, frame: StackFrame) void;
+
+var callback: PrintCallback = undefined;
+var callback_ctx: ?*anyopaque = null;
+
+const std = @import("std");
+
+noinline fn full_callback(_: ?*anyopaque, pc: usize, filename: [*c]const u8, line_number: c_int, function_name: [*c]const u8) callconv(.C) c_int {
+ var stack_frame = StackFrame{
+ .pc = pc,
+ .line_number = line_number,
+ .function_name = if (function_name) |fn_| std.mem.span(fn_) else "",
+ .filename = if (filename) |fn_| std.mem.span(fn_) else "",
+ };
+ callback(callback_ctx, stack_frame);
+ return 0;
+}
+
+var state: ?*backtrace_state = null;
+pub inline fn print() void {
+ state = backtrace_create_state(null, BACKTRACE_SUPPORTS_THREADS, null, null);
+ _ = backtrace_full(state, 2, full_callback, null, null);
+}
+
+const builtin = @import("builtin");
+const ErrorCallback = fn (sig: i32, addr: usize) void;
+var on_error: ?ErrorCallback = null;
+noinline fn sigaction_handler(sig: i32, info: *const std.os.siginfo_t, _: ?*const anyopaque) callconv(.C) void {
+ // Prevent recursive calls
+ os.sigaction(os.SIG.ABRT, null, null);
+ os.sigaction(os.SIG.BUS, null, null);
+ os.sigaction(os.SIG.FPE, null, null);
+ os.sigaction(os.SIG.ILL, null, null);
+ os.sigaction(os.SIG.SEGV, null, null);
+ os.sigaction(os.SIG.TRAP, null, null);
+
+ const addr = switch (comptime builtin.target.os.tag) {
+ .linux => @ptrToInt(info.fields.sigfault.addr),
+ .macos, .freebsd => @ptrToInt(info.addr),
+ .netbsd => @ptrToInt(info.info.reason.fault.addr),
+ .openbsd => @ptrToInt(info.data.fault.addr),
+ .solaris => @ptrToInt(info.reason.fault.addr),
+ else => unreachable,
+ };
+ if (on_error) |handle| handle(sig, addr);
+}
+
+pub fn reloadHandlers() void {
+ os.sigaction(os.SIG.ABRT, null, null);
+ os.sigaction(os.SIG.BUS, null, null);
+ os.sigaction(os.SIG.FPE, null, null);
+ os.sigaction(os.SIG.ILL, null, null);
+ os.sigaction(os.SIG.SEGV, null, null);
+ os.sigaction(os.SIG.TRAP, null, null);
+
+ var act = os.Sigaction{
+ .handler = .{ .sigaction = sigaction_handler },
+ .mask = os.empty_sigset,
+ .flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND),
+ };
+
+ os.sigaction(os.SIG.ABRT, &act, null);
+ os.sigaction(os.SIG.BUS, &act, null);
+ os.sigaction(os.SIG.FPE, &act, null);
+ os.sigaction(os.SIG.ILL, &act, null);
+ os.sigaction(os.SIG.SEGV, &act, null);
+ os.sigaction(os.SIG.TRAP, &act, null);
+}
+const os = std.os;
+pub fn start(ctx: ?*anyopaque, callback_: PrintCallback, onError: ErrorCallback) bool {
+ callback_ctx = ctx;
+ callback = callback_;
+ on_error = onError;
+
+ var act = os.Sigaction{
+ .handler = .{ .sigaction = sigaction_handler },
+ .mask = os.empty_sigset,
+ .flags = (os.SA.SIGINFO | os.SA.RESTART | os.SA.RESETHAND),
+ };
+
+ os.sigaction(os.SIG.ABRT, &act, null);
+ os.sigaction(os.SIG.BUS, &act, null);
+ os.sigaction(os.SIG.FPE, &act, null);
+ os.sigaction(os.SIG.ILL, &act, null);
+ os.sigaction(os.SIG.SEGV, &act, null);
+ os.sigaction(os.SIG.TRAP, &act, null);
+
+ return true;
+}
diff --git a/src/deps/libbacktrace b/src/deps/libbacktrace
new file mode 160000
+Subproject d0f5e95a87a4d3e0a1ed6c069b5dae7cbab3ed2
diff --git a/src/deps/mimalloc b/src/deps/mimalloc
-Subproject f412df7a2b64421e1f1d61fde6055a6ea288e8f
+Subproject d2e727f0e871cd35305bdb7bc3983cf60744175