golang cgo pinner的使用
go 1.21添加了Pinner用于控制cgo中go内存的同步
- 注意: 只能用于控制go中的指针,不能控制c指针。pin时需要将c指针排除。
func (o *IEC61850) ControlCancelWithShortAddr(sAddr string, ptSelectValue *DataAttributeData, ptParam *ControlParameters) (err error) {
var pin runtime.Pinner
defer pin.Unpin()
cptSelectValue, malloc := gocDataAttributeData(ptSelectValue)
cptParam := gocControlParameters(ptParam)
if cptSelectValue.pvData != nil && !malloc {
pin.Pin(cptSelectValue.pvData)
}
if cptParam.operTm != nil {
pin.Pin(cptParam.operTm)
}
pAddr := C.CString(sAddr)
defer C.free(unsafe.Pointer(pAddr))
code := C.IEC61850_ControlCancelWithShortAddr(o.iec61850, pAddr, cptSelectValue, cptParam)
if ErrorCodes(code) != IEC61850_ERROR_NONE {
err = ErrorCodes(code).Error()
return
}
return
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com