// Copyright (c) 2019 The Jaeger Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package jaeger import "sync" // SpanAllocator abstraction of managign span allocations type SpanAllocator interface { Get() *Span Put(*Span) } type syncPollSpanAllocator struct { spanPool sync.Pool } func newSyncPollSpanAllocator() SpanAllocator { return &syncPollSpanAllocator{ spanPool: sync.Pool{New: func() interface{} { return &Span{} }}, } } func (pool *syncPollSpanAllocator) Get() *Span { return pool.spanPool.Get().(*Span) } func (pool *syncPollSpanAllocator) Put(span *Span) { span.reset() pool.spanPool.Put(span) } type simpleSpanAllocator struct{} func (pool simpleSpanAllocator) Get() *Span { return &Span{} } func (pool simpleSpanAllocator) Put(span *Span) { // @comment https://github.com/jaegertracing/jaeger-client-go/pull/381#issuecomment-475904351 // since finished spans are not reused, no need to reset them // span.reset() }