github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/qdb/membind.go (about) 1 package qdb 2 3 import ( 4 "os" 5 "unsafe" 6 "reflect" 7 "sync/atomic" 8 ) 9 10 var ( 11 membind_use_wrapper bool 12 _heap_alloc func(le uint32) data_ptr_t 13 _heap_free func(ptr data_ptr_t) 14 _heap_store func(v []byte) data_ptr_t 15 ) 16 17 18 type data_ptr_t unsafe.Pointer 19 20 func (v *oneIdx) FreeData() { 21 if v.data==nil { 22 return 23 } 24 if membind_use_wrapper { 25 _heap_free(v.data) 26 atomic.AddInt64(&ExtraMemoryConsumed, -int64(v.datlen)) 27 atomic.AddInt64(&ExtraMemoryAllocCnt, -1) 28 } 29 v.data = nil 30 } 31 32 func (v *oneIdx) Slice() (res []byte) { 33 if membind_use_wrapper { 34 res = *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{Data:uintptr(v.data), Len:int(v.datlen), Cap:int(v.datlen)})) 35 } else { 36 res = *(*[]byte)(v.data) 37 } 38 return 39 } 40 41 func newIdx(v []byte, f uint32) (r *oneIdx) { 42 r = new(oneIdx) 43 r.datlen = uint32(len(v)) 44 r.SetData(v) 45 r.flags = f 46 return 47 } 48 49 func (r *oneIdx) SetData(v []byte) { 50 if membind_use_wrapper { 51 r.data = _heap_store(v) 52 atomic.AddInt64(&ExtraMemoryConsumed, int64(r.datlen)) 53 atomic.AddInt64(&ExtraMemoryAllocCnt, 1) 54 } else { 55 r.data = data_ptr_t(&v) 56 } 57 } 58 59 func (v *oneIdx) LoadData(f *os.File) { 60 if membind_use_wrapper { 61 v.data = _heap_alloc(v.datlen) 62 atomic.AddInt64(&ExtraMemoryConsumed, int64(v.datlen)) 63 atomic.AddInt64(&ExtraMemoryAllocCnt, 1) 64 f.Seek(int64(v.datpos), os.SEEK_SET) 65 f.Read(*(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{Data:uintptr(v.data), Len:int(v.datlen), Cap:int(v.datlen)}))) 66 } else { 67 ptr := make([]byte, int(v.datlen)) 68 v.data = data_ptr_t(&ptr) 69 f.Seek(int64(v.datpos), os.SEEK_SET) 70 f.Read(ptr) 71 } 72 }