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