Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Unified Diff: go/src/infra/gae/libs/wrapper/memory/context.go

Issue 1240573002: Reland: Refactor current GAE abstraction library to be free of the SDK* (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: expand coverage range to fit 32bit test expectations Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
-}
« no previous file with comments | « go/src/infra/gae/libs/wrapper/memory/binutils_test.go ('k') | go/src/infra/gae/libs/wrapper/memory/datastore.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698