Skip to content

Commit fe73f1a

Browse files
committed
libct/cap: switch to lazy init
A map which is created in func init is only used by capSlice, which is only used by New, which is only used by runc init. Switch to lazy init to slightly save on startup time. Signed-off-by: Kir Kolyshkin <[email protected]>
1 parent cdee1b3 commit fe73f1a

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

libcontainer/capabilities/capabilities.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package capabilities
55
import (
66
"sort"
77
"strings"
8+
"sync"
89

910
"github.com/opencontainers/runc/libcontainer/configs"
1011
"github.com/sirupsen/logrus"
@@ -14,25 +15,25 @@ import (
1415
const allCapabilityTypes = capability.CAPS | capability.BOUNDING | capability.AMBIENT
1516

1617
var (
17-
capabilityMap map[string]capability.Cap
18-
capTypes = []capability.CapType{
18+
capTypes = []capability.CapType{
1919
capability.BOUNDING,
2020
capability.PERMITTED,
2121
capability.INHERITABLE,
2222
capability.EFFECTIVE,
2323
capability.AMBIENT,
2424
}
25-
)
2625

27-
func init() {
28-
capabilityMap = make(map[string]capability.Cap, capability.CAP_LAST_CAP+1)
29-
for _, c := range capability.List() {
30-
if c > capability.CAP_LAST_CAP {
31-
continue
26+
capMap = sync.OnceValue(func() map[string]capability.Cap {
27+
cm := make(map[string]capability.Cap, capability.CAP_LAST_CAP+1)
28+
for _, c := range capability.List() {
29+
if c > capability.CAP_LAST_CAP {
30+
continue
31+
}
32+
cm["CAP_"+strings.ToUpper(c.String())] = c
3233
}
33-
capabilityMap["CAP_"+strings.ToUpper(c.String())] = c
34-
}
35-
}
34+
return cm
35+
})
36+
)
3637

3738
// KnownCapabilities returns the list of the known capabilities.
3839
// Used by `runc features`.
@@ -75,9 +76,10 @@ func New(capConfig *configs.Capabilities) (*Caps, error) {
7576
// equivalent, and returns them as a slice. Unknown or unavailable capabilities
7677
// are not returned, but appended to unknownCaps.
7778
func capSlice(caps []string, unknownCaps map[string]struct{}) []capability.Cap {
79+
cm := capMap()
7880
out := make([]capability.Cap, 0, len(caps))
7981
for _, c := range caps {
80-
if v, ok := capabilityMap[c]; !ok {
82+
if v, ok := cm[c]; !ok {
8183
unknownCaps[c] = struct{}{}
8284
} else {
8385
out = append(out, v)

0 commit comments

Comments
 (0)