summaryrefslogtreecommitdiffstats
path: root/modules/process/process.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2021-11-30 20:06:32 +0000
committerGitHub <noreply@github.com>2021-11-30 20:06:32 +0000
commit01087e9eef21ff5ea1cebbb1e84933954671fdf2 (patch)
treeae618785a3bd46e012096683e2fd2309f87c571d /modules/process/process.go
parentd894c90b703ce215e2319ae2e2bf95989f77805d (diff)
downloadgitea-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.go66
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
+ }
+ }
+}