package vfs
import (
"os"
"time"
"golang.org/x/sys/unix"
)
func osGetSharedLock(file *os .File ) error {
if lock , _ := osTestLock (file , _PENDING_BYTE , 1 , _IOERR ); lock == unix .F_WRLCK {
return _BUSY
}
return osReadLock (file , _SHARED_FIRST , _SHARED_SIZE , 0 )
}
func osGetReservedLock(file *os .File ) error {
return osWriteLock (file , _RESERVED_BYTE , 1 , 0 )
}
func osGetExclusiveLock(file *os .File , state *LockLevel ) error {
if *state == LOCK_RESERVED {
if err := osWriteLock (file , _PENDING_BYTE , 1 , -1 ); err != nil {
return err
}
*state = LOCK_PENDING
}
return osWriteLock (file , _SHARED_FIRST , _SHARED_SIZE , time .Millisecond )
}
func osDowngradeLock(file *os .File , state LockLevel ) error {
if state >= LOCK_EXCLUSIVE {
if err := osReadLock (file , _SHARED_FIRST , _SHARED_SIZE , 0 ); err != nil {
return _IOERR_RDLOCK
}
}
return osUnlock (file , _PENDING_BYTE , 2 )
}
func osReleaseLock(file *os .File , _ LockLevel ) error {
return osUnlock (file , 0 , 0 )
}
func osCheckReservedLock(file *os .File ) (bool , error ) {
lock , err := osTestLock (file , _RESERVED_BYTE , 1 , _IOERR_CHECKRESERVEDLOCK )
return lock == unix .F_WRLCK , err
}
The pages are generated with Golds v0.8.2 . (GOOS=linux 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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds .