diff options
| author | M. J. Fromberger <fromberger@tailscale.com> | 2025-09-19 12:34:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-19 12:34:06 -0700 |
| commit | ca9d79500615082dc46fffc4b1d93ad66fa6b8eb (patch) | |
| tree | 19bee94ec5b8e219b2a76d19530590c26db1b501 /control/controlhttp/controlhttpserver | |
| parent | 009d702adfa0fca9f0319f6767f6a3259e484092 (diff) | |
| download | tailscale-ca9d79500615082dc46fffc4b1d93ad66fa6b8eb.tar.xz tailscale-ca9d79500615082dc46fffc4b1d93ad66fa6b8eb.zip | |
util/eventbus: add a Monitor type to manage subscriber goroutines (#17127)
A common pattern in event bus usage is to run a goroutine to service a
collection of subscribers on a single bus client. To have an orderly shutdown,
however, we need a way to wait for such a goroutine to be finished.
This commit adds a Monitor type that makes this pattern easier to wire up:
rather than having to track all the subscribers and an extra channel, the
component need only track the client and the monitor. For example:
cli := bus.Client("example")
m := cli.Monitor(func(c *eventbus.Client) {
s1 := eventbus.Subscribe[T](cli)
s2 := eventbus.Subscribe[U](cli)
for {
select {
case <-c.Done():
return
case t := <-s1.Events():
processT(t)
case u := <-s2.Events():
processU(u)
}
}
})
To shut down the client and wait for the goroutine, the caller can write:
m.Close()
which closes cli and waits for the goroutine to finish. Or, separately:
cli.Close()
// do other stuff
m.Wait()
While the goroutine management is not explicitly tied to subscriptions, it is a
common enough pattern that this seems like a useful simplification in use.
Updates #15160
Change-Id: I657afda1cfaf03465a9dce1336e9fd518a968bca
Signed-off-by: M. J. Fromberger <fromberger@tailscale.com>
Diffstat (limited to 'control/controlhttp/controlhttpserver')
0 files changed, 0 insertions, 0 deletions
