| Index: go/src/infra/gae/libs/wrapper/memory/context.go | 
| diff --git a/go/src/infra/gae/libs/wrapper/memory/context.go b/go/src/infra/gae/libs/wrapper/memory/context.go | 
| deleted file mode 100644 | 
| index b6607fcc4d0231f8b23874083be039c09a157545..0000000000000000000000000000000000000000 | 
| --- a/go/src/infra/gae/libs/wrapper/memory/context.go | 
| +++ /dev/null | 
| @@ -1,168 +0,0 @@ | 
| -// 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 ( | 
| -	"errors" | 
| -	"sync" | 
| - | 
| -	"golang.org/x/net/context" | 
| - | 
| -	"appengine/datastore" | 
| -) | 
| - | 
| -type memContextObj interface { | 
| -	sync.Locker | 
| -	canApplyTxn(m memContextObj) bool | 
| -	applyTxn(c context.Context, m memContextObj) | 
| - | 
| -	endTxn() | 
| -	mkTxn(*datastore.TransactionOptions) (memContextObj, error) | 
| -} | 
| - | 
| -type memContext []memContextObj | 
| - | 
| -var _ = memContextObj((memContext)(nil)) | 
| - | 
| -func newMemContext() memContext { | 
| -	return memContext{ | 
| -		newTaskQueueData(), | 
| -		newDataStoreData(), | 
| -	} | 
| -} | 
| - | 
| -type memContextIdx int | 
| - | 
| -const ( | 
| -	memContextTQIdx memContextIdx = iota | 
| -	memContextDSIdx | 
| -) | 
| - | 
| -func (m memContext) Get(itm memContextIdx) memContextObj { | 
| -	return m[itm] | 
| -} | 
| - | 
| -func (m memContext) Lock() { | 
| -	for _, itm := range m { | 
| -		itm.Lock() | 
| -	} | 
| -} | 
| - | 
| -func (m memContext) Unlock() { | 
| -	for i := len(m) - 1; i >= 0; i-- { | 
| -		m[i].Unlock() | 
| -	} | 
| -} | 
| - | 
| -func (m memContext) endTxn() { | 
| -	for _, itm := range m { | 
| -		itm.endTxn() | 
| -	} | 
| -} | 
| - | 
| -func (m memContext) mkTxn(o *datastore.TransactionOptions) (memContextObj, error) { | 
| -	ret := make(memContext, len(m)) | 
| -	for i, itm := range m { | 
| -		newItm, err := itm.mkTxn(o) | 
| -		if err != nil { | 
| -			return nil, err | 
| -		} | 
| -		ret[i] = newItm | 
| -	} | 
| -	return ret, nil | 
| -} | 
| - | 
| -func (m memContext) canApplyTxn(txnCtxObj memContextObj) bool { | 
| -	txnCtx := txnCtxObj.(memContext) | 
| -	for i := range m { | 
| -		if !m[i].canApplyTxn(txnCtx[i]) { | 
| -			return false | 
| -		} | 
| -	} | 
| -	return true | 
| -} | 
| - | 
| -func (m memContext) applyTxn(c context.Context, txnCtxObj memContextObj) { | 
| -	txnCtx := txnCtxObj.(memContext) | 
| -	for i := range m { | 
| -		m[i].applyTxn(c, txnCtx[i]) | 
| -	} | 
| -} | 
| - | 
| -// Use adds implementations for the following gae/wrapper interfaces to the | 
| -// context: | 
| -//   * wrapper.Datastore | 
| -//   * wrapper.TaskQueue | 
| -//   * wrapper.Memcache | 
| -//   * wrapper.GlobalInfo | 
| -// | 
| -// These can be retrieved with the "gae/wrapper".Get functions. | 
| -// | 
| -// The implementations are all backed by an in-memory implementation, and start | 
| -// with an empty state. | 
| -// | 
| -// Using this more than once per context.Context will cause a panic. | 
| -func Use(c context.Context) context.Context { | 
| -	if c.Value(memContextKey) != nil { | 
| -		panic(errors.New("memory.Use: called twice on the same Context")) | 
| -	} | 
| -	c = context.WithValue( | 
| -		context.WithValue(c, memContextKey, newMemContext()), | 
| -		giContextKey, &globalInfoData{}) | 
| -	return useTQ(useDS(useMC(useGI(c)))) | 
| -} | 
| - | 
| -func cur(c context.Context) (p memContext) { | 
| -	p, _ = c.Value(memContextKey).(memContext) | 
| -	return | 
| -} | 
| - | 
| -type memContextKeyType int | 
| - | 
| -var memContextKey memContextKeyType | 
| - | 
| -// weird stuff | 
| - | 
| -// RunInTransaction is here because it's really a service-wide transaction, not | 
| -// just in the datastore. TaskQueue behaves differently in a transaction in | 
| -// a couple ways, for example. | 
| -// | 
| -// It really should have been appengine.Context.RunInTransaction(func(tc...)), | 
| -// but because it's not, this method is on dsImpl instead to mirror the official | 
| -// API. | 
| -// | 
| -// The fake implementation also differs from the real implementation because the | 
| -// fake TaskQueue is NOT backed by the fake Datastore. This is done to make the | 
| -// test-access API for TaskQueue better (instead of trying to reconstitute the | 
| -// state of the task queue from a bunch of datastore accesses). | 
| -func (d *dsImpl) RunInTransaction(f func(context.Context) error, o *datastore.TransactionOptions) error { | 
| -	curMC := cur(d.c) | 
| - | 
| -	txnMC, err := curMC.mkTxn(o) | 
| -	if err != nil { | 
| -		return err | 
| -	} | 
| - | 
| -	defer func() { | 
| -		txnMC.Lock() | 
| -		defer txnMC.Unlock() | 
| - | 
| -		txnMC.endTxn() | 
| -	}() | 
| - | 
| -	if err = f(context.WithValue(d.c, memContextKey, txnMC)); err != nil { | 
| -		return err | 
| -	} | 
| - | 
| -	txnMC.Lock() | 
| -	defer txnMC.Unlock() | 
| - | 
| -	if curMC.canApplyTxn(txnMC) { | 
| -		curMC.applyTxn(d.c, txnMC) | 
| -	} else { | 
| -		return datastore.ErrConcurrentTransaction | 
| -	} | 
| -	return nil | 
| -} | 
|  |