Skip to content

Instantly share code, notes, and snippets.

@phuctm97
Created October 25, 2019 11:51
Show Gist options
  • Save phuctm97/87253e856965b5e63f61e88477035f9b to your computer and use it in GitHub Desktop.
Save phuctm97/87253e856965b5e63f61e88477035f9b to your computer and use it in GitHub Desktop.
CGO Memory Map
package main
/*
#include <stdlib.h>
typedef int cgo_ptr;
*/
import "C"
import "sync"
//export cgo_free
func cgo_free(p C.cgo_ptr) {
cgoFree(ptr(p))
}
type ptr int
var cgoRegs = make(map[ptr]interface{})
var cgoRegMut = sync.RWMutex{}
var cgoNPtrs ptr = 0
func cgoNew(p interface{}) ptr {
cgoRegMut.Lock()
defer cgoRegMut.Unlock()
cgoNPtrs++
cgoRegs[cgoNPtrs] = p
return cgoNPtrs
}
func cgoVal(p ptr) interface{} {
cgoRegMut.RLock()
defer cgoRegMut.RUnlock()
return cgoRegs[p]
}
func cgoFree(p ptr) {
cgoRegMut.Lock()
defer cgoRegMut.Unlock()
delete(cgoRegs, p)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment