mirror of
https://github.com/containers/podman.git
synced 2025-12-02 11:08:36 +08:00
Update c/storage to 9b10041d7b2ef767ce9c42b5862b6c51eeb82214
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
This commit is contained in:
41
vendor/github.com/containers/storage/lockfile_unix.go
generated
vendored
41
vendor/github.com/containers/storage/lockfile_unix.go
generated
vendored
@@ -9,6 +9,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/containers/storage/pkg/stringid"
|
||||
"github.com/containers/storage/pkg/system"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
@@ -25,6 +26,7 @@ type lockfile struct {
|
||||
locktype int16
|
||||
locked bool
|
||||
ro bool
|
||||
recursive bool
|
||||
}
|
||||
|
||||
// openLock opens the file at path and returns the corresponding file
|
||||
@@ -75,7 +77,7 @@ func createLockerForPath(path string, ro bool) (Locker, error) {
|
||||
|
||||
// lock locks the lockfile via FCTNL(2) based on the specified type and
|
||||
// command.
|
||||
func (l *lockfile) lock(l_type int16) {
|
||||
func (l *lockfile) lock(l_type int16, recursive bool) {
|
||||
lk := unix.Flock_t{
|
||||
Type: l_type,
|
||||
Whence: int16(os.SEEK_SET),
|
||||
@@ -86,7 +88,13 @@ func (l *lockfile) lock(l_type int16) {
|
||||
case unix.F_RDLCK:
|
||||
l.rwMutex.RLock()
|
||||
case unix.F_WRLCK:
|
||||
l.rwMutex.Lock()
|
||||
if recursive {
|
||||
// NOTE: that's okay as recursive is only set in RecursiveLock(), so
|
||||
// there's no need to protect against hypothetical RDLCK cases.
|
||||
l.rwMutex.RLock()
|
||||
} else {
|
||||
l.rwMutex.Lock()
|
||||
}
|
||||
default:
|
||||
panic(fmt.Sprintf("attempted to acquire a file lock of unrecognized type %d", l_type))
|
||||
}
|
||||
@@ -110,6 +118,7 @@ func (l *lockfile) lock(l_type int16) {
|
||||
}
|
||||
l.locktype = l_type
|
||||
l.locked = true
|
||||
l.recursive = recursive
|
||||
l.counter++
|
||||
}
|
||||
|
||||
@@ -119,13 +128,24 @@ func (l *lockfile) Lock() {
|
||||
if l.ro {
|
||||
l.RLock()
|
||||
} else {
|
||||
l.lock(unix.F_WRLCK)
|
||||
l.lock(unix.F_WRLCK, false)
|
||||
}
|
||||
}
|
||||
|
||||
// RecursiveLock locks the lockfile as a writer but allows for recursive
|
||||
// acquisitions within the same process space. Note that RLock() will be called
|
||||
// if it's a lockTypReader lock.
|
||||
func (l *lockfile) RecursiveLock() {
|
||||
if l.ro {
|
||||
l.RLock()
|
||||
} else {
|
||||
l.lock(unix.F_WRLCK, true)
|
||||
}
|
||||
}
|
||||
|
||||
// LockRead locks the lockfile as a reader.
|
||||
func (l *lockfile) RLock() {
|
||||
l.lock(unix.F_RDLCK)
|
||||
l.lock(unix.F_RDLCK, false)
|
||||
}
|
||||
|
||||
// Unlock unlocks the lockfile.
|
||||
@@ -161,7 +181,7 @@ func (l *lockfile) Unlock() {
|
||||
// Close the file descriptor on the last unlock.
|
||||
unix.Close(int(l.fd))
|
||||
}
|
||||
if l.locktype == unix.F_RDLCK {
|
||||
if l.locktype == unix.F_RDLCK || l.recursive {
|
||||
l.rwMutex.RUnlock()
|
||||
} else {
|
||||
l.rwMutex.Unlock()
|
||||
@@ -232,3 +252,14 @@ func (l *lockfile) Modified() (bool, error) {
|
||||
func (l *lockfile) IsReadWrite() bool {
|
||||
return !l.ro
|
||||
}
|
||||
|
||||
// TouchedSince indicates if the lock file has been touched since the specified time
|
||||
func (l *lockfile) TouchedSince(when time.Time) bool {
|
||||
st, err := system.Fstat(int(l.fd))
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
mtim := st.Mtim()
|
||||
touched := time.Unix(mtim.Unix())
|
||||
return when.Before(touched)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user