////////////////////////////////////////////////////////////////////////////// | |
// | |
// (C) Copyright Ion Gaztanaga 2005-2009. Distributed under the Boost | |
// Software License, Version 1.0. (See accompanying file | |
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
// | |
// See http://www.boost.org/libs/interprocess for documentation. | |
// | |
////////////////////////////////////////////////////////////////////////////// | |
#ifndef BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP | |
#define BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP | |
#include <boost/interprocess/detail/config_begin.hpp> | |
#include <boost/interprocess/detail/workaround.hpp> | |
#include <boost/interprocess/streams/bufferstream.hpp> | |
#include <boost/interprocess/detail/posix_time_types_wrk.hpp> | |
#if (defined BOOST_INTERPROCESS_WINDOWS) | |
# include <boost/interprocess/detail/win32_api.hpp> | |
#else | |
# ifdef BOOST_HAS_UNISTD_H | |
# include <pthread.h> | |
# include <unistd.h> | |
# include <sched.h> | |
# else | |
# error Unknown platform | |
# endif | |
#endif | |
namespace boost { | |
namespace interprocess { | |
namespace detail{ | |
#if (defined BOOST_INTERPROCESS_WINDOWS) | |
typedef unsigned long OS_process_id_t; | |
typedef unsigned long OS_thread_id_t; | |
typedef OS_thread_id_t OS_systemwide_thread_id_t; | |
//process | |
inline OS_process_id_t get_current_process_id() | |
{ return winapi::get_current_process_id(); } | |
inline OS_process_id_t get_invalid_process_id() | |
{ return OS_process_id_t(0); } | |
//thread | |
inline OS_thread_id_t get_current_thread_id() | |
{ return winapi::get_current_thread_id(); } | |
inline OS_thread_id_t get_invalid_thread_id() | |
{ return OS_thread_id_t(0xffffffff); } | |
inline bool equal_thread_id(OS_thread_id_t id1, OS_thread_id_t id2) | |
{ return id1 == id2; } | |
inline void thread_yield() | |
{ winapi::sched_yield(); } | |
//systemwide thread | |
inline OS_systemwide_thread_id_t get_current_systemwide_thread_id() | |
{ | |
return get_current_thread_id(); | |
} | |
inline void systemwide_thread_id_copy | |
(const volatile OS_systemwide_thread_id_t &from, volatile OS_systemwide_thread_id_t &to) | |
{ | |
to = from; | |
} | |
inline bool equal_systemwide_thread_id(const OS_systemwide_thread_id_t &id1, const OS_systemwide_thread_id_t &id2) | |
{ | |
return equal_thread_id(id1, id2); | |
} | |
inline OS_systemwide_thread_id_t get_invalid_systemwide_thread_id() | |
{ | |
return get_invalid_thread_id(); | |
} | |
inline long double get_current_process_creation_time() | |
{ | |
winapi::interprocess_filetime CreationTime, ExitTime, KernelTime, UserTime; | |
get_process_times | |
( winapi::get_current_process(), &CreationTime, &ExitTime, &KernelTime, &UserTime); | |
typedef long double ldouble_t; | |
const ldouble_t resolution = (100.0l/1000000000.0l); | |
return CreationTime.dwHighDateTime*(ldouble_t(1u<<31u)*2.0l*resolution) + | |
CreationTime.dwLowDateTime*resolution; | |
} | |
#else //#if (defined BOOST_INTERPROCESS_WINDOWS) | |
typedef pthread_t OS_thread_id_t; | |
typedef pid_t OS_process_id_t; | |
struct OS_systemwide_thread_id_t | |
{ | |
OS_systemwide_thread_id_t() | |
: pid(), tid() | |
{} | |
OS_systemwide_thread_id_t(pid_t p, pthread_t t) | |
: pid(p), tid(t) | |
{} | |
OS_systemwide_thread_id_t(const OS_systemwide_thread_id_t &x) | |
: pid(x.pid), tid(x.tid) | |
{} | |
OS_systemwide_thread_id_t(const volatile OS_systemwide_thread_id_t &x) | |
: pid(x.pid), tid(x.tid) | |
{} | |
OS_systemwide_thread_id_t & operator=(const OS_systemwide_thread_id_t &x) | |
{ pid = x.pid; tid = x.tid; return *this; } | |
OS_systemwide_thread_id_t & operator=(const volatile OS_systemwide_thread_id_t &x) | |
{ pid = x.pid; tid = x.tid; return *this; } | |
void operator=(const OS_systemwide_thread_id_t &x) volatile | |
{ pid = x.pid; tid = x.tid; } | |
pid_t pid; | |
pthread_t tid; | |
}; | |
inline void systemwide_thread_id_copy | |
(const volatile OS_systemwide_thread_id_t &from, volatile OS_systemwide_thread_id_t &to) | |
{ | |
to.pid = from.pid; | |
to.tid = from.tid; | |
} | |
//process | |
inline OS_process_id_t get_current_process_id() | |
{ return ::getpid(); } | |
inline OS_process_id_t get_invalid_process_id() | |
{ return pid_t(0); } | |
//thread | |
inline OS_thread_id_t get_current_thread_id() | |
{ return ::pthread_self(); } | |
inline OS_thread_id_t get_invalid_thread_id() | |
{ | |
static pthread_t invalid_id; | |
return invalid_id; | |
} | |
inline bool equal_thread_id(OS_thread_id_t id1, OS_thread_id_t id2) | |
{ return 0 != pthread_equal(id1, id2); } | |
inline void thread_yield() | |
{ ::sched_yield(); } | |
//systemwide thread | |
inline OS_systemwide_thread_id_t get_current_systemwide_thread_id() | |
{ | |
return OS_systemwide_thread_id_t(::getpid(), ::pthread_self()); | |
} | |
inline bool equal_systemwide_thread_id(const OS_systemwide_thread_id_t &id1, const OS_systemwide_thread_id_t &id2) | |
{ | |
return (0 != pthread_equal(id1.tid, id2.tid)) && (id1.pid == id2.pid); | |
} | |
inline OS_systemwide_thread_id_t get_invalid_systemwide_thread_id() | |
{ | |
return OS_systemwide_thread_id_t(get_invalid_process_id(), get_invalid_thread_id()); | |
} | |
inline long double get_current_process_creation_time() | |
{ return 0.0L; } | |
#endif //#if (defined BOOST_INTERPROCESS_WINDOWS) | |
typedef char pid_str_t[sizeof(OS_process_id_t)*3+1]; | |
inline void get_pid_str(pid_str_t &pid_str, OS_process_id_t pid) | |
{ | |
bufferstream bstream(pid_str, sizeof(pid_str)); | |
bstream << pid << std::ends; | |
} | |
inline void get_pid_str(pid_str_t &pid_str) | |
{ get_pid_str(pid_str, get_current_process_id()); } | |
} //namespace detail{ | |
} //namespace interprocess { | |
} //namespace boost { | |
#include <boost/interprocess/detail/config_end.hpp> | |
#endif //BOOST_INTERPROCESS_DETAIL_OS_THREAD_FUNCTIONS_HPP |