Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › heap › BrkAllocator › alloc Private Function alloc Doc Source Private Function std.heap.BrkAllocator.alloc
fn alloc (ctx : *anyopaque , len : usize , alignment : Alignment , return_address : usize ) ?[*]u8 Params ctx : *anyopaque len : usize alignment : Alignment return_address : usize File heap/BrkAllocator.zig: 50
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 fn alloc (ctx : *anyopaque , len : usize , alignment : Alignment , return_address : usize ) ?[*]u8 {
_ = ctx ;
_ = return_address ;
// Make room for the freelist next pointer.
const actual_len = @max (len +| @sizeOf (usize ), alignment .toByteUnits ());
const slot_size = math .ceilPowerOfTwo (usize , actual_len ) catch return null ;
const class = math .log2 (slot_size ) - min_class ;
if (class < size_class_count ) {
const addr = a : {
const top_free_ptr = global .frees [class ];
if (top_free_ptr != 0 ) {
const node : *usize = @ptrFromInt (top_free_ptr + (slot_size - @sizeOf (usize )));
global .frees [class ] = node .*;
break :a top_free_ptr ;
}
const next_addr = global .next_addrs [class ];
if (next_addr % bigpage_size == 0 ) {
const addr = allocBigPages (1 );
if (addr == 0 ) return null ;
//std.debug.print("allocated fresh slot_size={d} class={d} addr=0x{x}\n", .{
// slot_size, class, addr,
//});
global .next_addrs [class ] = addr + slot_size ;
break :a addr ;
} else {
global .next_addrs [class ] = next_addr + slot_size ;
break :a next_addr ;
}
};
return @ptrFromInt (addr );
}
const bigpages_needed = bigPagesNeeded (actual_len );
return @ptrFromInt (allocBigPages (bigpages_needed ));
}