| Index: go/src/infra/gae/libs/wrapper/memory/globalinfo.go
 | 
| diff --git a/go/src/infra/gae/libs/wrapper/memory/globalinfo.go b/go/src/infra/gae/libs/wrapper/memory/globalinfo.go
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..951c3c4e69c02aab4c776fb155d49381aad1523c
 | 
| --- /dev/null
 | 
| +++ b/go/src/infra/gae/libs/wrapper/memory/globalinfo.go
 | 
| @@ -0,0 +1,39 @@
 | 
| +// Copyright 2015 The Chromium 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 memory
 | 
| +
 | 
| +import (
 | 
| +	"infra/gae/libs/wrapper"
 | 
| +
 | 
| +	"golang.org/x/net/context"
 | 
| +)
 | 
| +
 | 
| +type giContextKeyType int
 | 
| +
 | 
| +var giContextKey giContextKeyType
 | 
| +
 | 
| +func curGID(c context.Context) *globalInfoData {
 | 
| +	return c.Value(giContextKey).(*globalInfoData)
 | 
| +}
 | 
| +
 | 
| +// UseGI adds a wrapper.GlobalInfo context, accessible
 | 
| +// by wrapper.GetGI(c)
 | 
| +func UseGI(c context.Context) context.Context {
 | 
| +	return wrapper.SetGIFactory(c, func(ic context.Context) wrapper.GlobalInfo {
 | 
| +		return &giImpl{wrapper.DummyGI(), curGID(ic), ic}
 | 
| +	})
 | 
| +}
 | 
| +
 | 
| +type globalInfoData struct{ namespace string }
 | 
| +
 | 
| +type giImpl struct {
 | 
| +	wrapper.GlobalInfo
 | 
| +	data *globalInfoData
 | 
| +	c    context.Context
 | 
| +}
 | 
| +
 | 
| +func (gi *giImpl) Namespace(ns string) (context.Context, error) {
 | 
| +	return context.WithValue(gi.c, giContextKey, &globalInfoData{ns}), nil
 | 
| +}
 | 
| 
 |