* Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
* ubs-engine is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package mem
#cgo CFLAGS: -I/usr/include/ubse -I${SRCDIR}/../../c/include
#include <stdlib.h>
#include <netinet/in.h>
#include "ubs_engine_mem.h"
// 定义函数指针类型
typedef int32_t (*ubs_mem_numa_list_func)(ubs_mem_numa_desc_t**, uint32_t*);
typedef int32_t (*ubs_mem_shm_create_func)(const char*, uint64_t, uint8_t*, uint64_t, const ubs_mem_nodes_t*, const ubs_mem_nodes_t*);
typedef int32_t (*ubs_mem_shm_create_with_affinity_func)(const char*, uint64_t, uint32_t, uint8_t*, uint64_t, const ubs_mem_nodes_t*, const ubs_mem_nodes_t*);
typedef int32_t (*ubs_mem_shm_attach_func)(const char*, const ubs_mem_fd_owner_t*, mode_t, ubs_mem_shm_desc_t**);
typedef int32_t (*ubs_mem_shm_get_func)(const char*, ubs_mem_shm_desc_t**);
typedef int32_t (*ubs_mem_shm_list_func)(ubs_mem_shm_desc_t**, uint32_t*);
typedef int32_t (*ubs_mem_shm_list_with_prefix_func)(const char*, ubs_mem_shm_desc_t**, uint32_t*);
typedef int32_t (*ubs_mem_shm_detach_func)(const char*);
typedef int32_t (*ubs_mem_shm_delete_func)(const char*);
typedef int32_t (*ubs_mem_shm_fault_handler)(const char *name, uint64_t memid, ubs_mem_fault_type_t type);
typedef int32_t (*ubs_mem_shm_fault_get_func)(const char*, ubs_mem_memids_fault_t*);
typedef int32_t (*ubs_mem_shm_fault_register_func)(ubs_mem_shm_fault_handler);
// C桥接函数
static int call_ubs_mem_numa_list(ubs_mem_numa_list_func fn, ubs_mem_numa_desc_t** descs, uint32_t* count) {
if (fn == NULL) return -1;
return fn(descs, count);
}
static int call_ubs_mem_shm_create(ubs_mem_shm_create_func fn, const char* name, uint64_t size, uint8_t* usr_info, uint64_t flag, const ubs_mem_nodes_t* region, const ubs_mem_nodes_t* provider) {
if (fn == NULL) return -1;
return fn(name, size, usr_info, flag, region, provider);
}
static int call_ubs_mem_shm_create_with_affinity(ubs_mem_shm_create_with_affinity_func fn, const char* name, uint64_t size, uint32_t affinity_socket_id, uint8_t* usr_info, uint64_t flag, const ubs_mem_nodes_t* region, const ubs_mem_nodes_t* provider) {
if (fn == NULL) return -1;
return fn(name, size, affinity_socket_id, usr_info, flag, region, provider);
}
static int call_ubs_mem_shm_attach(ubs_mem_shm_attach_func fn, const char* name, const ubs_mem_fd_owner_t* owner, mode_t mode, ubs_mem_shm_desc_t** desc) {
if (fn == NULL) return -1;
return fn(name, owner, mode, desc);
}
static int call_ubs_mem_shm_get(ubs_mem_shm_get_func fn, const char* name, ubs_mem_shm_desc_t** desc) {
if (fn == NULL) return -1;
return fn(name, desc);
}
static int call_ubs_mem_shm_list(ubs_mem_shm_list_func fn, ubs_mem_shm_desc_t** descs, uint32_t* count) {
if (fn == NULL) return -1;
return fn(descs, count);
}
static int call_ubs_mem_shm_list_with_prefix(ubs_mem_shm_list_with_prefix_func fn, const char* name_prefix, ubs_mem_shm_desc_t** descs, uint32_t* count) {
if (fn == NULL) return -1;
return fn(name_prefix, descs, count);
}
static int call_ubs_mem_shm_detach(ubs_mem_shm_detach_func fn, const char* name) {
if (fn == NULL) return -1;
return fn(name);
}
static int call_ubs_mem_shm_delete(ubs_mem_shm_delete_func fn, const char* name) {
if (fn == NULL) return -1;
return fn(name);
}
static int call_ubs_mem_shm_fault_get(ubs_mem_shm_fault_get_func fn, const char* name, ubs_mem_memids_fault_t* fault) {
if (fn == NULL) return -1;
return fn(name, fault);
}
static int call_ubs_mem_shm_fault_register(ubs_mem_shm_fault_register_func fn, ubs_mem_shm_fault_handler handler) {
if (fn == NULL) return -1;
return fn(handler);
}
extern int32_t goShmFaultHandler(char *name, uint64_t memid, ubs_mem_fault_type_t faultType);
*/
import "C"
import (
"fmt"
"net"
"unsafe"
"atomgit.com/openeuler/ubs-engine.git/src/sdk/go/dlopen"
"atomgit.com/openeuler/ubs-engine.git/src/sdk/go/topo"
)
const (
UbseMaxUsrInfoLength = 32
UbsMemMaxSlotNum = 16
UbsMemMaxDescList = 2000
UbsMemMaxMemidNum = 2048
)
type UbsMemStage int
const (
UbseNotExist UbsMemStage = iota
UbseCreating
UbseDeleting
UbseExist
UbseErrOnlyImport
UbseErrWaitUnexport
UbseErrAbnormal
UbseEnd
)
type UbsMemFaultType int
const (
UbMemAtomicDataErr UbsMemFaultType = iota
UbMemReadDataErr
UbMemFlowPoison
UbMemFlowReadAuthPoison
UbMemFlowReadAuthRespErr
UbMemTimeoutPoison
UbMemTimeoutRespErr
UbMemReadDataPoison
UbMemReadDataRespErr
MarNoPortVldIntErr
MarFluxIntErr
MarWithoutCxtErr
RspBkpreOverTimeoutErr
MarNearAuthFailErr
MarFarAuthFailErr
MarTimeoutErr
MarIllegalAccessErr
RemoteReadDataErrOrWriteResponseErr
UbMemHealthy = 1000
)
type UbsMemNodes struct {
NodeCnt uint32
SlotIds [UbsMemMaxSlotNum]uint32
}
type UbsMemFdOwner struct {
Uid uint32
Gid uint32
Pid uint32
}
type UbsMemNumaDesc struct {
Name string
NumaId int64
ExportNode topo.UbsTopoNode
ImportNode topo.UbsTopoNode
Size uint64
UsrInfo []byte
}
type UbsMemShmImportDesc struct {
MemidCnt uint32
Memids []uint64
ImportNode topo.UbsTopoNode
MemStage UbsMemStage
}
type UbsMemShmDesc struct {
Name string
MemSize uint64
UnitSize uint64
ExportNode topo.UbsTopoNode
UsrInfo []byte
ImportDescCnt uint32
MemStage UbsMemStage
ImportDesc []UbsMemShmImportDesc
}
type UbsMemMemidsFault struct {
MemidCnt uint32
Memids []uint64
MemidStatus []UbsMemFaultType
}
func UbsMemNumaList() ([]UbsMemNumaDesc, error) {
numaListPtr, err := dlopen.LoadFunc("ubs_mem_numa_list")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_numa_list: %v", err)
}
numaListFunc := (C.ubs_mem_numa_list_func)(numaListPtr)
var cDescs *C.ubs_mem_numa_desc_t
var cCount C.uint32_t
ret := C.call_ubs_mem_numa_list(numaListFunc, &cDescs, &cCount)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_numa_list failed, error code=%d", ret)
}
defer C.free(unsafe.Pointer(cDescs))
count := int(cCount)
if count <= 0 || count > topo.MaxCount {
return []UbsMemNumaDesc{}, nil
}
descs := make([]UbsMemNumaDesc, 0, count)
size := unsafe.Sizeof(C.ubs_mem_numa_desc_t{})
for i := 0; i < count; i++ {
cDesc := (*C.ubs_mem_numa_desc_t)(unsafe.Pointer(uintptr(unsafe.Pointer(cDescs)) + uintptr(i)*size))
goDesc := UbsMemNumaDesc{
Name: C.GoString(&cDesc.name[0]),
NumaId: int64(cDesc.numaid),
Size: uint64(cDesc.size),
}
goDesc.UsrInfo = make([]byte, UbseMaxUsrInfoLength)
copy(goDesc.UsrInfo, C.GoBytes(unsafe.Pointer(&cDesc.usrInfo[0]), C.int(UbseMaxUsrInfoLength)))
goDesc.ExportNode = convertTopoNode(&cDesc.export_node)
goDesc.ImportNode = convertTopoNode(&cDesc.import_node)
descs = append(descs, goDesc)
}
return descs, nil
}
func UbsMemShmCreate(name string, size uint64, usrInfo [32]byte, flag uint64, region *UbsMemNodes, provider *UbsMemNodes) error {
shmCreatePtr, err := dlopen.LoadFunc("ubs_mem_shm_create")
if err != nil {
return fmt.Errorf("failed to load ubs_mem_shm_create: %v", err)
}
shmCreateFunc := (C.ubs_mem_shm_create_func)(shmCreatePtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
var cUsrInfo *C.uint8_t
cUsrInfo = (*C.uint8_t)(unsafe.Pointer(&usrInfo[0]))
cRegion := convertMemNodes(region)
defer freeMemNodes(cRegion)
cProvider := convertMemNodes(provider)
defer freeMemNodes(cProvider)
ret := C.call_ubs_mem_shm_create(shmCreateFunc, cName, C.uint64_t(size), cUsrInfo, C.uint64_t(flag), cRegion, cProvider)
if ret != 0 {
return fmt.Errorf("ubs_mem_shm_create failed, error code=%d", ret)
}
return nil
}
func UbsMemShmCreateWithAffinity(name string, size uint64, affinitySocketID uint32, usrInfo [32]byte, flag uint64, region *UbsMemNodes, provider *UbsMemNodes) error {
shmCreateAffPtr, err := dlopen.LoadFunc("ubs_mem_shm_create_with_affinity")
if err != nil {
return fmt.Errorf("failed to load ubs_mem_shm_create_with_affinity: %v", err)
}
shmCreateAffFunc := (C.ubs_mem_shm_create_with_affinity_func)(shmCreateAffPtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
var cUsrInfo *C.uint8_t
cUsrInfo = (*C.uint8_t)(unsafe.Pointer(&usrInfo[0]))
cRegion := convertMemNodes(region)
defer freeMemNodes(cRegion)
cProvider := convertMemNodes(provider)
defer freeMemNodes(cProvider)
ret := C.call_ubs_mem_shm_create_with_affinity(shmCreateAffFunc, cName, C.uint64_t(size), C.uint32_t(affinitySocketID), cUsrInfo, C.uint64_t(flag), cRegion, cProvider)
if ret != 0 {
return fmt.Errorf("ubs_mem_shm_create_with_affinity failed, error code=%d", ret)
}
return nil
}
func UbsMemShmAttach(name string, owner *UbsMemFdOwner, mode uint32) (*UbsMemShmDesc, error) {
shmAttachPtr, err := dlopen.LoadFunc("ubs_mem_shm_attach")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_shm_attach: %v", err)
}
shmAttachFunc := (C.ubs_mem_shm_attach_func)(shmAttachPtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
var cOwner *C.ubs_mem_fd_owner_t
if owner != nil {
cOwner = convertMemOwner(owner)
defer freeMemOwner(cOwner)
}
var cDesc *C.ubs_mem_shm_desc_t
ret := C.call_ubs_mem_shm_attach(shmAttachFunc, cName, cOwner, C.mode_t(mode), &cDesc)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_shm_attach failed, error code=%d", ret)
}
defer C.free(unsafe.Pointer(cDesc))
goDesc := convertMemShmDesc(cDesc)
return &goDesc, nil
}
func UbsMemShmGet(name string) (*UbsMemShmDesc, error) {
shmGetPtr, err := dlopen.LoadFunc("ubs_mem_shm_get")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_shm_get: %v", err)
}
shmGetFunc := (C.ubs_mem_shm_get_func)(shmGetPtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
var cDesc *C.ubs_mem_shm_desc_t
ret := C.call_ubs_mem_shm_get(shmGetFunc, cName, &cDesc)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_shm_get failed, error code=%d", ret)
}
defer C.free(unsafe.Pointer(cDesc))
goDesc := convertMemShmDesc(cDesc)
return &goDesc, nil
}
func UbsMemShmList() ([]UbsMemShmDesc, error) {
shmListPtr, err := dlopen.LoadFunc("ubs_mem_shm_list")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_shm_list: %v", err)
}
shmListFunc := (C.ubs_mem_shm_list_func)(shmListPtr)
var cDescs *C.ubs_mem_shm_desc_t
var cCount C.uint32_t
ret := C.call_ubs_mem_shm_list(shmListFunc, &cDescs, &cCount)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_shm_list failed, error code=%d", ret)
}
defer C.free(unsafe.Pointer(cDescs))
count := int(cCount)
if count <= 0 || count > UbsMemMaxDescList {
return []UbsMemShmDesc{}, nil
}
descs := make([]UbsMemShmDesc, 0, count)
size := unsafe.Sizeof(C.ubs_mem_shm_desc_t{})
for i := 0; i < count; i++ {
cDesc := (*C.ubs_mem_shm_desc_t)(unsafe.Pointer(uintptr(unsafe.Pointer(cDescs)) + uintptr(i)*size))
goDesc := convertMemShmDesc(cDesc)
descs = append(descs, goDesc)
}
return descs, nil
}
func UbsMemShmListWithPrefix(namePrefix string) ([]UbsMemShmDesc, error) {
shmListWithPrefixPtr, err := dlopen.LoadFunc("ubs_mem_shm_list_with_prefix")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_shm_list_with_prefix: %v", err)
}
shmListWithPrefixFunc := (C.ubs_mem_shm_list_with_prefix_func)(shmListWithPrefixPtr)
cNamePrefix := C.CString(namePrefix)
defer C.free(unsafe.Pointer(cNamePrefix))
var cDescs *C.ubs_mem_shm_desc_t
var cCount C.uint32_t
ret := C.call_ubs_mem_shm_list_with_prefix(shmListWithPrefixFunc, cNamePrefix, &cDescs, &cCount)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_shm_list_with_prefix failed, error code=%d", ret)
}
defer C.free(unsafe.Pointer(cDescs))
count := int(cCount)
if count <= 0 || count > UbsMemMaxDescList {
return []UbsMemShmDesc{}, nil
}
descs := make([]UbsMemShmDesc, 0, count)
size := unsafe.Sizeof(C.ubs_mem_shm_desc_t{})
for i := 0; i < count; i++ {
cDesc := (*C.ubs_mem_shm_desc_t)(unsafe.Pointer(uintptr(unsafe.Pointer(cDescs)) + uintptr(i)*size))
goDesc := convertMemShmDesc(cDesc)
descs = append(descs, goDesc)
}
return descs, nil
}
func UbsMemShmDetach(name string) error {
shmDetachPtr, err := dlopen.LoadFunc("ubs_mem_shm_detach")
if err != nil {
return fmt.Errorf("failed to load ubs_mem_shm_detach: %v", err)
}
shmDetachFunc := (C.ubs_mem_shm_detach_func)(shmDetachPtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
ret := C.call_ubs_mem_shm_detach(shmDetachFunc, cName)
if ret != 0 {
return fmt.Errorf("ubs_mem_shm_detach failed, error code=%d", ret)
}
return nil
}
func UbsMemShmDelete(name string) error {
shmDeletePtr, err := dlopen.LoadFunc("ubs_mem_shm_delete")
if err != nil {
return fmt.Errorf("failed to load ubs_mem_shm_delete: %v", err)
}
shmDeleteFunc := (C.ubs_mem_shm_delete_func)(shmDeletePtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
ret := C.call_ubs_mem_shm_delete(shmDeleteFunc, cName)
if ret != 0 {
return fmt.Errorf("ubs_mem_shm_delete failed, error code=%d", ret)
}
return nil
}
func UbsMemShmFaultGet(name string) (*UbsMemMemidsFault, error) {
shmFaultGetPtr, err := dlopen.LoadFunc("ubs_mem_shm_fault_get")
if err != nil {
return nil, fmt.Errorf("failed to load ubs_mem_shm_fault_get: %v", err)
}
shmFaultGetFunc := (C.ubs_mem_shm_fault_get_func)(shmFaultGetPtr)
cName := C.CString(name)
defer C.free(unsafe.Pointer(cName))
cFault := C.malloc(C.sizeof_ubs_mem_memids_fault_t)
defer C.free(cFault)
cFaultPtr := (*C.ubs_mem_memids_fault_t)(cFault)
ret := C.call_ubs_mem_shm_fault_get(shmFaultGetFunc, cName, cFaultPtr)
if ret != 0 {
return nil, fmt.Errorf("ubs_mem_shm_fault_get failed, error code=%d", ret)
}
goFault := convertMemMemidsFault(cFaultPtr)
return &goFault, nil
}
type Handler func(name string, memid uint64, falutType UbsMemFaultType) error
var shmFaultHandler Handler
func goShmFaultHandler(cName *C.char, cMemid C.uint64_t, cFaultType C.ubs_mem_fault_type_t) C.int32_t {
if cName == nil {
return C.int32_t(-1)
}
name := C.GoString(cName)
memid := uint64(cMemid)
faultType := UbsMemFaultType(cFaultType)
if shmFaultHandler != nil {
err := shmFaultHandler(name, memid, faultType)
if err != nil {
return C.int32_t(-1)
}
return C.int32_t(0)
} else {
return C.int32_t(-1)
}
}
func UbsMemShmFaultRegister(handler Handler) error {
shmFaultHandler = handler
shmFaultRegPtr, err := dlopen.LoadFunc("ubs_mem_shm_fault_register")
if err != nil {
return fmt.Errorf("failed to load ubs_mem_shm_fault_register: %v", err)
}
shmFaultRegFunc := (C.ubs_mem_shm_fault_register_func)(shmFaultRegPtr)
ret := C.call_ubs_mem_shm_fault_register(shmFaultRegFunc, (C.ubs_mem_shm_fault_handler)(C.goShmFaultHandler))
if ret != 0 {
return fmt.Errorf("ubs_mem_shm_fault_register failed, error code=%d", ret)
}
return nil
}
func convertTopoNode(cNode *C.ubs_topo_node_t) topo.UbsTopoNode {
goNode := topo.UbsTopoNode{
SlotId: uint32(cNode.slot_id),
IPs: make([]net.IP, 0),
HostName: C.GoString(&cNode.host_name[0]),
}
for j := 0; j < topo.TopoSocketNum; j++ {
goNode.SocketId[j] = uint32(cNode.socket_id[j])
}
for j := 0; j < topo.TopoSocketNum; j++ {
for k := 0; k < topo.TopoNumaNum; k++ {
goNode.NumaIds[j][k] = uint32(cNode.numa_ids[j][k])
}
}
for j := 0; j < topo.TopoIpAddrNum; j++ {
cIp := cNode.ips[j]
if cIp.af == C.AF_INET {
ipv4Bytes := C.GoBytes(unsafe.Pointer(&cIp.ipv4), topo.Ipv4Length)
ip := net.IP(ipv4Bytes)
if !ip.IsUnspecified() {
goNode.IPs = append(goNode.IPs, ip)
}
} else if cIp.af == C.AF_INET6 {
ipv6Bytes := C.GoBytes(unsafe.Pointer(&cIp.ipv6), topo.Ipv6Length)
ip := net.IP(ipv6Bytes)
if !ip.IsUnspecified() {
goNode.IPs = append(goNode.IPs, ip)
}
}
}
return goNode
}
func convertMemNodes(goNodes *UbsMemNodes) *C.ubs_mem_nodes_t {
if goNodes == nil || int(goNodes.NodeCnt) > UbsMemMaxSlotNum {
return nil
}
cNodes := C.malloc(C.sizeof_ubs_mem_nodes_t)
cNodesPtr := (*C.ubs_mem_nodes_t)(cNodes)
cNodesPtr.node_cnt = C.uint32_t(goNodes.NodeCnt)
for i := 0; i < int(goNodes.NodeCnt); i++ {
cNodesPtr.slot_ids[i] = C.uint32_t(goNodes.SlotIds[i])
}
return cNodesPtr
}
func convertMemOwner(goOwner *UbsMemFdOwner) *C.ubs_mem_fd_owner_t {
if goOwner == nil {
return nil
}
cOwner := C.malloc(C.sizeof_ubs_mem_fd_owner_t)
cOwnerPtr := (*C.ubs_mem_fd_owner_t)(cOwner)
cOwnerPtr.uid = C.uid_t(goOwner.Uid)
cOwnerPtr.gid = C.gid_t(goOwner.Gid)
cOwnerPtr.pid = C.pid_t(goOwner.Pid)
return cOwnerPtr
}
func freeMemNodes(cNodes *C.ubs_mem_nodes_t) {
if cNodes != nil {
C.free(unsafe.Pointer(cNodes))
}
}
func freeMemOwner(cOwner *C.ubs_mem_fd_owner_t) {
if cOwner != nil {
C.free(unsafe.Pointer(cOwner))
}
}
func convertMemShmImportDesc(cDesc *C.ubs_mem_shm_import_desc_t) UbsMemShmImportDesc {
if cDesc == nil || uint32(cDesc.memid_cnt) > UbsMemMaxMemidNum {
return UbsMemShmImportDesc{}
}
goDesc := UbsMemShmImportDesc{
MemidCnt: uint32(cDesc.memid_cnt),
Memids: make([]uint64, cDesc.memid_cnt),
ImportNode: convertTopoNode(&cDesc.import_node),
MemStage: UbsMemStage(cDesc.mem_stage),
}
for i := 0; i < int(cDesc.memid_cnt); i++ {
goDesc.Memids[i] = uint64(cDesc.memids[i])
}
return goDesc
}
func convertMemShmDesc(cDesc *C.ubs_mem_shm_desc_t) UbsMemShmDesc {
if cDesc == nil || uint32(cDesc.import_desc_cnt) > topo.TopoMaxNodeNum {
return UbsMemShmDesc{}
}
goDesc := UbsMemShmDesc{
Name: C.GoString(&cDesc.name[0]),
MemSize: uint64(cDesc.mem_size),
UnitSize: uint64(cDesc.unit_size),
ExportNode: convertTopoNode(&cDesc.export_node),
ImportDescCnt: uint32(cDesc.import_desc_cnt),
MemStage: UbsMemStage(cDesc.mem_stage),
}
goDesc.UsrInfo = make([]byte, UbseMaxUsrInfoLength)
copy(goDesc.UsrInfo, C.GoBytes(unsafe.Pointer(&cDesc.usr_info[0]), C.int(UbseMaxUsrInfoLength)))
goDesc.ImportDesc = make([]UbsMemShmImportDesc, cDesc.import_desc_cnt)
for i := 0; i < int(cDesc.import_desc_cnt); i++ {
cImpDesc := (*C.ubs_mem_shm_import_desc_t)(unsafe.Pointer(uintptr(unsafe.Pointer(cDesc.import_desc)) + uintptr(i)*unsafe.Sizeof(C.ubs_mem_shm_import_desc_t{})))
goDesc.ImportDesc[i] = convertMemShmImportDesc(cImpDesc)
}
return goDesc
}
func convertMemMemidsFault(cFault *C.ubs_mem_memids_fault_t) UbsMemMemidsFault {
if cFault == nil || uint32(cFault.memid_cnt) > UbsMemMaxMemidNum {
return UbsMemMemidsFault{}
}
goFault := UbsMemMemidsFault{
MemidCnt: uint32(cFault.memid_cnt),
Memids: make([]uint64, cFault.memid_cnt),
MemidStatus: make([]UbsMemFaultType, cFault.memid_cnt),
}
for i := 0; i < int(cFault.memid_cnt); i++ {
goFault.Memids[i] = uint64(cFault.memids[i])
goFault.MemidStatus[i] = UbsMemFaultType(cFault.memid_status[i])
}
return goFault
}