summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2018-08-08 15:50:16 -0400
committerMatthew Heon <matthew.heon@pm.me>2019-01-04 09:45:59 -0500
commita21f21efa19372e055e8f1daf2e77c52e5352ccc (patch)
tree1cefa8e72f8d318ff47dd4925d486cd3081295d4
parent3ed81051e814e688f7b4ae1bbc7c4d4c3fbd7d0f (diff)
downloadpodman-a21f21efa19372e055e8f1daf2e77c52e5352ccc.tar.gz
podman-a21f21efa19372e055e8f1daf2e77c52e5352ccc.tar.bz2
podman-a21f21efa19372e055e8f1daf2e77c52e5352ccc.zip
Refactor locks package to build on non-Linux
Move SHM specific code into a subpackage. Within the main locks package, move the manager to be linux-only and add a non-Linux unsupported build file. Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
-rw-r--r--libpod/lock/shm/shm_lock.c (renamed from libpod/lock/shm_lock.c)0
-rw-r--r--libpod/lock/shm/shm_lock.go (renamed from libpod/lock/shm_lock.go)7
-rw-r--r--libpod/lock/shm/shm_lock.h (renamed from libpod/lock/shm_lock.h)0
-rw-r--r--libpod/lock/shm/shm_lock_test.go (renamed from libpod/lock/shm_lock_test.go)2
-rw-r--r--libpod/lock/shm_lock_manager_linux.go (renamed from libpod/lock/shm_lock_manager.go)21
-rw-r--r--libpod/lock/shm_lock_manager_unsupported.go29
6 files changed, 48 insertions, 11 deletions
diff --git a/libpod/lock/shm_lock.c b/libpod/lock/shm/shm_lock.c
index 3fe41f63c..3fe41f63c 100644
--- a/libpod/lock/shm_lock.c
+++ b/libpod/lock/shm/shm_lock.c
diff --git a/libpod/lock/shm_lock.go b/libpod/lock/shm/shm_lock.go
index a8a969479..ff9b0ce2c 100644
--- a/libpod/lock/shm_lock.go
+++ b/libpod/lock/shm/shm_lock.go
@@ -1,4 +1,4 @@
-package lock
+package shm
// #cgo LDFLAGS: -lrt -lpthread
// #include "shm_lock.h"
@@ -72,6 +72,11 @@ func OpenSHMLock(numLocks uint32) (*SHMLocks, error) {
return locks, nil
}
+// GetMaxLocks returns the maximum number of locks in the SHM
+func (locks *SHMLocks) GetMaxLocks() uint32 {
+ return locks.maxLocks
+}
+
// Close closes an existing shared-memory segment.
// The segment will be rendered unusable after closing.
// WARNING: If you Close() while there are still locks locked, these locks may
diff --git a/libpod/lock/shm_lock.h b/libpod/lock/shm/shm_lock.h
index 18bea47e9..18bea47e9 100644
--- a/libpod/lock/shm_lock.h
+++ b/libpod/lock/shm/shm_lock.h
diff --git a/libpod/lock/shm_lock_test.go b/libpod/lock/shm/shm_lock_test.go
index 4903d3a50..bc22db835 100644
--- a/libpod/lock/shm_lock_test.go
+++ b/libpod/lock/shm/shm_lock_test.go
@@ -1,4 +1,4 @@
-package lock
+package shm
import (
"fmt"
diff --git a/libpod/lock/shm_lock_manager.go b/libpod/lock/shm_lock_manager_linux.go
index 1fc2b106e..b1e9df12d 100644
--- a/libpod/lock/shm_lock_manager.go
+++ b/libpod/lock/shm_lock_manager_linux.go
@@ -1,3 +1,5 @@
+// +build linux
+
package lock
import (
@@ -7,16 +9,17 @@ import (
"syscall"
"github.com/pkg/errors"
+ "github.com/projectatomic/libpod/libpod/lock/shm"
)
// SHMLockManager manages shared memory locks.
type SHMLockManager struct {
- locks *SHMLocks
+ locks *shm.SHMLocks
}
// NewSHMLockManager makes a new SHMLockManager with the given number of locks.
func NewSHMLockManager(numLocks uint32) (Manager, error) {
- locks, err := CreateSHMLock(numLocks)
+ locks, err := shm.CreateSHMLock(numLocks)
if err != nil {
return nil, err
}
@@ -29,8 +32,8 @@ func NewSHMLockManager(numLocks uint32) (Manager, error) {
// OpenSHMLockManager opens an existing SHMLockManager with the given number of
// locks.
-func OpenSHMLockManager(numLocks uint32) (LockManager, error) {
- locks, err := OpenSHMLock(numLocks)
+func OpenSHMLockManager(numLocks uint32) (Manager, error) {
+ locks, err := shm.OpenSHMLock(numLocks)
if err != nil {
return nil, err
}
@@ -59,20 +62,20 @@ func (m *SHMLockManager) AllocateLock() (Locker, error) {
func (m *SHMLockManager) RetrieveLock(id string) (Locker, error) {
intID, err := strconv.ParseInt(id, 16, 64)
if err != nil {
- return errors.Wrapf(err, "given ID %q is not a valid SHMLockManager ID - cannot be parsed as int", id)
+ return nil, errors.Wrapf(err, "given ID %q is not a valid SHMLockManager ID - cannot be parsed as int", id)
}
if intID < 0 {
- return errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - must be positive", id)
+ return nil, errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - must be positive", id)
}
if intID > math.MaxUint32 {
- return errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - too large", id)
+ return nil, errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - too large", id)
}
var u32ID uint32 = uint32(intID)
- if u32ID >= m.locks.maxLocks {
- return errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - too large to fit", id)
+ if u32ID >= m.locks.GetMaxLocks() {
+ return nil, errors.Wrapf(syscall.EINVAL, "given ID %q is not a valid SHMLockManager ID - too large to fit", id)
}
lock := new(SHMLock)
diff --git a/libpod/lock/shm_lock_manager_unsupported.go b/libpod/lock/shm_lock_manager_unsupported.go
new file mode 100644
index 000000000..a1340fcd1
--- /dev/null
+++ b/libpod/lock/shm_lock_manager_unsupported.go
@@ -0,0 +1,29 @@
+// +build !linux
+
+package lock
+
+import "fmt"
+
+// SHMLockManager is a shared memory lock manager.
+// It is not supported on non-Unix platforms.
+type SHMLockManager struct{}
+
+// NewSHMLockManager is not supported on this platform
+func NewSHMLockManager(numLocks uint32) (Manager, error) {
+ return nil, fmt.Errorf("not supported")
+}
+
+// OpenSHMLockManager is not supported on this platform
+func OpenSHMLockManager(numLocks uint32) (Manager, error) {
+ return nil, fmt.Errorf("not supported")
+}
+
+// AllocateLock is not supported on this platform
+func (m *SHMLockManager) AllocateLock() (Locker, error) {
+ return nil, fmt.Errorf("not supported")
+}
+
+// RetrieveLock is not supported on this platform
+func (m *SHMLockManager) RetrieveLock(id string) (Locker, error) {
+ return nil, fmt.Errorf("not supported")
+}