把shmData的库拆开,把attach和detach放到外面去,使用更灵活
增加通过shmid获取shmkey的接口
2个文件已修改
54 ■■■■■ 已修改文件
shmData.go 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
shmwrap.go 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
shmData.go
@@ -28,6 +28,8 @@
}
//WriteShmData   data待写入的数据;   shmId:共享内存id,只attach,不create
// 把data写入shmId对应的shm中,  流程: attach->写入数据->detach
// 适合shm是空的,解码使用
func WriteShmData(data []byte, shmId int) error {
    shmData,err := Attach(shmId)
    if err != nil {
@@ -43,10 +45,16 @@
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    copy(tmpData, data)
    err = Detach(shmData)
    if err != nil {
        return err
    }
    return nil
}
//ReadShmData attach到shmId对应的共享内存,并读出数据[]byte
// 使用之后需要detach
func ReadShmData(shmId int) ([]byte,error) {
    shmData,err := Attach(shmId)
    if err != nil {
@@ -58,3 +66,38 @@
    return tmpData, nil
}
//DeepCopyDataToShm 深拷贝,把内存的数据拷贝attach之后共享内存中
// 输入: shmData是attach返回的[]byte, memdData是内存中的数据
// 写入数据到共享内存使用:attach->DeepCopyDataToShm->detach
// 适合解码使用
func DeepCopyDataToShm(memData,shmData []byte) {
    sdi := shmData2Info(shmData)
    if len(memData) <= len(shmData) {
        sdi.Capacity = uint32(len(memData))
    } else {
        sdi.Capacity = uint32(len(shmData))
    }
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    copy(tmpData, memData)
}
//ReadShmData 把attach后的shmData转成内存data
// 输入:attach到共享内存得到的shmData
// 输出:转换后的data
// 从共享内存中读取数据使用:attach->ConvertShmToData->只读,业务处理结束后->detach
func ConvertShmToData(shmData []byte) []byte {
    sdi := shmData2Info(shmData)
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    return tmpData
}
//UpdateDataToShm (类似浅拷贝)更新数据到共享内存
// 输入: ConvertShmToData得到的数据data,经过业务处理后,该数据有变化,需要update到shm里
// 更新数据到共享内存使用: attach->ConvertShmToData->修改data数据,业务处理结束后->UpdateDataToShm->detach
func UpdateDataToShm(data, shmData []byte) {
    sdi := shmData2Info(shmData)
    sdi.Capacity = uint32(len(data))
}
shmwrap.go
@@ -212,3 +212,14 @@
    return int(idDs.Nattch), nil
}
func GetKeyById(shmId int) (int,error) {
    var idDs shm.IdDs
    _, err := shm.Ctl(shmId, shm.IPC_STAT, &idDs)
    if err != nil {
        return 0, err
    }
    return int(idDs.Perm.Key), nil
}