diff options
author | Jani Monoses <jani@ubuntu.com> | 2012-04-03 20:23:57 +0300 |
---|---|---|
committer | Eric Milkie <milkie@10gen.com> | 2012-04-04 15:37:26 -0400 |
commit | 78d16e4666691fcd9dcc6c1cac0b5f8ebd2ea533 (patch) | |
tree | 2bf35128755d14461993f01d6a3859fabe57baba /src/mongo/db/stats/counters.cpp | |
parent | 8bbd9f1eff6691968cad5a45469da0293a9f43e8 (diff) | |
download | mongo-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.cpp | 58 |
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() { |