فهرست منبع

Reset Pager state on Abort

Jonathan Storm 3 ماه پیش
والد
کامیت
d3222e819b
1فایلهای تغییر یافته به همراه12 افزوده شده و 1 حذف شده
  1. 12 1
      v6/depager.go

+ 12 - 1
v6/depager.go

@@ -72,6 +72,7 @@ func NewPager[T any](
 	done := make(chan struct{})
 
 	return &pager[T]{
+		pctx:     ctx,
 		ctx:      ctx2,
 		cancel:   cancel,
 		done:     done,
@@ -87,6 +88,7 @@ Retrieve n items in the range [m*n, m*n + n - 1], inclusive.
 We keep len(pagePool) pages buffered.
 */
 type pager[T any] struct {
+	pctx     context.Context // Parent context.
 	ctx      context.Context
 	cancel   context.CancelFunc
 	done     chan struct{} // Notify Abort when finished.
@@ -177,8 +179,17 @@ func (p *pager[T]) LastErr() error {
 	return p.err
 }
 
+func (p *pager[T]) reset() error {
+	err := p.err
+	p.ctx, p.cancel = context.WithCancel(p.pctx)
+	p.done = make(chan struct{})
+	p.m, p.cnt = 0, 0
+	p.err = nil
+	return err
+}
+
 func (p *pager[T]) Abort() error {
 	p.cancel()
 	<-p.done
-	return nil
+	return p.reset()
 }