| Index: go/src/infra/gae/libs/gae/filters/count/tq.go
 | 
| diff --git a/go/src/infra/gae/libs/gae/filters/count/tq.go b/go/src/infra/gae/libs/gae/filters/count/tq.go
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..eee25b42179bc0c37f299f9e8767b964ea5ed882
 | 
| --- /dev/null
 | 
| +++ b/go/src/infra/gae/libs/gae/filters/count/tq.go
 | 
| @@ -0,0 +1,81 @@
 | 
| +// 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 count
 | 
| +
 | 
| +import (
 | 
| +	"golang.org/x/net/context"
 | 
| +
 | 
| +	"infra/gae/libs/gae"
 | 
| +)
 | 
| +
 | 
| +// TQCounter is the counter object for the TaskQueue service.
 | 
| +type TQCounter struct {
 | 
| +	Add         Entry
 | 
| +	Delete      Entry
 | 
| +	AddMulti    Entry
 | 
| +	DeleteMulti Entry
 | 
| +	Lease       Entry
 | 
| +	LeaseByTag  Entry
 | 
| +	ModifyLease Entry
 | 
| +	Purge       Entry
 | 
| +	QueueStats  Entry
 | 
| +}
 | 
| +
 | 
| +type tqCounter struct {
 | 
| +	c *TQCounter
 | 
| +
 | 
| +	tq gae.TaskQueue
 | 
| +}
 | 
| +
 | 
| +var _ gae.TaskQueue = (*tqCounter)(nil)
 | 
| +
 | 
| +func (t *tqCounter) Add(task *gae.TQTask, queueName string) (*gae.TQTask, error) {
 | 
| +	ret, err := t.tq.Add(task, queueName)
 | 
| +	return ret, t.c.Add.up(err)
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) Delete(task *gae.TQTask, queueName string) error {
 | 
| +	return t.c.Delete.up(t.tq.Delete(task, queueName))
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) AddMulti(tasks []*gae.TQTask, queueName string) ([]*gae.TQTask, error) {
 | 
| +	ret, err := t.tq.AddMulti(tasks, queueName)
 | 
| +	return ret, t.c.AddMulti.up(err)
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) DeleteMulti(tasks []*gae.TQTask, queueName string) error {
 | 
| +	return t.c.DeleteMulti.up(t.tq.DeleteMulti(tasks, queueName))
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) Lease(maxTasks int, queueName string, leaseTime int) ([]*gae.TQTask, error) {
 | 
| +	ret, err := t.tq.Lease(maxTasks, queueName, leaseTime)
 | 
| +	return ret, t.c.Lease.up(err)
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) LeaseByTag(maxTasks int, queueName string, leaseTime int, tag string) ([]*gae.TQTask, error) {
 | 
| +	ret, err := t.tq.LeaseByTag(maxTasks, queueName, leaseTime, tag)
 | 
| +	return ret, t.c.LeaseByTag.up(err)
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) ModifyLease(task *gae.TQTask, queueName string, leaseTime int) error {
 | 
| +	return t.c.ModifyLease.up(t.tq.ModifyLease(task, queueName, leaseTime))
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) Purge(queueName string) error {
 | 
| +	return t.c.Purge.up(t.tq.Purge(queueName))
 | 
| +}
 | 
| +
 | 
| +func (t *tqCounter) QueueStats(queueNames []string) ([]gae.TQStatistics, error) {
 | 
| +	ret, err := t.tq.QueueStats(queueNames)
 | 
| +	return ret, t.c.QueueStats.up(err)
 | 
| +}
 | 
| +
 | 
| +// FilterTQ installs a counter TaskQueue filter in the context.
 | 
| +func FilterTQ(c context.Context) (context.Context, *TQCounter) {
 | 
| +	state := &TQCounter{}
 | 
| +	return gae.AddTQFilters(c, func(ic context.Context, tq gae.TaskQueue) gae.TaskQueue {
 | 
| +		return &tqCounter{state, tq}
 | 
| +	}), state
 | 
| +}
 | 
| 
 |