Просмотр исходного кода

修复内存共享bug 测试通过版本

chenyuanjie 1 год назад
Родитель
Сommit
c416018a61
2 измененных файлов с 29 добавлено и 9 удалено
  1. 19 8
      pro/src/app.c
  2. 10 1
      pro/src/common.h

+ 19 - 8
pro/src/app.c

@@ -2131,6 +2131,7 @@ static void* shm_thread(void *arg)
 	pthread_exit(NULL);
 }
 
+
 /// @brief QT通讯内存共享线程(5寸屏)
 /// @param arg 
 /// @return 
@@ -2138,7 +2139,7 @@ static int shm_New_CtrlBoard(void *arg)
 {
     GlobalPowerManger* _globalPowerMangerTemp = NULL ;
     GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
-
+    log_i("shm_CtrlBoard Start\n");
     // 尝试清理旧对象(忽略错误)
     shm_unlink(SHM_NAME_5_inch_screen); // 如果不存在会返回 -1,但无需处理
     // 创建新的共享内存对象
@@ -2150,21 +2151,31 @@ static int shm_New_CtrlBoard(void *arg)
     }
 
     /* 设置共享内存对象的大小 */
-    if (ftruncate(shm_fd, sizeof(GlobalPowerCtrlBoard)*(_globalDeviceManager->brdMax+1)) == -1) {
+    size_t  nSize= sizeof(GlobalPowerCtrlBoard)*(_globalDeviceManager->brdMax+1)+sizeof(int)+sizeof(size_t);
+    if (ftruncate(shm_fd,nSize) == -1) {
         perror("ftruncate");
         return 2;
     }
+    log_i("shm_CtrlBoard ftruncate End\n");
     //new
-    int *pPID = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
-    int *pBrodSize = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, sizeof(int));
-    _globalDeviceManager->pCtrlBoard = (GlobalPowerCtrlBoard *)mmap(NULL, sizeof(GlobalPowerCtrlBoard)*(_globalDeviceManager->brdMax+1), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, sizeof(int)*2);
+    log_i("shm_CtrlBoard mmap Start\n");
+
+    smartPDU_shm_5_inch_data* pShare_Data = (smartPDU_shm_5_inch_data *)mmap(NULL, nSize, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
     
-    if (_globalDeviceManager->pCtrlBoard==NULL) {
+    if (pShare_Data==MAP_FAILED) {
         perror("mmap");
+        log_i("shm_CtrlBoard mmap Error\n");
         return 3;
     }
-    *pPID=getpid();
-    *pBrodSize=_globalDeviceManager->brdMax+1;
+
+    log_i("shm_CtrlBoard mmap initEnd\n");
+    if (pShare_Data)
+    {
+        _globalDeviceManager->pCtrlBoard= pShare_Data->m_pData;
+        pShare_Data->array_size=_globalDeviceManager->brdMax + 1;
+        pShare_Data->nIPD=getpid();
+        log_i("shm_CtrlBoard mmap end-ID=%d ,size= %d\n",pShare_Data->nIPD,pShare_Data->array_size);
+    }
     return 0;
 }
 

+ 10 - 1
pro/src/common.h

@@ -450,6 +450,8 @@ typedef struct
     int nSelectPh;//当前通道的三相ph参数:0:A相 1:B相 2:C相 -1通道总计
 } smartPDU_shm_data;
 
+
+
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////
 //超限管理表
@@ -682,7 +684,14 @@ typedef struct
 }GlobalPowerCtrlBoard;
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////
-
+//自定义共享内存类
+typedef struct
+{
+    //电源数据
+    pid_t nIPD;
+    size_t array_size; 
+    GlobalPowerCtrlBoard m_pData[];
+} smartPDU_shm_5_inch_data;
 //电源信息统计
 typedef struct
 {