diff options
author | 2022-01-24 19:12:58 -0800 | |
---|---|---|
committer | 2022-01-24 19:12:58 -0800 | |
commit | ecea12d2061f3508b9e5686d605ab7e6e6ac932e (patch) | |
tree | 27484c7d7ebc060ebee1365d0eac84836d0cb616 | |
parent | 61d1c7b6b2efadad4e6bb27ad72b2fb45d0f5e9a (diff) | |
download | bun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.tar.gz bun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.tar.zst bun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.zip |
No io_uring for Ubuntu 20.04
-rw-r--r-- | build.zig | 8 | ||||
-rw-r--r-- | src/analytics.zig | 1 | ||||
-rw-r--r-- | src/analytics/analytics_thread.zig | 22 | ||||
-rw-r--r-- | src/http_client_async.zig | 9 | ||||
-rw-r--r-- | src/install/install.zig | 12 | ||||
-rw-r--r-- | src/network_thread.zig | 25 |
6 files changed, 50 insertions, 27 deletions
@@ -94,6 +94,14 @@ fn addInternalPackages(step: *std.build.LibExeObjStep, _: std.mem.Allocator, tar .name = "javascript_core", .path = pkgPath("src/jsc.zig"), }; + + var analytics: std.build.Pkg = .{ + .name = "analytics", + .path = pkgPath("src/analytics.zig"), + }; + + io.dependencies = &.{analytics}; + javascript_core.dependencies = &.{ http, strings, picohttp, io }; http.dependencies = &.{ strings, diff --git a/src/analytics.zig b/src/analytics.zig new file mode 100644 index 000000000..68b2e08f5 --- /dev/null +++ b/src/analytics.zig @@ -0,0 +1 @@ +pub usingnamespace @import("./analytics/analytics_thread.zig"); diff --git a/src/analytics/analytics_thread.zig b/src/analytics/analytics_thread.zig index 6114e3890..43d7e2050 100644 --- a/src/analytics/analytics_thread.zig +++ b/src/analytics/analytics_thread.zig @@ -20,6 +20,7 @@ const Analytics = @import("./analytics_schema.zig").analytics; const Writer = @import("./analytics_schema.zig").Writer; const Headers = @import("http").Headers; const Futex = @import("../futex.zig"); +const Semver = @import("../install/semver.zig"); fn NewUint64(val: u64) Analytics.Uint64 { const bytes = std.mem.asBytes(&val); @@ -267,13 +268,30 @@ pub const GenerateHeader = struct { } pub var linux_os_name: std.c.utsname = undefined; + var platform_: ?Analytics.Platform = null; pub fn forOS() Analytics.Platform { + if (platform_ != null) return platform_.?; + if (comptime Environment.isMac) { - return forMac(); + platform_ = forMac(); + return platform_.?; } - return forLinux(); + platform_ = forLinux(); + return platform_.?; + } + + pub fn kernelVersion() Semver.Version { + if (comptime !Environment.isLinux) { + @compileError("This function is only implemented on Linux"); + } + _ = forOS(); + const release = std.mem.span(&linux_os_name.release); + var sliced_string = Semver.SlicedString.init(release, release); + var result = Semver.Version.parse(sliced_string, _global.default_allocator); + // we only care about major, minor, patch so we don't care about the string + return result.version; } pub fn forLinux() Analytics.Platform { diff --git a/src/http_client_async.zig b/src/http_client_async.zig index 21bc183be..069908322 100644 --- a/src/http_client_async.zig +++ b/src/http_client_async.zig @@ -32,6 +32,15 @@ pub var default_arena: Arena = undefined; pub fn onThreadStart() void { default_arena = Arena.init() catch unreachable; default_allocator = default_arena.allocator(); + NetworkThread.address_list_cached = NetworkThread.AddressListCache.init(default_allocator); + AsyncIO.global = AsyncIO.init(1024, 0) catch |err| { + Output.prettyErrorln("<r><red>error<r>: Failed to initialize network thread: <red><b>{s}<r>.\nHTTP requests will not work. Please file an issue and run strace().", .{@errorName(err)}); + Output.flush(); + os.exit(1); + }; + + AsyncIO.global_loaded = true; + NetworkThread.global.pool.io = &AsyncIO.global; } pub const Headers = struct { diff --git a/src/install/install.zig b/src/install/install.zig index 853a4813e..595d62135 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -4532,7 +4532,7 @@ pub const PackageManager = struct { const response = task.http.response orelse { if (comptime log_level != .silent) { - const fmt = "<r><red>rerror<r>: Failed to download package manifest <b>{s}<r>"; + const fmt = "\n<r><red>error<r>: Failed to download package manifest <b>{s}<r>"; const args = .{name.slice()}; if (comptime log_level.showProgress()) { Output.prettyWithPrinterFn(fmt, args, Progress.log, &manager.progress); @@ -4549,7 +4549,7 @@ pub const PackageManager = struct { if (response.status_code > 399) { if (comptime log_level != .silent) { - const fmt = "<r><red><b>GET<r><red> {s}<d> - {d}<r>\n"; + const fmt = "\n<r><red><b>GET<r><red> {s}<d> - {d}<r>\n"; const args = .{ task.http.client.url.href, response.status_code, @@ -4568,7 +4568,7 @@ pub const PackageManager = struct { if (comptime log_level.isVerbose()) { Output.prettyError(" ", .{}); Output.printElapsed(@floatCast(f64, @intToFloat(f128, task.http.elapsed) / std.time.ns_per_ms)); - Output.prettyError(" <d>Downloaded <r><green>{s}<r> versions\n", .{name.slice()}); + Output.prettyError("\n <d>Downloaded <r><green>{s}<r> versions\n", .{name.slice()}); Output.flush(); } @@ -4611,7 +4611,7 @@ pub const PackageManager = struct { }, .extract => |extract| { const response = task.http.response orelse { - const fmt = "Failed to download package tarball for package {s}\n"; + const fmt = "\nFailed to download package tarball for package {s}\n"; const args = .{extract.name.slice()}; if (comptime log_level != .silent) { @@ -4627,7 +4627,7 @@ pub const PackageManager = struct { if (response.status_code > 399) { if (comptime log_level != .silent) { - const fmt = "<r><red><b>GET<r><red> {s}<d> - {d}<r>\n"; + const fmt = "\n<r><red><b>GET<r><red> {s}<d> - {d}<r>\n"; const args = .{ task.http.client.url.href, response.status_code, @@ -4682,7 +4682,7 @@ pub const PackageManager = struct { .package_manifest => { if (task.status == .fail) { if (comptime log_level != .silent) { - const fmt = "<r><red>rerror<r>: Failed to parse package manifest for <b>{s}<r>"; + const fmt = "\n<r><red>rerror<r>: Failed to parse package manifest for <b>{s}<r>"; const args = .{task.request.package_manifest.name.slice()}; if (comptime log_level.showProgress()) { Output.prettyWithPrinterFn(fmt, args, Progress.log, &manager.progress); diff --git a/src/network_thread.zig b/src/network_thread.zig index 94eb13414..be5b84acb 100644 --- a/src/network_thread.zig +++ b/src/network_thread.zig @@ -37,14 +37,16 @@ const CachedAddressList = struct { } pub fn invalidate(this: *CachedAddressList) void { - this.invalidated = true; - this.address_list.deinit(); + if (!this.invalidated) { + this.invalidated = true; + this.address_list.deinit(); + } _ = address_list_cached.remove(this.key); } }; -const AddressListCache = std.HashMap(u64, CachedAddressList, IdentityContext(u64), 80); -var address_list_cached: AddressListCache = undefined; +pub const AddressListCache = std.HashMap(u64, CachedAddressList, IdentityContext(u64), 80); +pub var address_list_cached: AddressListCache = undefined; pub fn getAddressList(allocator: std.mem.Allocator, name: []const u8, port: u16) !*CachedAddressList { const hash = CachedAddressList.hash(name, port); const now = @intCast(u64, @maximum(0, std.time.milliTimestamp())); @@ -64,24 +66,9 @@ pub fn getAddressList(allocator: std.mem.Allocator, name: []const u8, port: u16) pub fn init() !void { if ((global_loaded.swap(1, .Monotonic)) == 1) return; - AsyncIO.global = AsyncIO.init(1024, 0) catch |err| { - Output.prettyErrorln("<r><red>error<r>: Failed to initialize network thread: <red><b>{s}<r>.\nHTTP requests will not work. Please file an issue and run strace().", .{@errorName(err)}); - Output.flush(); - - global = NetworkThread{ - .pool = ThreadPool.init(.{ .max_threads = 0, .stack_size = 64 * 1024 * 1024 }), - }; - global.pool.max_threads = 0; - AsyncIO.global_loaded = true; - return; - }; - - AsyncIO.global_loaded = true; global = NetworkThread{ .pool = ThreadPool.init(.{ .max_threads = 1, .stack_size = 64 * 1024 * 1024 }), }; global.pool.on_thread_spawn = HTTP.onThreadStart; - global.pool.io = &AsyncIO.global; - address_list_cached = AddressListCache.init(@import("./global.zig").default_allocator); } |