Skip to content

Commit

Permalink
libct/cap: switch to lazy init
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
kolyshkin committed Jul 23, 2024
1 parent 3778ae6 commit 351ab7e
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions libcontainer/capabilities/capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package capabilities
import (
"sort"
"strings"
"sync"

"github.com/opencontainers/runc/libcontainer/configs"
"github.com/sirupsen/logrus"
Expand All @@ -14,24 +15,26 @@ import (
const allCapabilityTypes = capability.CAPS | capability.BOUNDING | capability.AMBIENT

var (
capabilityMap map[string]capability.Cap
capTypes = []capability.CapType{
capTypes = []capability.CapType{
capability.BOUNDING,
capability.PERMITTED,
capability.INHERITABLE,
capability.EFFECTIVE,
capability.AMBIENT,
}
capMap = sync.OnceValue(initCapMap)
)

func init() {
capabilityMap = make(map[string]capability.Cap, capability.CAP_LAST_CAP+1)
// Do not call directly, use capMap instead.
func initCapMap() map[string]capability.Cap {
capabilityMap := make(map[string]capability.Cap, capability.CAP_LAST_CAP+1)
for _, c := range capability.List() {
if c > capability.CAP_LAST_CAP {
continue
}
capabilityMap["CAP_"+strings.ToUpper(c.String())] = c
}
return capabilityMap
}

// KnownCapabilities returns the list of the known capabilities.
Expand Down Expand Up @@ -78,9 +81,10 @@ func New(capConfig *configs.Capabilities) (*Caps, error) {
// equivalent, and returns them as a slice. Unknown or unavailable capabilities
// are not returned, but appended to unknownCaps.
func capSlice(caps []string, unknownCaps map[string]struct{}) []capability.Cap {
cMap := capMap()
var out []capability.Cap
for _, c := range caps {
if v, ok := capabilityMap[c]; !ok {
if v, ok := cMap[c]; !ok {
unknownCaps[c] = struct{}{}
} else {
out = append(out, v)
Expand Down

0 comments on commit 351ab7e

Please sign in to comment.