| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| package retry |
| |
| import ( |
| "context" |
| "time" |
| ) |
| |
| // Retry the operation using the provided back-off policy until it succeeds, |
| // or the context is cancelled. |
| func Retry(ctx context.Context, b Backoff, f func() error, c chan<- error) error { |
| var err error |
| var next time.Duration |
| |
| b.Reset() |
| for { |
| if err = f(); err == nil { |
| break |
| } |
| |
| if next = b.Next(); next == Stop { |
| return err |
| } |
| |
| timer := time.NewTimer(next) |
| |
| select { |
| case <-ctx.Done(): |
| timer.Stop() |
| return err |
| case <-timer.C: |
| if c != nil { |
| c <- err |
| } |
| } |
| } |
| |
| return err |
| } |