| // 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 | |
| } |