summaryrefslogtreecommitdiff
path: root/src/mongo/util/trace.cpp
diff options
context:
space:
mode:
authorU-tellus\cwestin <cwestin@10gen.com>2012-02-14 13:49:53 -0800
committerU-tellus\cwestin <cwestin@10gen.com>2012-02-14 18:03:03 -0800
commitc4bf7b30c13a5175752f9296dd8a2bbfad6a8242 (patch)
treea0c166018220422e26bf7017229670b242e58ac2 /src/mongo/util/trace.cpp
parent59e9b72297906e68686c1ffeb2244736ecac945b (diff)
downloadmongo-c4bf7b30c13a5175752f9296dd8a2bbfad6a8242.tar.gz
checkpoint work for SERVER-4644
Diffstat (limited to 'src/mongo/util/trace.cpp')
-rwxr-xr-xsrc/mongo/util/trace.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/mongo/util/trace.cpp b/src/mongo/util/trace.cpp
new file mode 100755
index 00000000000..db81952e9eb
--- /dev/null
+++ b/src/mongo/util/trace.cpp
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2012 10gen Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "util/trace.h"
+
+namespace mongo {
+
+ /* the singleton static instance of this object */
+ Trace::NameMap *Trace::pMap = NULL;
+ SimpleRWLock Trace::lock("Trace");
+ Trace Trace::trace;
+
+ Trace::NameMap::NameMap():
+ traces() {
+ }
+
+ Trace::Trace() {
+ /*
+ This static singleton is constructed at program load time, so the
+ lock should not be necessary here.
+ */
+ Trace::pMap = new NameMap();
+ }
+
+ Trace::~Trace() {
+ delete Trace::pMap;
+ }
+
+ void Trace::setTrace(const string &name, unsigned level) {
+ SimpleRWLock::Exclusive xlock(Trace::lock); // dtor unlocks
+
+ /* if the new level is to be zero, we're going to remove the entry */
+ if (level == 0) {
+ Trace::pMap->traces.erase(name);
+ return;
+ }
+
+ /* try to insert the new trace */
+ std::pair<MapType::iterator, bool> i(
+ Trace::pMap->traces.insert(
+ MapType::value_type(name, level)));
+
+ /*
+ If the insert didn't take place, there was already an entry for
+ that name. Set it to have the new level.
+ */
+ if (!i.second) {
+ (*i.first).second = level;
+ }
+ }
+
+#ifdef LATER
+ void Trace::setTraces(const string &names) {
+ /* create a new map, and replace the existing one */
+ NameMap *pM;
+ assert(false);
+ }
+#endif
+
+ unsigned Trace::getTrace(const string &name) {
+ SimpleRWLock::Shared slock(Trace::lock); // dtor unlocks
+
+ /* quickest check for no active traces */
+ if (Trace::pMap->traces.empty())
+ return 0;
+
+ /* there are traces, so look up by name */
+ MapType::const_iterator i(Trace::pMap->traces.find(name));
+ if (i == Trace::pMap->traces.end())
+ return 0;
+
+ return (*i).second;
+ }
+}