diff options
author | zeripath <art27@cantab.net> | 2021-11-30 20:06:32 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-30 20:06:32 +0000 |
commit | 01087e9eef21ff5ea1cebbb1e84933954671fdf2 (patch) | |
tree | ae618785a3bd46e012096683e2fd2309f87c571d /modules/process/process.go | |
parent | d894c90b703ce215e2319ae2e2bf95989f77805d (diff) | |
download | gitea-01087e9eef21ff5ea1cebbb1e84933954671fdf2.tar.gz gitea-01087e9eef21ff5ea1cebbb1e84933954671fdf2.zip |
Make Requests Processes and create process hierarchy. Associate OpenRepository with context. (#17125)
This PR registers requests with the process manager and manages hierarchy within the processes.
Git repos are then associated with a context, (usually the request's context) - with sub commands using this context as their base context.
Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'modules/process/process.go')
-rw-r--r-- | modules/process/process.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/modules/process/process.go b/modules/process/process.go new file mode 100644 index 0000000000..662f878d7f --- /dev/null +++ b/modules/process/process.go @@ -0,0 +1,66 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package process + +import ( + "context" + "sync" + "time" +) + +// Process represents a working process inheriting from Gitea. +type Process struct { + PID IDType // Process ID, not system one. + ParentPID IDType + Description string + Start time.Time + Cancel context.CancelFunc + + lock sync.Mutex + children []*Process +} + +// Children gets the children of the process +// Note: this function will behave nicely even if p is nil +func (p *Process) Children() (children []*Process) { + if p == nil { + return + } + + p.lock.Lock() + defer p.lock.Unlock() + children = make([]*Process, len(p.children)) + copy(children, p.children) + return children +} + +// AddChild adds a child process +// Note: this function will behave nicely even if p is nil +func (p *Process) AddChild(child *Process) { + if p == nil { + return + } + + p.lock.Lock() + defer p.lock.Unlock() + p.children = append(p.children, child) +} + +// RemoveChild removes a child process +// Note: this function will behave nicely even if p is nil +func (p *Process) RemoveChild(process *Process) { + if p == nil { + return + } + + p.lock.Lock() + defer p.lock.Unlock() + for i, child := range p.children { + if child == process { + p.children = append(p.children[:i], p.children[i+1:]...) + return + } + } +} |