aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-01-24 19:12:58 -0800
committerGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-01-24 19:12:58 -0800
commitecea12d2061f3508b9e5686d605ab7e6e6ac932e (patch)
tree27484c7d7ebc060ebee1365d0eac84836d0cb616
parent61d1c7b6b2efadad4e6bb27ad72b2fb45d0f5e9a (diff)
downloadbun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.tar.gz
bun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.tar.zst
bun-ecea12d2061f3508b9e5686d605ab7e6e6ac932e.zip
No io_uring for Ubuntu 20.04
-rw-r--r--build.zig8
-rw-r--r--src/analytics.zig1
-rw-r--r--src/analytics/analytics_thread.zig22
-rw-r--r--src/http_client_async.zig9
-rw-r--r--src/install/install.zig12
-rw-r--r--src/network_thread.zig25
6 files changed, 50 insertions, 27 deletions
diff --git a/build.zig b/build.zig
index 3aabb02bd..f58a1b4a8 100644
--- a/build.zig
+++ b/build.zig
@@ -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);
}