diff options
author | Andy Schwerin <schwerin@10gen.com> | 2013-05-23 16:36:33 -0400 |
---|---|---|
committer | Andy Schwerin <schwerin@10gen.com> | 2013-06-03 18:53:52 -0400 |
commit | 06c6c3b6fb835e1bcc62e5f725aca6d815cfb42e (patch) | |
tree | 29c9fd8e4f24683d8b6870b4625428d2512db9d3 | |
parent | b3762aae9b2ee9dc2c9429d99432df65c94b7498 (diff) | |
download | mongo-06c6c3b6fb835e1bcc62e5f725aca6d815cfb42e.tar.gz |
SERVER-9809 Introduce mongo-wide ProcessId type.
-rw-r--r-- | src/mongo/platform/SConscript | 8 | ||||
-rw-r--r-- | src/mongo/platform/process_id.cpp | 56 | ||||
-rw-r--r-- | src/mongo/platform/process_id.h | 106 | ||||
-rw-r--r-- | src/mongo/platform/process_id_test.cpp | 54 |
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 |