github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/dbutil/threads/counted.go (about) 1 package threads 2 3 import ( 4 "github.com/unicornultrafoundation/go-helios/u2udb" 5 6 "github.com/unicornultrafoundation/go-u2u/logger" 7 ) 8 9 type ( 10 countedDbProducer struct { 11 u2udb.DBProducer 12 } 13 14 countedFullDbProducer struct { 15 u2udb.FullDBProducer 16 } 17 18 countedStore struct { 19 u2udb.Store 20 } 21 22 countedIterator struct { 23 u2udb.Iterator 24 release func(count int) 25 } 26 ) 27 28 func CountedDBProducer(dbs u2udb.DBProducer) u2udb.DBProducer { 29 return &countedDbProducer{dbs} 30 } 31 32 func CountedFullDBProducer(dbs u2udb.FullDBProducer) u2udb.FullDBProducer { 33 return &countedFullDbProducer{dbs} 34 } 35 36 func (p *countedDbProducer) OpenDB(name string) (u2udb.Store, error) { 37 s, err := p.DBProducer.OpenDB(name) 38 return &countedStore{s}, err 39 } 40 41 func (p *countedFullDbProducer) OpenDB(name string) (u2udb.Store, error) { 42 s, err := p.FullDBProducer.OpenDB(name) 43 return &countedStore{s}, err 44 } 45 46 var notifier = logger.New("threads-pool") 47 48 func (s *countedStore) NewIterator(prefix []byte, start []byte) u2udb.Iterator { 49 got, release := GlobalPool.Lock(1) 50 if got < 1 { 51 notifier.Log.Warn("Too many DB iterators") 52 } 53 54 return &countedIterator{ 55 Iterator: s.Store.NewIterator(prefix, start), 56 release: release, 57 } 58 } 59 60 func (it *countedIterator) Release() { 61 it.Iterator.Release() 62 it.release(1) 63 }