Add mutex in Manager to read from m.Paths

Signed-off-by: Antonio Murdaca <me@runcom.ninja>
This commit is contained in:
Antonio Murdaca 2015-05-25 20:29:09 +02:00
parent 8c6ed5ebe0
commit 81444369c6
2 changed files with 28 additions and 5 deletions

View File

@ -44,6 +44,7 @@ type subsystem interface {
} }
type Manager struct { type Manager struct {
mu sync.Mutex
Cgroups *configs.Cgroup Cgroups *configs.Cgroup
Paths map[string]string Paths map[string]string
} }
@ -82,7 +83,6 @@ type data struct {
} }
func (m *Manager) Apply(pid int) error { func (m *Manager) Apply(pid int) error {
if m.Cgroups == nil { if m.Cgroups == nil {
return nil return nil
} }
@ -128,14 +128,25 @@ func (m *Manager) Apply(pid int) error {
} }
func (m *Manager) Destroy() error { func (m *Manager) Destroy() error {
return cgroups.RemovePaths(m.Paths) m.mu.Lock()
defer m.mu.Unlock()
if err := cgroups.RemovePaths(m.Paths); err != nil {
return err
}
m.Paths = make(map[string]string)
return nil
} }
func (m *Manager) GetPaths() map[string]string { func (m *Manager) GetPaths() map[string]string {
return m.Paths m.mu.Lock()
paths := m.Paths
m.mu.Unlock()
return paths
} }
func (m *Manager) GetStats() (*cgroups.Stats, error) { func (m *Manager) GetStats() (*cgroups.Stats, error) {
m.mu.Lock()
defer m.mu.Unlock()
stats := cgroups.NewStats() stats := cgroups.NewStats()
for name, path := range m.Paths { for name, path := range m.Paths {
sys, ok := subsystems[name] sys, ok := subsystems[name]

View File

@ -20,6 +20,7 @@ import (
) )
type Manager struct { type Manager struct {
mu sync.Mutex
Cgroups *configs.Cgroup Cgroups *configs.Cgroup
Paths map[string]string Paths map[string]string
} }
@ -253,11 +254,20 @@ func (m *Manager) Apply(pid int) error {
} }
func (m *Manager) Destroy() error { func (m *Manager) Destroy() error {
return cgroups.RemovePaths(m.Paths) m.mu.Lock()
defer m.mu.Unlock()
if err := cgroups.RemovePaths(m.Paths); err != nil {
return err
}
m.Paths = make(map[string]string)
return nil
} }
func (m *Manager) GetPaths() map[string]string { func (m *Manager) GetPaths() map[string]string {
return m.Paths m.mu.Lock()
paths := m.Paths
m.mu.Unlock()
return paths
} }
func writeFile(dir, file, data string) error { func writeFile(dir, file, data string) error {
@ -391,6 +401,8 @@ func (m *Manager) GetPids() ([]int, error) {
} }
func (m *Manager) GetStats() (*cgroups.Stats, error) { func (m *Manager) GetStats() (*cgroups.Stats, error) {
m.mu.Lock()
defer m.mu.Unlock()
stats := cgroups.NewStats() stats := cgroups.NewStats()
for name, path := range m.Paths { for name, path := range m.Paths {
sys, ok := subsystems[name] sys, ok := subsystems[name]