Files
bun.sh/src/heap_breakdown.zig
Jarred Sumner 492b2d5b76 Implement Brotli support in fetch() (#7839)
* Implement Brotli support in fetch()

* Use @panic

* Update src/http.zig

Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>

* Update src/http.zig

Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>

* Fix redirect logic

* Allow extremely long redirect URLs

* Update fetch.test.ts

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>
2023-12-31 06:19:08 -08:00

113 lines
4.5 KiB
Zig

const bun = @import("root").bun;
const std = @import("std");
const HeapBreakdown = @This();
pub fn allocator(comptime T: type) std.mem.Allocator {
return malloc_zone_t.get(T).getAllocator();
}
pub const malloc_zone_t = opaque {
const Allocator = std.mem.Allocator;
const vm_size_t = usize;
pub extern fn malloc_default_zone() *malloc_zone_t;
pub extern fn malloc_create_zone(start_size: vm_size_t, flags: c_uint) *malloc_zone_t;
pub extern fn malloc_destroy_zone(zone: *malloc_zone_t) void;
pub extern fn malloc_zone_malloc(zone: *malloc_zone_t, size: usize) ?*anyopaque;
pub extern fn malloc_zone_calloc(zone: *malloc_zone_t, num_items: usize, size: usize) ?*anyopaque;
pub extern fn malloc_zone_valloc(zone: *malloc_zone_t, size: usize) ?*anyopaque;
pub extern fn malloc_zone_free(zone: *malloc_zone_t, ptr: ?*anyopaque) void;
pub extern fn malloc_zone_realloc(zone: *malloc_zone_t, ptr: ?*anyopaque, size: usize) ?*anyopaque;
pub extern fn malloc_zone_from_ptr(ptr: ?*const anyopaque) *malloc_zone_t;
pub extern fn malloc_zone_memalign(zone: *malloc_zone_t, alignment: usize, size: usize) ?*anyopaque;
pub extern fn malloc_zone_batch_malloc(zone: *malloc_zone_t, size: usize, results: [*]?*anyopaque, num_requested: c_uint) c_uint;
pub extern fn malloc_zone_batch_free(zone: *malloc_zone_t, to_be_freed: [*]?*anyopaque, num: c_uint) void;
pub extern fn malloc_default_purgeable_zone() *malloc_zone_t;
pub extern fn malloc_make_purgeable(ptr: ?*anyopaque) void;
pub extern fn malloc_make_nonpurgeable(ptr: ?*anyopaque) c_int;
pub extern fn malloc_zone_register(zone: *malloc_zone_t) void;
pub extern fn malloc_zone_unregister(zone: *malloc_zone_t) void;
pub extern fn malloc_set_zone_name(zone: *malloc_zone_t, name: ?[*:0]const u8) void;
pub extern fn malloc_get_zone_name(zone: *malloc_zone_t) ?[*:0]const u8;
pub extern fn malloc_zone_pressure_relief(zone: *malloc_zone_t, goal: usize) usize;
pub fn get(comptime T: type) *malloc_zone_t {
const Holder = struct {
pub var zone_t: std.atomic.Value(?*malloc_zone_t) = std.atomic.Value(?*malloc_zone_t).init(null);
pub var zone_t_lock: bun.Lock = bun.Lock.init();
};
return Holder.zone_t.load(.Monotonic) orelse brk: {
Holder.zone_t_lock.lock();
defer Holder.zone_t_lock.unlock();
if (Holder.zone_t.load(.Monotonic)) |z| {
break :brk z;
}
const z = malloc_zone_t.create(T);
Holder.zone_t.store(z, .Monotonic);
break :brk z;
};
}
fn alignedAlloc(zone: *malloc_zone_t, len: usize, alignment: usize) ?[*]u8 {
// The posix_memalign only accepts alignment values that are a
// multiple of the pointer size
const eff_alignment = @max(alignment, @sizeOf(usize));
const ptr = malloc_zone_memalign(zone, eff_alignment, len);
return @as(?[*]u8, @ptrCast(ptr));
}
fn alignedAllocSize(ptr: [*]u8) usize {
return std.c.malloc_size(ptr);
}
fn alloc(ptr: *anyopaque, len: usize, log2_align: u8, _: usize) ?[*]u8 {
const alignment = @as(usize, 1) << @as(Allocator.Log2Align, @intCast(log2_align));
return alignedAlloc(@ptrCast(ptr), len, alignment);
}
fn resize(_: *anyopaque, buf: []u8, _: u8, new_len: usize, _: usize) bool {
if (new_len <= buf.len) {
return true;
}
const full_len = alignedAllocSize(buf.ptr);
if (new_len <= full_len) {
return true;
}
return false;
}
fn free(ptr: *anyopaque, buf: [*]u8, _: u8, _: usize) void {
malloc_zone_free(@ptrCast(ptr), @ptrCast(buf));
}
pub const VTable = std.mem.Allocator.VTable{
.alloc = @ptrCast(&alloc),
.resize = @ptrCast(&resize),
.free = @ptrCast(&free),
};
pub fn create(comptime T: type) *malloc_zone_t {
const zone = malloc_create_zone(0, 0);
const title = struct {
const base_name = if (@hasDecl(T, "heap_label")) T.heap_label else bun.meta.typeBaseName(@typeName(T));
pub const title_: []const u8 = "Bun__" ++ base_name ++ .{0};
pub const title: [:0]const u8 = title_[0 .. title_.len - 1 :0];
}.title;
malloc_set_zone_name(zone, title.ptr);
return zone;
}
pub fn getAllocator(zone: *malloc_zone_t) std.mem.Allocator {
return Allocator{
.vtable = &VTable,
.ptr = zone,
};
}
};