summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@10gen.com>2013-05-23 16:36:33 -0400
committerAndy Schwerin <schwerin@10gen.com>2013-06-03 18:53:52 -0400
commit06c6c3b6fb835e1bcc62e5f725aca6d815cfb42e (patch)
tree29c9fd8e4f24683d8b6870b4625428d2512db9d3
parentb3762aae9b2ee9dc2c9429d99432df65c94b7498 (diff)
downloadmongo-06c6c3b6fb835e1bcc62e5f725aca6d815cfb42e.tar.gz
SERVER-9809 Introduce mongo-wide ProcessId type.
-rw-r--r--src/mongo/platform/SConscript8
-rw-r--r--src/mongo/platform/process_id.cpp56
-rw-r--r--src/mongo/platform/process_id.h106
-rw-r--r--src/mongo/platform/process_id_test.cpp54
4 files changed, 222 insertions, 2 deletions
diff --git a/src/mongo/platform/SConscript b/src/mongo/platform/SConscript
index c18fbae3ce8..66aad9a87cb 100644
--- a/src/mongo/platform/SConscript
+++ b/src/mongo/platform/SConscript
@@ -2,8 +2,12 @@
Import("env")
-env.Library( "platform", "random.cpp" )
+env.Library('platform', [
+ 'process_id.cpp',
+ 'random.cpp',
+ ])
env.CppUnitTest('atomic_word_test', 'atomic_word_test.cpp')
env.CppUnitTest('bits_test', 'bits_test.cpp')
-env.CppUnitTest('random_test', 'random_test.cpp')
+env.CppUnitTest('process_id_test', 'process_id_test.cpp', LIBDEPS=['platform'])
+env.CppUnitTest('random_test', 'random_test.cpp', LIBDEPS=['platform'])
diff --git a/src/mongo/platform/process_id.cpp b/src/mongo/platform/process_id.cpp
new file mode 100644
index 00000000000..ef5a6ecc80b
--- /dev/null
+++ b/src/mongo/platform/process_id.cpp
@@ -0,0 +1,56 @@
+/* Copyright 2013 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.
+ */
+
+#include "mongo/platform/basic.h"
+
+#include "mongo/platform/process_id.h"
+
+#include <boost/static_assert.hpp>
+#include <iostream>
+#include <limits>
+
+namespace mongo {
+
+ BOOST_STATIC_ASSERT(sizeof(NativeProcessId) == sizeof(uint32_t));
+
+ namespace {
+#ifdef _WIN32
+ inline NativeProcessId getCurrentNativeProcessId() { return GetCurrentProcessId(); }
+#else
+ inline NativeProcessId getCurrentNativeProcessId() { return getpid(); }
+#endif
+ } // namespace
+
+ ProcessId ProcessId::getCurrent() {
+ return fromNative(getCurrentNativeProcessId());
+ }
+
+ int64_t ProcessId::asInt64() const {
+ typedef std::numeric_limits<NativeProcessId> limits;
+ if (limits::is_signed)
+ return _npid;
+ else
+ return static_cast<int64_t>(static_cast<uint64_t>(_npid));
+ }
+
+ long long ProcessId::asLongLong() const {
+ return static_cast<long long>(asInt64());
+ }
+
+ std::ostream& operator<<(std::ostream& os, ProcessId pid) {
+ return os << pid.asInt64();
+ }
+
+} // namespace mongo
diff --git a/src/mongo/platform/process_id.h b/src/mongo/platform/process_id.h
new file mode 100644
index 00000000000..208b921a1c0
--- /dev/null
+++ b/src/mongo/platform/process_id.h
@@ -0,0 +1,106 @@
+/* Copyright 2013 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 <iosfwd>
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include "mongo/platform/cstdint.h"
+#include "mongo/platform/hash_namespace.h"
+
+namespace mongo {
+
+#ifdef _WIN32
+ typedef DWORD NativeProcessId;
+#else
+ typedef pid_t NativeProcessId;
+#endif
+
+ /**
+ * Platform-independent representation of a process identifier.
+ */
+ class ProcessId {
+ public:
+ /**
+ * Gets the process id for the currently executing process.
+ */
+ static ProcessId getCurrent();
+
+ /**
+ * Constructs a ProcessId from a NativeProcessId.
+ */
+ static inline ProcessId fromNative(NativeProcessId npid) { return ProcessId(npid); }
+
+ /**
+ * Constructs a ProcessId with an unspecified value.
+ */
+ ProcessId() {}
+
+ /**
+ * Gets the native process id corresponding to this ProcessId.
+ */
+ NativeProcessId toNative() const { return _npid; }
+
+ /**
+ * Represents this process id as a signed 64-bit integer.
+ *
+ * This representation will faithfully serialize and format to text files, but is at least
+ * twice the number of bits needed to uniquely represent valid process numbers on supported
+ * OSes..
+ */
+ int64_t asInt64() const;
+
+ /**
+ * Similar to asInt64(), for compatibility with code that uses "long long" to mean 64-bit
+ * signed integer.
+ */
+ long long asLongLong() const;
+
+ /**
+ * Represents this process id as an unsigned 32-bit integer.
+ *
+ * This representation will contain all of the bits of the native process id, but may not
+ * serialize or format to text files meaningfully.
+ */
+ uint32_t asUInt32() const { return static_cast<uint32_t>(_npid); }
+
+ bool operator==(const ProcessId other) const { return _npid == other._npid; }
+ bool operator!=(const ProcessId other) const { return _npid != other._npid; }
+ bool operator<(const ProcessId other) const { return _npid < other._npid; }
+ bool operator<=(const ProcessId other) const { return _npid <= other._npid; }
+ bool operator>(const ProcessId other) const { return _npid > other._npid; }
+ bool operator>=(const ProcessId other) const { return _npid >= other._npid; }
+
+ private:
+ explicit ProcessId(NativeProcessId npid): _npid(npid) {}
+
+ NativeProcessId _npid;
+ };
+
+ std::ostream& operator<<(std::ostream& os, ProcessId pid);
+
+} // namespace mongo
+
+MONGO_HASH_NAMESPACE_START
+template<> struct hash< ::mongo::ProcessId > {
+ size_t operator()(const ::mongo::ProcessId pid) const {
+ return hash< ::mongo::uint32_t >()(pid.asUInt32());
+ }
+};
+MONGO_HASH_NAMESPACE_END
diff --git a/src/mongo/platform/process_id_test.cpp b/src/mongo/platform/process_id_test.cpp
new file mode 100644
index 00000000000..83053e3d886
--- /dev/null
+++ b/src/mongo/platform/process_id_test.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2013 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.
+ */
+
+#include "mongo/platform/process_id.h"
+#include "mongo/unittest/unittest.h"
+
+namespace mongo {
+namespace {
+
+ TEST(ProcessId, Comparison) {
+ const ProcessId p1 = ProcessId::fromNative(NativeProcessId(1));
+ const ProcessId p2 = ProcessId::fromNative(NativeProcessId(2));
+
+ ASSERT_FALSE(p1 == p2);
+ ASSERT_TRUE(p1 == p1);
+
+ ASSERT_TRUE(p1 != p2);
+ ASSERT_FALSE(p1 != p1);
+
+ ASSERT_TRUE(p1 < p2);
+ ASSERT_FALSE(p1 < p1);
+ ASSERT_FALSE(p2 < p1);
+
+ ASSERT_TRUE(p1 <= p2);
+ ASSERT_TRUE(p1 <= p1);
+ ASSERT_FALSE(p2 <= p1);
+
+ ASSERT_TRUE(p2 > p1);
+ ASSERT_FALSE(p2 > p2);
+ ASSERT_FALSE(p1 > p2);
+
+ ASSERT_TRUE(p2 >= p1);
+ ASSERT_TRUE(p2 >= p2);
+ ASSERT_FALSE(p1 >= p2);
+ }
+
+ TEST(ProcessId, GetCurrentEqualsSelf) {
+ ASSERT_EQUALS(ProcessId::getCurrent(), ProcessId::getCurrent());
+ }
+
+} // namespace
+} // namespace mongo