mirror of
https://github.com/safing/portmaster
synced 2025-09-01 10:09:11 +00:00
69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package process
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/Safing/portbase/database"
|
|
"github.com/tevino/abool"
|
|
)
|
|
|
|
var (
|
|
processes = make(map[int]*Process)
|
|
processesLock sync.RWMutex
|
|
|
|
dbController *database.Controller
|
|
dbControllerFlag = abool.NewBool(false)
|
|
)
|
|
|
|
func makeProcessKey(pid int) string {
|
|
return fmt.Sprintf("network:tree/%d", pid)
|
|
}
|
|
|
|
// GetProcessFromStorage returns a process from the internal storage.
|
|
func GetProcessFromStorage(pid int) (*Process, bool) {
|
|
processesLock.RLock()
|
|
defer processesLock.RUnlock()
|
|
|
|
p, ok := processes[pid]
|
|
return p, ok
|
|
}
|
|
|
|
// All returns a copy of all process objects.
|
|
func All() []*Process {
|
|
processesLock.RLock()
|
|
defer processesLock.RUnlock()
|
|
|
|
all := make([]*Process, 0, len(processes))
|
|
for _, proc := range processes {
|
|
all = append(all, proc)
|
|
}
|
|
|
|
return all
|
|
}
|
|
|
|
// Save saves the process to the internal state and pushes an update.
|
|
func (p *Process) Save() {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
if p.DatabaseKey() == "" {
|
|
p.SetKey(makeProcessKey(p.Pid))
|
|
p.CreateMeta()
|
|
|
|
processesLock.Lock()
|
|
defer processesLock.Unlock()
|
|
|
|
processes[p.Pid] = p
|
|
}
|
|
|
|
if dbControllerFlag.IsSet() {
|
|
dbController.PushUpdate(p)
|
|
}
|
|
}
|
|
|
|
// SetDBController sets the database controller and allows the package to push database updates on a save. It must be set by the package that registers the "network" database.
|
|
func SetDBController(controller *database.Controller) {
|
|
dbController = controller
|
|
dbControllerFlag.Set()
|
|
}
|