/* Copyright 2013 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 . * * As a special exception, the copyright holders give permission to link the * code of portions of this program with the OpenSSL library under certain * conditions as described in each individual source file and distribute * linked combinations including the program with the OpenSSL library. You * must comply with the GNU Affero General Public License in all respects * for all of the code used other than as permitted herein. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you do not * wish to do so, delete this exception statement from your version. If you * delete this exception statement from all source files in the program, * then also delete it in the license file. */ #pragma once #include #include #include #ifndef _WIN32 #include #endif #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(_npid); } /** * Provides a std::string representation of the pid. */ std::string toString() const; 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<::std::uint32_t>()(pid.asUInt32()); } }; MONGO_HASH_NAMESPACE_END