summaryrefslogtreecommitdiff
path: root/src/mongo/db/stats/counters.cpp
diff options
context:
space:
mode:
authorJani Monoses <jani@ubuntu.com>2012-04-03 20:23:57 +0300
committerEric Milkie <milkie@10gen.com>2012-04-04 15:37:26 -0400
commit78d16e4666691fcd9dcc6c1cac0b5f8ebd2ea533 (patch)
tree2bf35128755d14461993f01d6a3859fabe57baba /src/mongo/db/stats/counters.cpp
parent8bbd9f1eff6691968cad5a45469da0293a9f43e8 (diff)
downloadmongo-78d16e4666691fcd9dcc6c1cac0b5f8ebd2ea533.tar.gz
Make sure OpCounters are always naturally aligned.
Make OpCounters class variables and not pointers to values inside a permanent BSON object. Create BSON objects out of them only when required by getObj(). This way the atomic counters are always naturally aligned and do not cause alignment traps on ARM. Signed-off-by: Eric Milkie <milkie@10gen.com>
Diffstat (limited to 'src/mongo/db/stats/counters.cpp')
-rw-r--r--src/mongo/db/stats/counters.cpp58
1 files changed, 24 insertions, 34 deletions
diff --git a/src/mongo/db/stats/counters.cpp b/src/mongo/db/stats/counters.cpp
index 889e8a86c4c..e04efd49ede 100644
--- a/src/mongo/db/stats/counters.cpp
+++ b/src/mongo/db/stats/counters.cpp
@@ -21,26 +21,7 @@
#include "counters.h"
namespace mongo {
-
- OpCounters::OpCounters() {
- int zero = 0;
-
- BSONObjBuilder b;
- b.append( "insert" , zero );
- b.append( "query" , zero );
- b.append( "update" , zero );
- b.append( "delete" , zero );
- b.append( "getmore" , zero );
- b.append( "command" , zero );
- _obj = b.obj();
-
- _insert = (AtomicUInt*)_obj["insert"].value();
- _query = (AtomicUInt*)_obj["query"].value();
- _update = (AtomicUInt*)_obj["update"].value();
- _delete = (AtomicUInt*)_obj["delete"].value();
- _getmore = (AtomicUInt*)_obj["getmore"].value();
- _command = (AtomicUInt*)_obj["command"].value();
- }
+ OpCounters::OpCounters() {}
void OpCounters::gotOp( int op , bool isCommand ) {
switch ( op ) {
@@ -63,28 +44,37 @@ namespace mongo {
}
}
- BSONObj& OpCounters::getObj() {
+ BSONObj OpCounters::getObj() {
const unsigned MAX = 1 << 30;
RARELY {
bool wrap =
- _insert->get() > MAX ||
- _query->get() > MAX ||
- _update->get() > MAX ||
- _delete->get() > MAX ||
- _getmore->get() > MAX ||
- _command->get() > MAX;
+ _insert.get() > MAX ||
+ _query.get() > MAX ||
+ _update.get() > MAX ||
+ _delete.get() > MAX ||
+ _getmore.get() > MAX ||
+ _command.get() > MAX;
if ( wrap ) {
- _insert->zero();
- _query->zero();
- _update->zero();
- _delete->zero();
- _getmore->zero();
- _command->zero();
+ _insert.zero();
+ _query.zero();
+ _update.zero();
+ _delete.zero();
+ _getmore.zero();
+ _command.zero();
}
}
- return _obj;
+ BSONObjBuilder b;
+ {
+ b.append( "insert" , _insert.get() );
+ b.append( "query" , _query.get() );
+ b.append( "update" , _update.get() );
+ b.append( "delete" , _delete.get() );
+ b.append( "getmore" , _getmore.get() );
+ b.append( "command" , _command.get() );
+ }
+ return b.obj();
}
IndexCounters::IndexCounters() {