mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 04:14:01 +01:00 
			
		
		
		
	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>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |