diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2021-09-29 13:25:05 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2021-09-29 14:24:09 +0200 |
commit | 5ea369adef6115702eb2d2e483d7c552d15a7c04 (patch) | |
tree | eb66450ce3ae8d40e3300adeb0e340fab90e3497 /libpod | |
parent | 30bf31010e4a6ca4247eef293a4202f6775d6ec9 (diff) | |
download | podman-5ea369adef6115702eb2d2e483d7c552d15a7c04.tar.gz podman-5ea369adef6115702eb2d2e483d7c552d15a7c04.tar.bz2 podman-5ea369adef6115702eb2d2e483d7c552d15a7c04.zip |
libpod: add GetConfigNoCopy()
Add a new function to libpod to directly access the runtime
configuration without creating an expensive deep copy. Further migrate
a number of callers to this new function.
This drops the number of calls to JSONDeepCopy from 4 to 1 in a simple
`podman run --rm -d busybox top`.
Future work: Please note that there are more callers of GetConfig() that
can me migrated to GetConfigNoCopy().
[NO TESTS NEEDED]
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/runtime.go | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/libpod/runtime.go b/libpod/runtime.go index 161d5a533..27885bf5c 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -706,19 +706,32 @@ func (r *Runtime) TmpDir() (string, error) { return r.config.Engine.TmpDir, nil } -// GetConfig returns a copy of the configuration used by the runtime -func (r *Runtime) GetConfig() (*config.Config, error) { +// GetConfig returns the configuration used by the runtime. +// Note that the returned value is not a copy and must hence +// only be used in a reading fashion. +func (r *Runtime) GetConfigNoCopy() (*config.Config, error) { r.lock.RLock() defer r.lock.RUnlock() if !r.valid { return nil, define.ErrRuntimeStopped } + return r.config, nil +} + +// GetConfig returns a copy of the configuration used by the runtime. +// Please use GetConfigNoCopy() in case you only want to read from +// but not write to the returned config. +func (r *Runtime) GetConfig() (*config.Config, error) { + rtConfig, err := r.GetConfigNoCopy() + if err != nil { + return nil, err + } config := new(config.Config) // Copy so the caller won't be able to modify the actual config - if err := JSONDeepCopy(r.config, config); err != nil { + if err := JSONDeepCopy(rtConfig, config); err != nil { return nil, errors.Wrapf(err, "error copying config") } |