github.com/Schaudge/grailbase@v0.0.0-20240223061707-44c758a471c0/vcontext/vcontext.go (about)

     1  // Copyright 2018 GRAIL, Inc. All rights reserved.
     2  // Use of this source code is governed by the Apache-2.0
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package vcontext creates a singleton vanadium Context object.
     6  package vcontext
     7  
     8  import (
     9  	"sync"
    10  
    11  	"github.com/Schaudge/grailbase/backgroundcontext"
    12  	"github.com/Schaudge/grailbase/shutdown"
    13  	_ "github.com/grailbio/v23/factories/grail" // Needed to initialize v23
    14  	v23 "v.io/v23"
    15  	"v.io/v23/context"
    16  	"v.io/x/ref/runtime/factories/library"
    17  )
    18  
    19  var (
    20  	once = sync.Once{}
    21  	ctx  *context.T
    22  )
    23  
    24  func init() {
    25  	library.AllowMultipleInitializations = true
    26  }
    27  
    28  // Background returns the singleton Vanadium context for v23. It initializes v23
    29  // on the first call.  GRAIL applications should always use this function to
    30  // initialize and create a context instead of calling v23.Init() manually.
    31  //
    32  // Caution: this function is depended on by many services, specifically the
    33  // production pipeline controller. Be extremely careful when changing it.
    34  func Background() *context.T {
    35  	once.Do(func() {
    36  		var done v23.Shutdown
    37  		ctx, done = v23.Init()
    38  		shutdown.Register(shutdown.Func(done))
    39  		backgroundcontext.Set(ctx)
    40  	})
    41  	return ctx
    42  }