chenshijun
2020-04-16 3766acf3262235e825fb90f75266fc9de01d8b8e
shmqueue.go
@@ -12,7 +12,7 @@
)
const (
   TimePeriodPutOrGet = time.Duration(1) * time.Microsecond
   TimePeriodPutOrGet = time.Duration(5) * time.Microsecond
)
//Element info
@@ -146,14 +146,14 @@
func (eqi *EsQueueInfo) QueueSize() int {
   var putPos, getPos uint32
   var quantity uint32
   getPos = atomic.LoadUint32(&eqi.Queue.getPos)
   putPos = atomic.LoadUint32(&eqi.Queue.putPos)
   if putPos >= getPos {
      quantity = putPos - getPos
   } else {
      //quantity = q.capMod + (putPos - getPos)
      quantity = (eqi.Queue.capMod + (putPos - getPos)) % eqi.Queue.capMod
      quantity = eqi.Queue.capMod + (putPos - getPos)
   }
   return int(quantity)
@@ -185,13 +185,12 @@
   if putPos >= getPos {
      posCnt = putPos - getPos
   } else {
      //posCnt = capMod + (putPos - getPos)
      posCnt = (capMod + (putPos - getPos)) % capMod
      posCnt = capMod + (putPos - getPos)
   }
   //todo
   //if posCnt >= capMod-1 {
   if posCnt >= capMod {
   if posCnt >= capMod-1 {
   //if posCnt >= capMod {
      runtime.Gosched()
      return false, int(posCnt)
   }
@@ -205,6 +204,8 @@
   cache = &(eqi.EsCaches[putPosNew&capMod])
   //tryMax := 100
   //tryCount := 0
   for {
      getNo := atomic.LoadUint32(&cache.getNo)
      putNo := atomic.LoadUint32(&cache.putNo)
@@ -215,6 +216,10 @@
      } else {
         runtime.Gosched()
      }
      //tryCount++
      //if tryCount >= tryMax {
      //   return false, int(posCnt)
      //}
   }
}
@@ -296,17 +301,23 @@
   cache = &(eqi.EsCaches[getPosNew&capMod])
   //tryMax := 100
   //tryCount := 0
   for {
      getNo := atomic.LoadUint32(&cache.getNo)
      putNo := atomic.LoadUint32(&cache.putNo)
      if getPosNew == getNo && getNo == putNo-eqi.Queue.capacity {
         val := cache.value
         cache.value = ElemInfo{PicId: 0}
         cache.value = ElemInfo{PicId: 0, InfoId:0}
         atomic.AddUint32(&cache.getNo, eqi.Queue.capacity)
         return val, true, int(posCnt - 1)
      } else {
         runtime.Gosched()
      }
      //tryCount++
      //if tryCount >= tryMax {
      //   return ElemInfo{}, false, int(posCnt)
      //}
   }
}