@@ -34,10 +34,12 @@ type (
3434 closeTimeout time.Duration
3535 closeItem func (ctx context.Context , item PT )
3636 idleTimeToLive time.Duration
37+ itemUsageLimit uint64
3738 }
3839 itemInfo [PT ItemConstraint [T ], T any ] struct {
39- idle * xlist.Element [PT ]
40- lastUsage time.Time
40+ idle * xlist.Element [PT ]
41+ lastUsage time.Time
42+ useCounter * uint64
4143 }
4244 waitChPool [PT ItemConstraint [T ], T any ] interface {
4345 GetOrNew () * chan PT
@@ -93,6 +95,12 @@ func WithLimit[PT ItemConstraint[T], T any](size int) Option[PT, T] {
9395 }
9496}
9597
98+ func WithItemUsageLimit [PT ItemConstraint [T ], T any ](itemUsageLimit uint64 ) Option [PT , T ] {
99+ return func (c * Config [PT , T ]) {
100+ c .itemUsageLimit = itemUsageLimit
101+ }
102+ }
103+
96104func WithTrace [PT ItemConstraint [T ], T any ](t * Trace ) Option [PT , T ] {
97105 return func (c * Config [PT , T ]) {
98106 c .trace = t
@@ -217,8 +225,10 @@ func makeAsyncCreateItemFunc[PT ItemConstraint[T], T any]( //nolint:funlen
217225 newItem , err := p .config .createItem (createCtx )
218226 if newItem != nil {
219227 p .mu .WithLock (func () {
228+ var useCounter uint64
220229 p .index [newItem ] = itemInfo [PT , T ]{
221- lastUsage : p .config .clock .Now (),
230+ lastUsage : p .config .clock .Now (),
231+ useCounter : & useCounter ,
222232 }
223233 })
224234 }
@@ -592,10 +602,13 @@ func (p *Pool[PT, T]) getItem(ctx context.Context) (item PT, finalErr error) { /
592602 panic ("no index for item" )
593603 }
594604
605+ * info .useCounter ++
606+
595607 return info
596608 })
597609
598- if p .config .idleTimeToLive > 0 && p .config .clock .Since (info .lastUsage ) > p .config .idleTimeToLive {
610+ if (p .config .itemUsageLimit > 0 && * info .useCounter > p .config .itemUsageLimit ) ||
611+ (p .config .idleTimeToLive > 0 && p .config .clock .Since (info .lastUsage ) > p .config .idleTimeToLive ) {
599612 p .closeItem (ctx , item )
600613 p .mu .WithLock (func () {
601614 p .changeState (func () Stats {
0 commit comments