code.icb4dc0.de/buildr/wasi-module-sdk-go@v0.0.0-20230524201105-cc52d195017b/mem/unmanaged.go (about)

     1  package mem
     2  
     3  import (
     4  	"sync"
     5  	"unsafe"
     6  )
     7  
     8  var (
     9  	alivePointers = map[uintptr][]byte{}
    10  	pointersLock  sync.Mutex
    11  )
    12  
    13  func DataToManagedPtr(data []byte) (ptr uint32, size uint32) {
    14  	uptr := unsafe.Pointer(unsafe.SliceData(data))
    15  	return uint32(uintptr(uptr)), uint32(len(data))
    16  }
    17  
    18  func DataToUnmanagedPtr(data []byte) (uint32, uint32) {
    19  	pointersLock.Lock()
    20  	defer pointersLock.Unlock()
    21  
    22  	buf := make([]byte, len(data))
    23  	copy(buf, data)
    24  	ptr := &buf[0]
    25  	unsafePtr := uintptr(unsafe.Pointer(ptr))
    26  	alivePointers[unsafePtr] = buf
    27  
    28  	return uint32(unsafePtr), uint32(len(data))
    29  }
    30  
    31  func DataFromPtr(ptr, size uint32) []byte {
    32  	p := unsafe.Pointer(uintptr(ptr))
    33  	return unsafe.Slice((*byte)(p), int(size))
    34  }
    35  
    36  func PtrToData(ptr uint32, size uint32) []byte {
    37  	return unsafe.Slice((*byte)(unsafe.Pointer(uintptr(ptr))), size)
    38  }
    39  
    40  func UnifyPtrSize(ptr, size uint32) uint64 {
    41  	return (uint64(ptr) << uint64(32)) | uint64(size)
    42  }
    43  
    44  func UnifiedPtrToSizePtr(uint64ptr uint64) (ptr uint32, size uint32) {
    45  	return uint32(uint64ptr >> 32), uint32(uint64ptr)
    46  }
    47  
    48  //export allocate
    49  func Allocate(size uint32) uintptr {
    50  	pointersLock.Lock()
    51  	defer pointersLock.Unlock()
    52  
    53  	buf := make([]byte, size)
    54  
    55  	unsafePtr := uintptr(unsafe.Pointer(unsafe.SliceData(buf)))
    56  	alivePointers[unsafePtr] = buf
    57  	return unsafePtr
    58  }
    59  
    60  //export deallocate
    61  func Deallocate(ptr uintptr) {
    62  	pointersLock.Lock()
    63  	defer pointersLock.Unlock()
    64  	delete(alivePointers, ptr)
    65  }