Переглянути джерело

对级联链表添加锁保护

guohui 2 роки тому
батько
коміт
7e19bf5663
3 змінених файлів з 42 додано та 13 видалено
  1. 6 5
      pro/src/appweb_handle.c
  2. 33 8
      pro/src/cascade.c
  3. 3 0
      pro/src/cascade.h

+ 6 - 5
pro/src/appweb_handle.c

@@ -257,7 +257,9 @@ void* update_thread(void* arg)
                         dev_search_latest_power_statistic_info(gdm);
                     }
                     else {
+                        cascade_lock();
                         dev_search_latest_power_statistic_info(gdm2);
+                        cascade_unlock();
                     }
                 }                
             }
@@ -267,17 +269,16 @@ void* update_thread(void* arg)
                 _OverChnPwrAckInfo _over_chn_pwr_back_info;
                 INIT_LIST_HEAD(&_over_chn_pwr_back_info.list);
 
-                GlobalDeviceManager *pgdm=NULL;
                 if(cur_dev_addr==0) {
-                    pgdm = gdm;
+                    dev_search_latest_power_All_info(gdm,&_over_chn_pwr_back_info);
                 }
                 else {
-                    pgdm = gdm2;
+                    cascade_lock();
+                    dev_search_latest_power_All_info(gdm2,&_over_chn_pwr_back_info);
+                    cascade_unlock();
                 }
 
-                dev_search_latest_power_All_info(pgdm,&_over_chn_pwr_back_info);
                 upgrade_msg = ws_chn_status_ack_to_json(1,&_over_chn_pwr_back_info);
-
                 websocket_send(upgrade_msg, strlen(upgrade_msg));
                  
                 //释放资源,一定要记得释放json字符串!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

+ 33 - 8
pro/src/cascade.c

@@ -29,7 +29,7 @@
 typedef struct {
     
     int                 inited;
-    pthread_mutex_t     mutex;
+    pthread_mutex_t     mutex;          //used for list lock     
     
     Modbus_Manger       m;
     int                 addr;
@@ -63,17 +63,21 @@ static inline GlobalDeviceManager* get_dm2(void)
 static inline ModbusInfo_t *get_mb(void)
 {
     static ModbusInfo_t mbinfo={
-#if (MB_MASTER==1)
+
+#ifdef MB_DEBUG
+    #if (MB_MASTER==1)
         .product_modbus_type=0,
-#else
+    #else
         .product_modbus_type=1,
-#endif
+    #endif
         .product_modbus_addr=1,
         .product_modbus_baud=115200,
     };
 
     return &mbinfo;
-    //return &get_dm()->_global_device_info->_gmodbus_info;
+#else
+    return &get_dm()->_global_device_info->_gmodbus_info;
+#endif
 }
 static int slave_init(cascade_handle_t *cas)
 {
@@ -218,7 +222,7 @@ static int mb_init(cascade_handle_t *cas, char *path, int type, int addr, uint32
             slave_get_info(cas);
         }
         else {
-            cas->addr = -1;
+            cas->addr = 0;
         }
         cas->inited = 1;
     }
@@ -487,6 +491,7 @@ static int mb_receive(cascade_handle_t *cas)
                     case CASCADE_CMD_GET_INFO:
                     {
                         LOGD("_____ slave CASCADE_CMD_GET_INFO\n");
+                        //slave_get_info(cas);      //this function will cost long time, marked it
                         memcpy(cas->map2->tab_registers+(h.reg-CASCADE_REG_OFFSET), (char*)&cas->info, h.regcnt*2);
                     }
                     break;
@@ -603,9 +608,11 @@ static int power_add(cascade_handle_t *cas)
     GlobalPowerManger* pm=NULL;
     board_info_t *info=&cas->info;
 
-    power_clear(cas);
+    cascade_lock();
 
+    power_clear(cas);
     LOGD("_____ master add channel to the list, cnt: %d\n", info->cnt);
+
     for(i=0; i<info->cnt; i++) {
         for (j=0; j<info->board[i].maxChn; j++) {
             pm = (GlobalPowerManger*)calloc(1, sizeof(GlobalPowerManger));
@@ -628,6 +635,7 @@ static int power_add(cascade_handle_t *cas)
             chn++;
         }
     }
+    cascade_unlock();
 
     return 0;
 }
@@ -1036,6 +1044,7 @@ int cascade_init(void)
 
     power_init();
     slave_init(cas);
+    pthread_mutex_init(&cas->mutex, NULL);
     
     cas->scanAddr = 1;
     cas->pwrInfo.info = malloc(128*sizeof(PowerInfo));
@@ -1046,7 +1055,7 @@ int cascade_init(void)
 
     set_modbus(cas, get_mb());
     slave_add(cas, 0);
-
+    
     sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
     sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
         
@@ -1133,3 +1142,19 @@ int cascade_is_offline(int addr)
 }
 
 
+int cascade_lock(void)
+{
+    cascade_handle_t *cas=&casHandle;
+
+    return pthread_mutex_lock(&cas->mutex);
+}
+
+
+int cascade_unlock(void)
+{
+    cascade_handle_t *cas=&casHandle;
+
+    return pthread_mutex_unlock(&cas->mutex);
+}
+
+

+ 3 - 0
pro/src/cascade.h

@@ -155,6 +155,9 @@ int cascade_request(cmd_data_t *cmd);
 int cascade_get_dlist(dev_list_t *dl);
 int cascade_free_dlist(dev_list_t *dl);
 
+int cascade_lock(void);
+int cascade_unlock(void);
+
 #endif