不太懂的API
persistentallocsysAlloc
mfixalloc.go
// 固定大小的对象分配器。 返回的内存未归零。//// See malloc.go for overview.package runtimeimport "unsafe"//FixAlloc是用于固定大小对象的简略自在列表分配器。//Malloc应用包裹在sysAlloc四周的FixAlloc来治理其MCache和MSpan对象。//FixAlloc_Alloc返回的内存未归零。//调用方负责锁定FixAlloc调用。//调用者能够将状态保留在对象中,但通过开释和重新分配能够粉碎第一个单词。type fixalloc struct { size uintptr first unsafe.Pointer // go func(unsafe.pointer, unsafe.pointer); f(arg, p) called first time p is returned, 对内存进行初始化 arg unsafe.Pointer list *mlink // 缓存开释数据 chunk *byte // 每次申请64K数据 nchunk uint32 // trunk残余数据大小 inuse uintptr // 应用中的数据 stat *uint64}type mlink struct { next *mlink}func fixAlloc_Init(f *fixalloc, size uintptr, first func(unsafe.Pointer, unsafe.Pointer), arg unsafe.Pointer, stat *uint64) { f.size = size f.first = *(*unsafe.Pointer)(unsafe.Pointer(&first)) f.arg = arg f.list = nil f.chunk = nil f.nchunk = 0 f.inuse = 0 f.stat = stat}func fixAlloc_Alloc(f *fixalloc) unsafe.Pointer { if f.size == 0 { print("runtime: use of FixAlloc_Alloc before FixAlloc_Initn") throw("runtime: internal error") } if f.list != nil { v := unsafe.Pointer(f.list) f.list = f.list.next f.inuse += f.size return v } if uintptr(f.nchunk) < f.size { f.chunk = (*uint8)(persistentalloc(_FixAllocChunk, 0, f.stat)) f.nchunk = _FixAllocChunk } v := (unsafe.Pointer)(f.chunk) if f.first != nil { fn := *(*func(unsafe.Pointer, unsafe.Pointer))(unsafe.Pointer(&f.first)) fn(f.arg, v) } f.chunk = (*byte)(add(unsafe.Pointer(f.chunk), f.size)) f.nchunk -= uint32(f.size) f.inuse += f.size return v}func fixAlloc_Free(f *fixalloc, p unsafe.Pointer) { f.inuse -= f.size v := (*mlink)(p) v.next = f.list f.list = v}