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 library itself.
Zig › std/ › heap/ › BrkAllocator.zig › alloc
alloc
BrkAllocator.alloc
fn alloc (ctx : *anyopaque , len : usize , alignment : Alignment , return_address : usize ) ?[*]u8
File
Code
fn alloc (ctx : *anyopaque , len : usize , alignment : Alignment , return_address : usize ) ?[*]u8 {
_ = ctx ;
_ = return_address ;
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 ;
// 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 ));
}