| Index: go/src/infra/gae/libs/wrapper/unsafe/memcache.go
|
| diff --git a/go/src/infra/gae/libs/wrapper/unsafe/memcache.go b/go/src/infra/gae/libs/wrapper/unsafe/memcache.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..db7ad3b6f79f82c16e814e311fe9a31334d29865
|
| --- /dev/null
|
| +++ b/go/src/infra/gae/libs/wrapper/unsafe/memcache.go
|
| @@ -0,0 +1,58 @@
|
| +// 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 unsafe
|
| +
|
| +import (
|
| + "time"
|
| +
|
| + "unsafe"
|
| +
|
| + "appengine/memcache"
|
| +)
|
| +
|
| +// Item is duplicated from appengine/memcache.
|
| +type Item struct {
|
| + Key string
|
| + Value []byte
|
| + Object interface{}
|
| + Flags uint32
|
| + Expiration time.Duration
|
| + CasID uint64
|
| +}
|
| +
|
| +func init() {
|
| + // we can't actually refer to casID by name, but we can refer to everything
|
| + // else, and ensure that everything lines up. This should catch an api change,
|
| + // but wouldn't catch something like uint64 -> int64.
|
| + if unsafe.Sizeof(memcache.Item{}) != unsafe.Sizeof(Item{}) {
|
| + panic("memcache.Item and Item mismatch sizes")
|
| + }
|
| + if unsafe.Offsetof(memcache.Item{}.Key) != unsafe.Offsetof(Item{}.Key) {
|
| + panic("memcache.Item and Item mismatch Key")
|
| + }
|
| + if unsafe.Offsetof(memcache.Item{}.Value) != unsafe.Offsetof(Item{}.Value) {
|
| + panic("memcache.Item and Item mismatch Value")
|
| + }
|
| + if unsafe.Offsetof(memcache.Item{}.Object) != unsafe.Offsetof(Item{}.Object) {
|
| + panic("memcache.Item and Item mismatch Object")
|
| + }
|
| + if unsafe.Offsetof(memcache.Item{}.Flags) != unsafe.Offsetof(Item{}.Flags) {
|
| + panic("memcache.Item and Item mismatch Flags")
|
| + }
|
| + if unsafe.Offsetof(memcache.Item{}.Expiration) != unsafe.Offsetof(Item{}.Expiration) {
|
| + panic("memcache.Item and Item mismatch Expiration")
|
| + }
|
| +}
|
| +
|
| +// MCSetCasID sets the private .casID field of memcache.Item.
|
| +func MCSetCasID(i *memcache.Item, val uint64) {
|
| + mci := (*Item)(unsafe.Pointer(i))
|
| + mci.CasID = val
|
| +}
|
| +
|
| +// MCGetCasID retrieves the private .casID field of memcache.Item.
|
| +func MCGetCasID(i *memcache.Item) uint64 {
|
| + return (*Item)(unsafe.Pointer(i)).CasID
|
| +}
|
|
|