util.hpp
4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2004-2012. 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.
//
//////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2001-2003
// William E. Kempf
//
// Permission to use, copy, modify, distribute and sell this software
// and its documentation for any purpose is hereby granted without fee,
// provided that the above copyright notice appear in all copies and
// that both that copyright notice and this permission notice appear
// in supporting documentation. William E. Kempf makes no representations
// about the suitability of this software for any purpose.
// It is provided "as is" without express or implied warranty.
#ifndef BOOST_INTERPROCESS_TEST_UTIL_HEADER
#define BOOST_INTERPROCESS_TEST_UTIL_HEADER
#include <boost/interprocess/detail/config_begin.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/detail/os_thread_functions.hpp>
#if defined(BOOST_CLANG) || (defined(BOOST_GCC) && (BOOST_GCC >= 40600))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsign-conversion"
#pragma GCC diagnostic ignored "-Wconversion"
#pragma GCC diagnostic ignored "-Wcast-align"
#pragma GCC diagnostic ignored "-Wshadow"
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
# if (BOOST_GCC >= 100000)
#pragma GCC diagnostic ignored "-Warith-conversion"
# endif
#endif
#include <boost/date_time/posix_time/posix_time_types.hpp>
#define BOOST_CHRONO_HEADER_ONLY
#include <boost/chrono/system_clocks.hpp>
#include <boost/version.hpp>
#if !defined(BOOST_NO_CXX11_HDR_CHRONO)
#include <chrono>
#endif
#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
#pragma GCC diagnostic pop
#endif
namespace boost {
namespace interprocess {
namespace test {
inline boost::posix_time::ptime ptime_delay(int secs, int msecs=0, int nsecs = 0)
{
(void)msecs;
using namespace boost::posix_time;
int count = static_cast<int>(double(nsecs)*
(double(time_duration::ticks_per_second())/double(1000000000.0)));
count += static_cast<int>(double(msecs)*
(double(time_duration::ticks_per_second())/double(1000.0)));
boost::posix_time::ptime cur = boost::posix_time::microsec_clock::universal_time();
return cur += boost::posix_time::time_duration(0, 0, secs, count);
}
inline boost::posix_time::time_duration ptime_seconds(int secs)
{ return boost::posix_time::time_duration(0, 0, secs); }
inline boost::chrono::system_clock::time_point boost_systemclock_delay(int secs)
{ return boost::chrono::system_clock::now() + boost::chrono::seconds(secs); }
inline boost::chrono::seconds boost_systemclock_seconds(int secs)
{ return boost::chrono::seconds(secs); }
#if !defined(BOOST_NO_CXX11_HDR_CHRONO)
//Use std chrono if available
inline std::chrono::system_clock::time_point std_systemclock_delay(int secs)
{ return std::chrono::system_clock::now() + std::chrono::seconds(secs); }
inline std::chrono::seconds std_systemclock_seconds(int secs)
{ return std::chrono::seconds(secs); }
#else
//Otherwise use boost chrono
inline boost::chrono::system_clock::time_point std_systemclock_delay(int secs)
{ return boost_systemclock_delay(secs); }
inline boost::chrono::seconds std_systemclock_seconds(int secs)
{ return boost::chrono::seconds(secs); }
#endif
template <typename P>
class thread_adapter
{
public:
thread_adapter(void (*func)(void*, P &), void* param1, P ¶m2)
: func_(func), param1_(param1) ,param2_(param2){ }
void operator()() const { func_(param1_, param2_); }
private:
void (*func_)(void*, P &);
void* param1_;
P& param2_;
};
template <typename P>
struct data
{
explicit data(int id, int secs=0, int flags = 0)
: m_id(id), m_value(-1), m_secs(secs), m_error(no_error), m_flags(flags)
{}
int m_id;
int m_value;
int m_secs;
error_code_t m_error;
int m_flags;
};
int shared_val = 0;
static const int BaseSeconds = 1;
} //namespace test {
} //namespace interprocess {
} //namespace boost {
#include <boost/interprocess/detail/config_end.hpp>
#endif //#ifndef BOOST_INTERPROCESS_TEST_UTIL_HEADER