github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/originatedtxs/txs_ring_buffer.go (about) 1 package originatedtxs 2 3 import ( 4 "github.com/hashicorp/golang-lru/simplelru" 5 "github.com/unicornultrafoundation/go-u2u/common" 6 ) 7 8 type Buffer struct { 9 senderCount *simplelru.LRU // sender address -> number of transactions 10 } 11 12 func New(maxAddresses int) *Buffer { 13 ring := &Buffer{} 14 ring.senderCount, _ = simplelru.NewLRU(maxAddresses, nil) 15 return ring 16 } 17 18 // Inc is not safe for concurrent use 19 func (ring *Buffer) Inc(sender common.Address) { 20 cur, ok := ring.senderCount.Peek(sender) 21 if ok { 22 ring.senderCount.Add(sender, cur.(int)+1) 23 } else { 24 ring.senderCount.Add(sender, int(1)) 25 } 26 } 27 28 // Dec is not safe for concurrent use 29 func (ring *Buffer) Dec(sender common.Address) { 30 cur, ok := ring.senderCount.Peek(sender) 31 if !ok { 32 return 33 } 34 if cur.(int) <= 1 { 35 ring.senderCount.Remove(sender) 36 } else { 37 ring.senderCount.Add(sender, cur.(int)-1) 38 } 39 } 40 41 // Clear is not safe for concurrent use 42 func (ring *Buffer) Clear() { 43 ring.senderCount.Purge() 44 } 45 46 // TotalOf is not safe for concurrent use 47 func (ring *Buffer) TotalOf(sender common.Address) int { 48 cur, ok := ring.senderCount.Get(sender) 49 if !ok { 50 return 0 51 } 52 return cur.(int) 53 } 54 55 // Empty is not safe for concurrent use 56 func (ring *Buffer) Empty() bool { 57 return ring.senderCount.Len() == 0 58 }