summaryrefslogtreecommitdiff
path: root/src/mongo/db/stats/timer_stats.h
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2013-01-09 12:54:36 -0500
committerEliot Horowitz <eliot@10gen.com>2013-01-09 12:54:36 -0500
commit27637ed300e7e9af9b6998e73fce13f96b195a30 (patch)
tree9ab4f04126a36f6493fdb9b4cca29eefb2528580 /src/mongo/db/stats/timer_stats.h
parent0f1d143bf508de6e5735e1d984f5edb772f8ae4c (diff)
downloadmongo-27637ed300e7e9af9b6998e73fce13f96b195a30.tar.gz
SERVER-8119: add TimerStats class for collecting timing information
Diffstat (limited to 'src/mongo/db/stats/timer_stats.h')
-rw-r--r--src/mongo/db/stats/timer_stats.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/mongo/db/stats/timer_stats.h b/src/mongo/db/stats/timer_stats.h
new file mode 100644
index 00000000000..13b814f89f9
--- /dev/null
+++ b/src/mongo/db/stats/timer_stats.h
@@ -0,0 +1,76 @@
+// timer_stats.h
+
+/* Copyright 2012 10gen Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "mongo/db/jsobj.h"
+#include "mongo/util/concurrency/spin_lock.h"
+#include "mongo/util/timer.h"
+
+namespace mongo {
+
+
+ /**
+ * Holds timing information in milliseconds
+ * keeps track of number of times and total milliseconds
+ * so a diff can be computed
+ */
+ class TimerStats {
+ public:
+ void recordMillis( int millis );
+
+ /**
+ * @return number of millis
+ */
+ int record( const Timer& timer );
+
+ BSONObj getReport() const;
+ operator BSONObj() const { return getReport(); }
+
+ private:
+ mutable SpinLock _lock;
+ long long _num;
+ long long _totalMillis;
+ };
+
+ /**
+ * Holds an instance of a Timer such that we the time is recorded
+ * when the TimerHolder goes out of scope
+ */
+ class TimerHolder {
+ public:
+ TimerHolder( TimerStats* stats );
+ ~TimerHolder();
+
+ /**
+ * returns elapsed millis from internal timer
+ */
+ int millis() const { return _t.millis(); }
+
+
+ /**
+ * records the time in the TimerStats and marks that we've
+ * already recorded so the destructor doesn't
+ */
+ int recordMillis();
+
+ private:
+ TimerStats* _stats;
+ bool _recorded;
+ Timer _t;
+ };
+}