package libc
import (
"fmt"
"os"
"sync"
"time"
"unsafe"
"golang.org/x/sys/unix"
)
var randState uint32
var randStateMu sync .Mutex
func reseed () uint32 {
return uint32 (time .Now ().UnixNano () + int64 (os .Getpid ()))
}
func nextRandom (x uintptr ) {
randStateMu .Lock ()
r := randState
if r == 0 {
r = reseed ()
}
r = r *1664525 + 1013904223
randState = r
randStateMu .Unlock ()
copy ((*RawMem )(unsafe .Pointer (x ))[:6 :6 ], fmt .Sprintf ("%06d" , int (1e9 +r %1e9 )%1e6 ))
}
func tempFile (s , x uintptr ) (fd int , err error ) {
const maxTry = 10000
nconflict := 0
for i := 0 ; i < maxTry ; i ++ {
nextRandom (x )
if fd , err = unix .Open (GoString (s ), os .O_RDWR |os .O_CREATE |os .O_EXCL , 0600 ); err == nil {
return fd , nil
}
if !os .IsExist (err ) {
return -1 , err
}
if nconflict ++; nconflict > 10 {
randStateMu .Lock ()
randState = reseed ()
nconflict = 0
randStateMu .Unlock ()
}
}
return -1 , err
}
The pages are generated with Golds v0.3.6 . (GOOS=darwin GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .