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 }