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  }