From 6351ababead17e120b146a4b3f37c4e49ca64268 Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期二, 17 九月 2019 10:53:29 +0800
Subject: [PATCH] 给定时器加锁

---
 ruleserver/ruleToformula.go |   53 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index a236fbd..ae1e45a 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -6,6 +6,7 @@
 	"sort"
 	"strconv"
 	"strings"
+	"sync"
 	"time"
 
 	"basic.com/pubsub/protomsg.git"
@@ -111,6 +112,8 @@
 	Sort    int32
 }
 
+var rw sync.RWMutex // 璇诲啓閿�
+
 // 瀵瑰崟甯у浘鍍忕殑鍒ゆ柇 thisSdkDatas  褰撳墠浼犲叆鐨勮繖甯ф暟鎹紝cacheSdkData 瀹氭椂鍣ㄩ噷缂撳瓨鐨勪竴甯ф暟鎹� 娌℃湁灏辫繑鍥瀗il  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
 func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
 	if len(args.Sdkdata) > 0 {
@@ -161,7 +164,7 @@
 	}
 }
 
-func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) bool {
+func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) (bool,[]int) {
 	defer func() {
 		if err := recover(); err != nil {
 			logger.Error("姣斿瑙勫垯鏈夎", err.(string))
@@ -357,27 +360,30 @@
 				} else {
 					islink = false
 				}
+				var labelTypes []int // 0涓簓olo鏍囩锛�1涓篺ace鏍囩 2涓轰袱鑰呮爣绛�
 				if sdkNames != "" {
 					args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, islink,label,})
+					labelTypes = append(labelTypes,0)
 					//logger.Info("-------------------yolo缁撴灉鏍囩闀垮害", len(args.RuleResult["yolo"].([]Result)))
 				}
 				if faceFlag {
 					args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId, islink,label,}, faces})
 					//logger.Info("-------------------face缁撴灉鏍囩", len(args.RuleResult["face"].([]FaceResult)))
+					labelTypes = append(labelTypes,1)
 				}
-				return true
+				return true,labelTypes
 			} else {
-				return false
+				return false,[]int{}
 			}
 
 		} else {
 			// 缁撴灉涓哄亣鏃朵篃瑕佽蛋锛屾湁鏉�姝诲畾鏃跺櫒鐨勬搷浣�
 			TimerAlarm(&label, groupRule.GroupId, result.(bool))
 			//fmt.Println(timeFlag)
-			return false
+			return false,[]int{}
 		}
 	} else {
-		return false
+		return false,[]int{}
 	}
 }
 
@@ -417,11 +423,15 @@
 	logger.Info("------------------------------------------褰撳墠鏄仈鍔ㄤ换鍔★紝瑙勫垯鏄細", groupRule.GroupText)
 	var flag bool = true
 	var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId}
+	rw.Lock()
 	for k, timeEle1 := range TimeEleList {
 		if k == groupRule.GroupId {
 			flag = false // 宸茬粡鏈変簡杩欎釜瀹氭椂鍣ㄥ氨缃负false 涓嶅啀鏂板
 			timeEle = *timeEle1
 		}
+	}
+	for _,ruleRe := range timeEle.RuleResults {
+		logger.Info("鑱斿姩鏁扮粍閲岀殑鏁版嵁----",ruleRe.CameraId,ruleRe.Sort)
 	}
 	if flag { // 濡傛灉杩樻病鏈夎繖涓畾鏃跺櫒鍏冪礌灏辨柊澧炰竴涓�
 		//timeEle := TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} // 鎵旇繘鍘讳竴涓畾鏃跺櫒鍏冪礌
@@ -431,7 +441,9 @@
 		// 寰楀嚭杩欑粍瀹屾暣瑙勫垯閲屾秹鍙婂埌鍑犱釜鎽勫儚鏈猴紝鍐冲畾鐫�鏁扮粍閲屾湁鍑犱釜缁撴瀯浣�,鍘婚噸娣诲姞鏂瑰紡
 		for j := 0; j < len(groupRule.Rules); j++ {
 			var flag1 bool = true
+			logger.Info("瑙勫垯缁勪俊鎭細",groupRule.Rules[j].CameraId)
 			for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
+				logger.Info("鑱斿姩鏁扮粍閲岀殑鏁版嵁锛�",ruleRes.CameraId,ruleRes.Sort)
 				if groupRule.Rules[j].CameraId == ruleRes.CameraId {
 					flag1 = false
 				}
@@ -441,8 +453,9 @@
 			}
 		}
 	}
+	rw.Unlock()
 	// 寰�鏁扮粍閲岃祴鍊�
-	isOk := RunRule(args, groupRule, taskId, message, label)
+	isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
 	if isOk {
 		logger.Info("杩欏抚鍥惧儚鍦ㄤ换鍔′笅鐨勪竴鏁存潯瑙勫垯涓嬶紙鑱斿姩浠诲姟涓嬪氨鏄窡鏈憚鍍忔満鍍忕浉鍏崇殑灏忚鍒欙級鐨勫垽鏂粨鏋滀负true")
 		// 鏍规嵁cameraId鍘绘洿鏂版垨鑰呮彃鍏ョ粨鏋�,鐒跺悗鍒ゆ柇鏄惁鏁扮粍鏄惁鍙互寰楀嚭鎶ヨ鐨勭粨璁�
@@ -492,6 +505,7 @@
 				result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋�
 				if result.(bool) {
 					logger.Info("___________________________________________________________________鑱斿姩浠诲姟鎶ヨ")
+					rw.RLock()
 					if TimeEleList[groupRule.GroupId] != nil {  // 鏋佸伓灏旀湁鎯呭喌浼氱瓑浜巒il锛屼笉鐭ラ亾涓哄暐锛屽仛涓垽鏂互闃插畷鏈�
 						// 鎶婃暟缁勯噷缂撳瓨鐨勬暟鎹彇鍑烘潵涓�璧锋姤璀�
 						label.LinkCache = []ResultMsg{}
@@ -510,13 +524,28 @@
 							}
 						}
 					}
+					rw.RUnlock()
 				}
 			}
 		} else {
 			logger.Warn("鏁扮粍涓嶅渾婊′笉鎵撴爣绛�")
 			// 鍊掓槸鎶婃墦鐨勭粍瑙勫垯鏍囩缁欏幓鎺変簡鍟�
-			lens := len(args.RuleResult["yolo"].([]Result))-1
-			args.RuleResult["yolo"] = args.RuleResult["yolo"].([]Result)[0:lens]
+			for _,val := range labelTypes {
+				if val == 0 {
+					if len(args.RuleResult["yolo"].([]Result)) >= 1 {
+						lens := len(args.RuleResult["yolo"].([]Result))-1
+						args.RuleResult["yolo"] = args.RuleResult["yolo"].([]Result)[0:lens]
+					}
+				}
+				if val == 1 {
+					if len(args.RuleResult["face"].([]FaceResult)) >= 1 {
+						lens := len(args.RuleResult["face"].([]FaceResult))-1
+						args.RuleResult["face"] = args.RuleResult["face"].([]FaceResult)[0:lens]
+					}
+				}
+			}
+
+
 		}
 	} else { // 娌℃湁鎶ヨ锛�
 		//logger.Info("杩欏抚鍥惧儚鍦ㄤ换鍔′笅鐨勪竴鏁存潯瑙勫垯涓嬶紙鑱斿姩浠诲姟涓嬪氨鏄窡鏈憚鍍忔満鍍忕浉鍏崇殑灏忚鍒欙級鐨勫垽鏂粨鏋滀负false")
@@ -526,12 +555,14 @@
 		//		va.Result = strconv.FormatBool(isOk)
 		//	}
 		//}
+		rw.Lock()
 		for k, _ := range TimeEleList {
 			if k == groupRule.GroupId {
 				delete(TimeEleList, k)
 				logger.Debug("鍥犱负瀹氭椂鍣ㄧ殑涓�甯ф暟鎹粨鏋滀负false锛屽共鎺夊畾鏃跺櫒")
 			}
 		}
+		rw.Unlock()
 		// 鍥犱负鏈抚鏁版嵁涓嶇鍚堣鍒欙紝鎵�浠ヤ篃涓嶇敤缁熻缁撴灉鏁扮粍閲岀殑涓滆タ
 
 	}
@@ -577,14 +608,14 @@
 						var args []*Arg
 						if rule.RuleWithPre == "&&" {
 							args = am.filterData
-							// 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁
-							am.filterData = am.filterData[0:0]
 							//logger.Info("杩囨护鍚庣殑args鐨勯暱搴︿负锛�",len(args))
 						} else {
 							args = am.args
 							//涓嶆竻绌轰箣鍓嶇殑杩囨护鏁版嵁锛岀户缁
 							//logger.Info("娌¤繃婊ょ殑args鐨勯暱搴︿负锛�",len(args))
 						}
+						// 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁
+						am.filterData = am.filterData[0:0]
 						//logger.Info("-----------------------浜鸿劯杩囨护鐨刟rgs閲岀殑鏁伴噺锛�", len(args))
 						for _, arg := range args {
 							var formula string
@@ -678,6 +709,7 @@
 		if rule.SdkArgAlias == "duration" { //
 			logger.Info("褰撳墠灏忚鍒欐槸锛�---------", rule)
 			// 鍏堢湅鐪嬪畾鏃跺櫒鍏冪礌闃熷垪涓槸鍚︽湁杩欐潯瑙勫垯鐨勫畾鏃跺櫒,濡傛灉鏈夊氨涓嶈兘鍐嶆鍒涘缓浜�
+			rw.Lock()
 			var flag bool = true
 			for k, _ := range TimeEleList {
 				if k == groupId+"+"+rule.Id {
@@ -693,6 +725,7 @@
 				TimeEleList[groupId+"+"+rule.Id] = &timeEle // 瀹氭椂鍣ㄥ厓绱犱互褰撳墠鎸佺画鏃堕棿灏忚鍒檌d涓洪敭
 				logger.Info("鍒涘缓浜嗚鏁板櫒")
 			}
+			rw.Unlock()
 		}
 	}
 }

--
Gitblit v1.8.0