mirror of
https://github.com/golang/go
synced 2024-11-06 03:16:10 -07:00
224c947ce5
This separates the concerns of tag collections that have to be iterated and tag collections that need lookup by key. Also make it so that events just carry a plain slice of tags. We pass a TagMap down through the exporters and allow it to be extended on the way. We no longer need the event.Query method (or the event type) We now exclusivley use Key as the identity, and no longer have a common core implementation but just implement it directly in each type. This removes some confusion that was causing the same key through different paths to end up with a different identity. Change-Id: I61e47adcb397f4ca83dd90342b021dd8e9571ed3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/224278 Run-TryBot: Ian Cottrell <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package event
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
"unsafe"
|
|
)
|
|
|
|
// Exporter is a function that handles events.
|
|
// It may return a modified context and event.
|
|
type Exporter func(context.Context, Event, TagMap) context.Context
|
|
|
|
var (
|
|
exporter unsafe.Pointer
|
|
)
|
|
|
|
// SetExporter sets the global exporter function that handles all events.
|
|
// The exporter is called synchronously from the event call site, so it should
|
|
// return quickly so as not to hold up user code.
|
|
func SetExporter(e Exporter) {
|
|
p := unsafe.Pointer(&e)
|
|
if e == nil {
|
|
// &e is always valid, and so p is always valid, but for the early abort
|
|
// of ProcessEvent to be efficient it needs to make the nil check on the
|
|
// pointer without having to dereference it, so we make the nil function
|
|
// also a nil pointer
|
|
p = nil
|
|
}
|
|
atomic.StorePointer(&exporter, p)
|
|
}
|
|
|
|
// ProcessEvent is called to deliver an event to the global exporter.
|
|
func ProcessEvent(ctx context.Context, ev Event) context.Context {
|
|
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
|
if exporterPtr == nil {
|
|
return ctx
|
|
}
|
|
// and now also hand the event of to the current exporter
|
|
return (*exporterPtr)(ctx, ev, ev.Map())
|
|
}
|