From f78156db5df835c8230793e899ae661efef2a9d2 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期六, 11 一月 2020 17:53:35 +0800
Subject: [PATCH] debug

---
 run.go |  137 +++++++++++++++++++++++++++------------------
 1 files changed, 81 insertions(+), 56 deletions(-)

diff --git a/run.go b/run.go
index e1f3cbd..ca4cb9d 100644
--- a/run.go
+++ b/run.go
@@ -12,15 +12,76 @@
 	"basic.com/valib/gogpu.git"
 )
 
+type channel struct {
+	index int
+	msg   chan protomsg.SdkMessage
+}
+
+//////////////////////////////////////////////////////////////////
+const (
+	cacheFrameNum   = 3
+	trackChnTimeout = time.Duration(10)
+)
+
+func (f *face) channelAvailable() int {
+	f.mapChanLock.Lock()
+	defer f.mapChanLock.Unlock()
+
+	for i := 0; i < f.maxChannel; i++ {
+		found := false
+		for _, v := range f.mapChan {
+			if v.index == i {
+				found = true
+				break
+			}
+		}
+		if !found {
+			return i
+		}
+	}
+	return -1
+}
+
+func (f *face) channelRelease(id string) {
+	f.mapChanLock.Lock()
+	defer f.mapChanLock.Unlock()
+
+	delete(f.mapChan, id)
+}
+
+func (f *face) channelExist(id string) (*channel, bool) {
+	f.mapChanLock.Lock()
+	defer f.mapChanLock.Unlock()
+
+	c, ok := f.mapChan[id]
+	return c, ok
+}
+
+func (f *face) channelNew(id string) *channel {
+	f.mapChanLock.Lock()
+	defer f.mapChanLock.Unlock()
+
+	index := f.channelAvailable()
+	if index < 0 {
+		return nil
+	}
+
+	c := &channel{
+		index: index,
+		msg:   make(chan protomsg.SdkMessage, cacheFrameNum),
+	}
+
+	f.mapChan[id] = c
+	return c
+}
+
 type face struct {
 	handle *SDKFace
 	list   *sdkhelper.LockList
 
-	maxChannel      int
-	ftrackChans     map[string]chan protomsg.SdkMessage
-	ftrackChannels  map[string]int
-	ftrackChanStats []bool
-	chnLock         sync.Mutex
+	maxChannel  int
+	mapChan     map[string]*channel
+	mapChanLock sync.Mutex
 
 	fnLogger func(...interface{})
 
@@ -103,10 +164,8 @@
 		handle: handle,
 		list:   sdkhelper.NewLockList(maxChan + maxChan/2),
 
-		maxChannel:      maxChan,
-		ftrackChans:     make(map[string]chan protomsg.SdkMessage, maxChan),
-		ftrackChannels:  make(map[string]int, maxChan),
-		ftrackChanStats: make([]bool, maxChan, maxChan),
+		maxChannel: maxChan,
+		mapChan:    make(map[string]*channel, maxChan),
 
 		fnLogger: fn,
 
@@ -136,18 +195,16 @@
 func (f *face) run(msgs []protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK, typ string) {
 
 	for _, msg := range msgs {
-		if _, ok := f.ftrackChans[msg.Cid]; ok {
-			f.ftrackChans[msg.Cid] <- msg
+		if c, ok := f.channelExist(msg.Cid); ok {
+			c.msg <- msg
 		} else {
 
-			f.ftrackChans[msg.Cid] = make(chan protomsg.SdkMessage, cacheFrameNum)
-			chn := f.getAvailableChn()
-			if chn < 0 {
+			nc := f.channelNew(msg.Cid)
+			if nc == nil {
 				f.fnLogger("TOO MUCH CHANNEL")
 				sdkhelper.EjectResult(nil, msg, out)
 				continue
 			}
-			f.ftrackChannels[msg.Cid] = chn
 
 			i := sdkhelper.UnpackImage(msg, f.typ, f.fnLogger)
 			if i == nil {
@@ -156,23 +213,25 @@
 			}
 			// conv to bgr24 and resize
 			imgW, imgH := int(i.Width), int(i.Height)
-			ret := f.handle.TrackerResize(imgW, imgH, chn)
-			f.fnLogger("ResizeFaceTracker: cid: ", msg.Cid, " chan: ", chn, " wXh: ", imgW, "x", imgH, " result:", ret)
-			go f.detectTrackOneChn(f.ftrackChans[msg.Cid], out, chn)
-			f.ftrackChans[msg.Cid] <- msg
+			ret := f.handle.TrackerResize(imgW, imgH, nc.index)
+			f.fnLogger("ResizeFaceTracker: cid: ", msg.Cid, " chan: ", nc.index, " wXh: ", imgW, "x", imgH, " result:", ret)
+			go f.detectTrackOneChn(c, out)
+			c.msg <- msg
 		}
 	}
 }
 
-func (f *face) detectTrackOneChn(in <-chan protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK, dtchn int) {
+func (f *face) detectTrackOneChn(c *channel, out chan<- sdkstruct.MsgSDK) {
 	tm := time.Now()
 	sc := 0
+
+	dtchn := c.index
 	f.fnLogger("DETECTTRACKONECHN DTCHN: ", dtchn)
 	var curCid string
 
 	for {
 		select {
-		case rMsg := <-in:
+		case rMsg := <-c.msg:
 
 			if !sdkhelper.ValidRemoteMessage(rMsg, f.typ, f.fnLogger) {
 				sdkhelper.EjectResult(nil, rMsg, out)
@@ -218,43 +277,9 @@
 		case <-time.After(trackChnTimeout * time.Second):
 			f.fnLogger("Timeout to get image, curCid:", curCid)
 			if curCid != "" {
-				delete(f.ftrackChans, curCid)
-				f.releaseChn(dtchn)
+				f.channelRelease(curCid)
 			}
 			return
 		}
 	}
-}
-
-//////////////////////////////////////////////////////////////////
-const (
-	cacheFrameNum   = 3
-	trackChnTimeout = time.Duration(10)
-)
-
-func (f *face) cleanChnStat() {
-	f.chnLock.Lock()
-	for i := 0; i < f.maxChannel; i++ {
-		f.ftrackChanStats[i] = false
-	}
-	f.chnLock.Unlock()
-}
-
-func (f *face) getAvailableChn() int {
-	f.chnLock.Lock()
-	defer f.chnLock.Unlock()
-
-	for i := 0; i < f.maxChannel; i++ {
-		if f.ftrackChanStats[i] == false {
-			f.ftrackChanStats[i] = true
-			return i
-		}
-	}
-	return -1
-}
-
-func (f *face) releaseChn(chn int) {
-	f.chnLock.Lock()
-	f.ftrackChanStats[chn] = false
-	f.chnLock.Unlock()
 }

--
Gitblit v1.8.0