mirror of
https://github.com/containers/podman.git
synced 2025-05-21 00:56:36 +08:00
62 lines
2.9 KiB
Go
62 lines
2.9 KiB
Go
package lock
|
|
|
|
// Manager provides an interface for allocating multiprocess locks.
|
|
// Locks returned by Manager MUST be multiprocess - allocating a lock in
|
|
// process A and retrieving that lock's ID in process B must return handles for
|
|
// the same lock, and locking the lock in A should exclude B from the lock until
|
|
// it is unlocked in A.
|
|
// All locks must be identified by a UUID (retrieved with Locker's ID() method).
|
|
// All locks with a given UUID must refer to the same underlying lock, and it
|
|
// must be possible to retrieve the lock given its UUID.
|
|
// Each UUID should refer to a unique underlying lock.
|
|
// Calls to AllocateLock() must return a unique, unallocated UUID.
|
|
// AllocateLock() must fail once all available locks have been allocated.
|
|
// Locks are returned to use by calls to Free(), and can subsequently be
|
|
// reallocated.
|
|
type Manager interface {
|
|
// AllocateLock returns an unallocated lock.
|
|
// It is guaranteed that the same lock will not be returned again by
|
|
// AllocateLock until the returned lock has Free() called on it.
|
|
// If all available locks are allocated, AllocateLock will return an
|
|
// error.
|
|
AllocateLock() (Locker, error)
|
|
// RetrieveLock retrieves a lock given its UUID.
|
|
// The underlying lock MUST be the same as another other lock with the
|
|
// same UUID.
|
|
RetrieveLock(id uint32) (Locker, error)
|
|
}
|
|
|
|
// Locker is similar to sync.Locker, but provides a method for freeing the lock
|
|
// to allow its reuse.
|
|
// All Locker implementations must maintain mutex semantics - the lock only
|
|
// allows one caller in the critical section at a time.
|
|
// All locks with the same ID must refer to the same underlying lock, even
|
|
// if they are within multiple processes.
|
|
type Locker interface {
|
|
// ID retrieves the lock's ID.
|
|
// ID is guaranteed to uniquely identify the lock within the
|
|
// Manager - that is, calling RetrieveLock with this ID will return
|
|
// another instance of the same lock.
|
|
ID() uint32
|
|
// Lock locks the lock.
|
|
// This call MUST block until it successfully acquires the lock or
|
|
// encounters a fatal error.
|
|
// All errors must be handled internally, as they are not returned. For
|
|
// the most part, panicking should be appropriate.
|
|
// Some lock implementations may require that Lock() and Unlock() occur
|
|
// within the same goroutine (SHM locking, for example). The usual Go
|
|
// Lock()/defer Unlock() pattern will still work fine in these cases.
|
|
Lock()
|
|
// Unlock unlocks the lock.
|
|
// All errors must be handled internally, as they are not returned. For
|
|
// the most part, panicking should be appropriate.
|
|
// This includes unlocking locks which are already unlocked.
|
|
Unlock()
|
|
// Free deallocates the underlying lock, allowing its reuse by other
|
|
// pods and containers.
|
|
// The lock MUST still be usable after a Free() - some libpod instances
|
|
// may still retain Container structs with the old lock. This simply
|
|
// advises the manager that the lock may be reallocated.
|
|
Free() error
|
|
}
|