github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/protected_context.go (about) 1 // Copyright 2017 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libkbfs 6 7 import ( 8 "sync" 9 10 "github.com/keybase/client/go/logger" 11 "golang.org/x/net/context" 12 ) 13 14 type defaultContextReplacer struct{} // nolint 15 16 func (defaultContextReplacer) maybeReplaceContext(context.Context) {} 17 18 // protectedContext is a construct that helps avoid unwanted change of context 19 // when the context needs to be stored. 20 type protectedContext struct { 21 mu sync.RWMutex 22 ctx context.Context 23 log logger.Logger 24 25 // defaultContextReplacer is embeded here as a helper that includes a no-op 26 // maybeReplaceContext, so that we can "override" the method in tests. 27 defaultContextReplacer // nolint 28 } 29 30 func newProtectedContext( 31 ctx context.Context, log logger.Logger) *protectedContext { 32 return &protectedContext{ctx: ctx, log: log} 33 } 34 35 func (c *protectedContext) setLogger(log logger.Logger) { 36 c.mu.Lock() 37 defer c.mu.Unlock() 38 c.log = log 39 } 40 41 // context returns the context stored in the protectedContext. 42 func (c *protectedContext) context() context.Context { 43 c.mu.RLock() 44 defer c.mu.RUnlock() 45 return c.ctx 46 }