Files
tasks/common/goro/group.go
Alex ShtinandGitHub 8e8f1b0f7c Remove license header from every file (#7689)
## What changed?
<!-- Describe what has changed in this PR -->
Remove license header from every file. Because it is really hard to
follow in this PR here is the summary:
1. License header is removed from all `.go` and `.proto` files
:fireworks::fireworks:🎆.
2. `LICENSE` file in the root directory has only Temporal and Uber
copyrights.
3. 5 other `LICENSE` files added to the packages which have copyrights
different from Temporal and Uber: Datadog, Xargin, "Mat Ryer, Tyler
Bunnell and contributors".
4. `license_file` flag is removed from all code generation tools.
5. `copyright_file` flag is removed from `go:generate mockgen`
directive.
6. All copyright related targets are removed from `Makefile`.
7. Updated Temporal copyright year to 2025 everywhere.

## Why?
<!-- Tell your future self why have you made these changes -->
I double checked with legal department that it is not needed to have
license header in every file. One file per repo is enough. I put all
copyrights to the root `LICENSE` file and removed header from all other
files. Also updated tools and `Makefile`.
2025-05-01 18:50:21 -07:00

55 lines
1.7 KiB
Go

package goro
import (
"context"
"sync"
)
// Group manages a set of long-running goroutines. Goroutines are spawned
// individually with Group.Go and after that interrupted and waited-on as a
// single unit. The expected use-case for this type is as a member field of a
// background process type that spawns one or more goroutines in its Start()
// function and then stops those same goroutines in its Stop() function.
// The zero-value of this type is valid. A Group must not be copied after
// first use.
type Group struct {
initOnce sync.Once
ctx context.Context
cancel context.CancelFunc
wg sync.WaitGroup
}
// Go spawns a goroutine whose lifecycle will be managed via this Group object.
// All functions passed to Go on the same instance of Group will be given the
// same `context.Context` object, which will be used to indicate cancellation.
// If the supplied func does not abide by `ctx.Done()` of the provided
// `context.Context` then `Wait()` on this `Group` will hang until all functions
// exit on their own (possibly never).
// NOTE: Errors returned by the supplied function are ignored.
func (g *Group) Go(f func(ctx context.Context) error) {
g.initOnce.Do(g.init)
g.wg.Add(1)
go func() {
defer g.wg.Done()
_ = f(g.ctx)
}()
}
// Cancel cancels the `context.Context` that was passed to all goroutines
// spawned via `Go` on this `Group`.
func (g *Group) Cancel() {
g.initOnce.Do(g.init)
g.cancel()
}
// Wait blocks waiting for all goroutines spawned via `Go` on this `Group`
// instance to complete. If `Go` has not been called then this function returns
// immediately.
func (g *Group) Wait() {
g.wg.Wait()
}
func (g *Group) init() {
g.ctx, g.cancel = context.WithCancel(context.Background())
}