| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build unix |
| |
| package runtime |
| |
| // retryOnEAGAIN retries a function until it does not return EAGAIN. |
| // It will use an increasing delay between calls, and retry up to 20 times. |
| // The function argument is expected to return an errno value, |
| // and retryOnEAGAIN will return any errno value other than EAGAIN. |
| // If all retries return EAGAIN, then retryOnEAGAIN will return EAGAIN. |
| func retryOnEAGAIN(fn func() int32) int32 { |
| for tries := 0; tries < 20; tries++ { |
| errno := fn() |
| if errno != _EAGAIN { |
| return errno |
| } |
| usleep_no_g(uint32(tries+1) * 1000) // milliseconds |
| } |
| return _EAGAIN |
| } |