mirror of
https://github.com/boostorg/thread.git
synced 2026-02-03 09:42:16 +00:00
Compare commits
77 Commits
boost-1.68
...
boost-1.69
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d0f077ab2 | ||
|
|
dfe6cc3c49 | ||
|
|
330a0a15e6 | ||
|
|
f60dfdfad9 | ||
|
|
ccb1b99e3f | ||
|
|
aa444afc5c | ||
|
|
f1d464d0d5 | ||
|
|
57161ddbb6 | ||
|
|
9a7d21444f | ||
|
|
1b2bc4e451 | ||
|
|
e1b5f9d786 | ||
|
|
8b5cd5f02a | ||
|
|
5b2ffe7104 | ||
|
|
5af180ba36 | ||
|
|
340cc5ab61 | ||
|
|
9a3b8bb4b0 | ||
|
|
79f955e229 | ||
|
|
1da2a57124 | ||
|
|
54871e21a1 | ||
|
|
00efec75d9 | ||
|
|
c66c4b1c76 | ||
|
|
6c70eccb01 | ||
|
|
fbf8d58ad7 | ||
|
|
46a94dd8ba | ||
|
|
76c7b25d4b | ||
|
|
eb297ce86c | ||
|
|
cc31d32b3f | ||
|
|
7f258e5da3 | ||
|
|
c3897bea65 | ||
|
|
502876f0e9 | ||
|
|
e1e4cbf4be | ||
|
|
d2679fec89 | ||
|
|
ba5632e33a | ||
|
|
9a3b7ff859 | ||
|
|
a35ffa3a83 | ||
|
|
1a8229160e | ||
|
|
acda67baf4 | ||
|
|
f6609a42dc | ||
|
|
534f5af9e6 | ||
|
|
2be8908dcd | ||
|
|
aaca72e34b | ||
|
|
24404dcae4 | ||
|
|
f4b239bab1 | ||
|
|
bf7e79c709 | ||
|
|
526e2d6554 | ||
|
|
8c1d232b8c | ||
|
|
92a5bc4300 | ||
|
|
0389f58f23 | ||
|
|
5b209c2e83 | ||
|
|
33ad8b1834 | ||
|
|
8fb92dfb52 | ||
|
|
c550979eff | ||
|
|
15f2d7a21c | ||
|
|
371fb42709 | ||
|
|
f7581a3662 | ||
|
|
e54f7e3960 | ||
|
|
d1284b02ad | ||
|
|
c5e756d196 | ||
|
|
ee607c86d4 | ||
|
|
68eef9240f | ||
|
|
de7608f067 | ||
|
|
743f2a0348 | ||
|
|
d8d549cf3e | ||
|
|
fc08c1fe28 | ||
|
|
dce24d5b43 | ||
|
|
b45ae62791 | ||
|
|
b0485bafdd | ||
|
|
3b52a8950f | ||
|
|
e60f66e023 | ||
|
|
2a68582676 | ||
|
|
b7ebda0f15 | ||
|
|
7b2289a1c5 | ||
|
|
1874018c12 | ||
|
|
d78a0ca53f | ||
|
|
d1ef6369d9 | ||
|
|
8ce9826d98 | ||
|
|
5fa7ae14b9 |
@@ -362,7 +362,7 @@ install:
|
||||
script:
|
||||
- |-
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
|
||||
- ./b2 -j3 libs/thread/test toolset=$TOOLSET
|
||||
- ./b2 -j3 -l60 libs/thread/test toolset=$TOOLSET
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
80
appveyor.yml
80
appveyor.yml
@@ -1,4 +1,5 @@
|
||||
# Copyright 2016, 2017 Peter Dimov
|
||||
# Copyright 2016-2018 Peter Dimov
|
||||
# Copyright 2018 Vicente Botet
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -12,48 +13,34 @@ branches:
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
platform:
|
||||
- x64
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- ARGS: --toolset=msvc-9.0 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-10.0 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-11.0 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-12.0 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-14.0 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-12.0 address-model=64 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-14.0 address-model=64 cxxflags="/wd4244 /wd4459"
|
||||
- ARGS: --toolset=msvc-14.0 address-model=64 cxxflags="-std:c++latest /wd4244 /wd4459"
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
# TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
|
||||
TOOLSET: msvc-12.0
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
TOOLSET: msvc-14.0
|
||||
ADDRMD: 32
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
ARGS: --toolset=msvc-14.1 address-model=64 cxxflags="/wd4244 /wd4459"
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
ARGS: --toolset=msvc-14.1 address-model=32 cxxflags="/wd4244 /wd4459"
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
ARGS: --toolset=msvc-14.1 address-model=64 cxxflags="-std:c++latest /wd4244 /wd4459"
|
||||
- ARGS: --toolset=gcc address-model=64
|
||||
PATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;%PATH%
|
||||
- ARGS: --toolset=gcc address-model=64 cxxflags="-std=gnu++1z
|
||||
PATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;%PATH%
|
||||
- ARGS: --toolset=gcc address-model=32
|
||||
PATH: C:\mingw-w64\i686-5.3.0-posix-dwarf-rt_v4-rev0\mingw32\bin;%PATH%
|
||||
- ARGS: --toolset=gcc address-model=32 linkflags=-Wl,-allow-multiple-definition
|
||||
PATH: C:\MinGW\bin;%PATH%
|
||||
|
||||
|
||||
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
# ARGS: --toolset=msvc-9.0
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
# ARGS: --toolset=msvc-10.0
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
# ARGS: --toolset=msvc-11.0
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
# ARGS: --toolset=msvc-12.0
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
# ARGS: --toolset=msvc-14.0
|
||||
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
# ARGS: --toolset=msvc-14.1
|
||||
TOOLSET: msvc-14.1
|
||||
CXXSTD: 17
|
||||
ADDRMD: 64
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\cygwin\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 14
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\cygwin64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 14
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\mingw\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 14
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 14
|
||||
|
||||
install:
|
||||
- set BOOST_BRANCH=develop
|
||||
@@ -64,16 +51,15 @@ install:
|
||||
- git submodule update --init tools/build
|
||||
- git submodule update --init libs/config
|
||||
- git submodule update --init tools/boostdep
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\thread\
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\thread
|
||||
- python tools/boostdep/depinst/depinst.py thread
|
||||
- cmd /c bootstrap
|
||||
- b2 headers
|
||||
- b2 -d0 headers
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- cd libs\config\test
|
||||
- ..\..\..\b2 config_info_travis_install %ARGS%
|
||||
- config_info_travis
|
||||
- cd ..\..\thread\test
|
||||
- ..\..\..\b2 --abbreviate-paths -j3 %ARGS%
|
||||
- PATH=%ADDPATH%%PATH%
|
||||
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
|
||||
- if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
|
||||
- b2 -j3 libs/thread/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release
|
||||
|
||||
@@ -38,6 +38,8 @@ import path ;
|
||||
import configure ;
|
||||
import threadapi-feature ;
|
||||
|
||||
exe has_atomic_flag_lockfree : ../build/has_atomic_flag_lockfree_test.cpp ;
|
||||
|
||||
project boost/thread
|
||||
: source-location ../src
|
||||
: requirements <threading>multi
|
||||
@@ -141,8 +143,6 @@ project boost/thread
|
||||
<library>/boost/system//boost_system
|
||||
;
|
||||
|
||||
exe has_atomic_flag_lockfree : ../build/has_atomic_flag_lockfree_test.cpp ;
|
||||
|
||||
rule tag ( name : type ? : property-set )
|
||||
{
|
||||
local result = $(name) ;
|
||||
|
||||
23
circle.yml
23
circle.yml
@@ -43,9 +43,9 @@ build_steps: &build_steps
|
||||
- run:
|
||||
name: Build
|
||||
command: |
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD <cxxflags>$DEFINES ;" > ~/user-config.jam
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD <cxxflags>$CXXFLAGS <cxxflags>$DEFINES ;" > ~/user-config.jam
|
||||
cd ../boost-root
|
||||
./b2 -j10 libs/thread/test toolset=$TOOLSET
|
||||
./b2 -d2 -j8 -l60 libs/thread/test toolset=$TOOLSET
|
||||
|
||||
mac_build: &mac_build
|
||||
macos:
|
||||
@@ -66,7 +66,6 @@ jobs:
|
||||
- TOOLSET: "gcc"
|
||||
- COMPILER: "g++"
|
||||
- CXXSTD: "c++11"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-g++-7-c++98:
|
||||
<<: *linux_build
|
||||
@@ -74,7 +73,6 @@ jobs:
|
||||
- TOOLSET: "gcc"
|
||||
- COMPILER: "g++-7"
|
||||
- CXXSTD: "c++98"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-g++-7-c++11:
|
||||
<<: *linux_build
|
||||
@@ -82,7 +80,6 @@ jobs:
|
||||
- TOOLSET: "gcc"
|
||||
- COMPILER: "g++-7"
|
||||
- CXXSTD: "c++11"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-g++-7-c++14:
|
||||
<<: *linux_build
|
||||
@@ -90,7 +87,6 @@ jobs:
|
||||
- TOOLSET: "gcc"
|
||||
- COMPILER: "g++-7"
|
||||
- CXXSTD: "c++14"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-g++-7-c++1z:
|
||||
<<: *linux_build
|
||||
@@ -98,7 +94,6 @@ jobs:
|
||||
- TOOLSET: "gcc"
|
||||
- COMPILER: "g++-7"
|
||||
- CXXSTD: "c++1z"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-clang++-4.0-c++98:
|
||||
<<: *linux_build
|
||||
@@ -106,7 +101,6 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++-4.0"
|
||||
- CXXSTD: "c++98"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-clang++-4.0-c++11:
|
||||
<<: *linux_build
|
||||
@@ -114,7 +108,6 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++-4.0"
|
||||
- CXXSTD: "c++11"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-clang++-4.0-c++14:
|
||||
<<: *linux_build
|
||||
@@ -122,7 +115,6 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++-4.0"
|
||||
- CXXSTD: "c++14"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
linux-clang++-4.0-c++1z:
|
||||
<<: *linux_build
|
||||
@@ -130,7 +122,6 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++-4.0"
|
||||
- CXXSTD: "c++1z"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
mac-clang++-c++98:
|
||||
<<: *mac_build
|
||||
@@ -138,7 +129,7 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++"
|
||||
- CXXSTD: "c++98"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=170"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
mac-clang++-c++11:
|
||||
<<: *mac_build
|
||||
@@ -146,7 +137,8 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++"
|
||||
- CXXSTD: "c++11"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=170"
|
||||
- CXXFLAGS: "-Wno-unusable-partial-specialization"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
mac-clang++-c++14:
|
||||
<<: *mac_build
|
||||
@@ -154,7 +146,7 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++"
|
||||
- CXXSTD: "c++14"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=170"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
mac-clang++-c++1z:
|
||||
<<: *mac_build
|
||||
@@ -162,7 +154,8 @@ jobs:
|
||||
- TOOLSET: "clang"
|
||||
- COMPILER: "clang++"
|
||||
- CXXSTD: "c++1z"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=170"
|
||||
- CXXFLAGS: "-Wno-unusable-partial-specialization"
|
||||
- DEFINES: "-DBOOST_THREAD_TEST_TIME_MS=100"
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
|
||||
@@ -1526,7 +1526,7 @@ A thread pool with up to a fixed number of threads.
|
||||
|
||||
[variablelist
|
||||
|
||||
[[Effects:] [Destroys the thread pool.]]
|
||||
[[Effects:] [Interrupts and joins all the threads and then destroys the threads.]]
|
||||
|
||||
[[Synchronization:] [The completion of all the closures happen before the completion of the executor destructor.]]
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
|
||||
struct once_flag
|
||||
{
|
||||
constexprr once_flag() noexcept;
|
||||
constexpr once_flag() noexcept;
|
||||
once_flag(const once_flag&) = delete;
|
||||
once_flag& operator=(const once_flag&) = delete;
|
||||
};
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/thread/detail/platform.hpp>
|
||||
#include <boost/thread/detail/thread_safety.hpp>
|
||||
|
||||
//#define BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS
|
||||
// ATTRIBUTE_MAY_ALIAS
|
||||
|
||||
@@ -350,12 +350,19 @@ namespace boost
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||
template <class T>
|
||||
typename decay<T>::type
|
||||
decay_copy(T&& t)
|
||||
{
|
||||
return boost::forward<T>(t);
|
||||
}
|
||||
template <class T>
|
||||
typename decay<T>::type
|
||||
decay_copy(T&& t)
|
||||
{
|
||||
return boost::forward<T>(t);
|
||||
}
|
||||
typedef void (*void_fct_ptr)();
|
||||
|
||||
// inline void_fct_ptr
|
||||
// decay_copy(void (&t)())
|
||||
// {
|
||||
// return &t;
|
||||
// }
|
||||
#else
|
||||
template <class T>
|
||||
typename decay<T>::type
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// 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)
|
||||
//
|
||||
// 2013/09 Vicente J. Botet Escriba
|
||||
// 2013,2018 Vicente J. Botet Escriba
|
||||
// Adapt to boost from CCIA C++11 implementation
|
||||
// Make use of Boost.Move
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <boost/thread/detail/move.hpp>
|
||||
#include <boost/thread/csbl/memory/shared_ptr.hpp>
|
||||
#include <boost/type_traits/decay.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -72,12 +73,16 @@ namespace boost
|
||||
|
||||
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||
template<typename F>
|
||||
explicit nullary_function(F& f):
|
||||
explicit nullary_function(F& f
|
||||
, typename disable_if<is_same<typename decay<F>::type, nullary_function>, int* >::type=0
|
||||
):
|
||||
impl(new impl_type<F>(f))
|
||||
{}
|
||||
#endif
|
||||
template<typename F>
|
||||
nullary_function(BOOST_THREAD_RV_REF(F) f):
|
||||
nullary_function(BOOST_THREAD_RV_REF(F) f
|
||||
, typename disable_if<is_same<typename decay<F>::type, nullary_function>, int* >::type=0
|
||||
):
|
||||
impl(new impl_type<typename decay<F>::type>(thread_detail::decay_copy(boost::forward<F>(f))))
|
||||
{}
|
||||
|
||||
|
||||
@@ -594,7 +594,7 @@ namespace boost
|
||||
#endif
|
||||
|
||||
#if defined BOOST_THREAD_USES_DATETIME
|
||||
inline BOOST_SYMBOL_VISIBLE void sleep(xtime const& abs_time)
|
||||
inline BOOST_SYMBOL_VISIBLE void sleep(::boost::xtime const& abs_time)
|
||||
{
|
||||
sleep(system_time(abs_time));
|
||||
}
|
||||
|
||||
160
include/boost/thread/detail/thread_safety.hpp
Normal file
160
include/boost/thread/detail/thread_safety.hpp
Normal file
@@ -0,0 +1,160 @@
|
||||
#ifndef BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP
|
||||
#define BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP
|
||||
|
||||
#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||
//
|
||||
// This is horrible, but it seems to be the only we can shut up the
|
||||
// "anonymous variadic macros were introduced in C99 [-Wvariadic-macros]"
|
||||
// warning that get spewed out otherwise in non-C++11 mode.
|
||||
//
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
// See https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
|
||||
|
||||
// Un-comment to enable Thread Safety Analysis
|
||||
//#define BOOST_THREAD_ENABLE_THREAD_SAFETY_ANALYSIS
|
||||
|
||||
// Enable thread safety attributes only with clang.
|
||||
// The attributes can be safely erased when compiling with other compilers.
|
||||
#if defined (BOOST_THREAD_ENABLE_THREAD_SAFETY_ANALYSIS) && defined(__clang__) && (!defined(SWIG))
|
||||
#define BOOST_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
|
||||
#else
|
||||
#define BOOST_THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
|
||||
#endif
|
||||
|
||||
#define BOOST_THREAD_CAPABILITY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(capability(x))
|
||||
|
||||
#define BOOST_THREAD_SCOPED_CAPABILITY \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
|
||||
|
||||
#define BOOST_THREAD_GUARDED_BY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
|
||||
|
||||
#define BOOST_THREAD_PT_GUARDED_BY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
|
||||
|
||||
#define BOOST_THREAD_ACQUIRED_BEFORE(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_ACQUIRED_AFTER(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_REQUIRES(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_REQUIRES_SHARED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_ACQUIRE(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_ACQUIRE_SHARED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_RELEASE(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_RELEASE_SHARED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_TRY_ACQUIRE(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_TRY_ACQUIRE_SHARED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_EXCLUDES(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
|
||||
|
||||
#define BOOST_THREAD_ASSERT_CAPABILITY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))
|
||||
|
||||
#define BOOST_THREAD_ASSERT_SHARED_CAPABILITY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))
|
||||
|
||||
#define BOOST_THREAD_RETURN_CAPABILITY(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
|
||||
|
||||
#define BOOST_THREAD_NO_THREAD_SAFETY_ANALYSIS \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
|
||||
|
||||
#if defined(__clang__) && (!defined(SWIG)) && defined(__FreeBSD__)
|
||||
#if __has_attribute(no_thread_safety_analysis)
|
||||
#define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
|
||||
#else
|
||||
#define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
#endif
|
||||
#else
|
||||
#define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
#endif
|
||||
|
||||
#ifdef USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES
|
||||
// The original version of thread safety analysis the following attribute
|
||||
// definitions. These use a lock-based terminology. They are still in use
|
||||
// by existing thread safety code, and will continue to be supported.
|
||||
|
||||
// Deprecated.
|
||||
#define BOOST_THREAD_PT_GUARDED_VAR \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_var)
|
||||
|
||||
// Deprecated.
|
||||
#define BOOST_THREAD_GUARDED_VAR \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(guarded_var)
|
||||
|
||||
// Replaced by REQUIRES
|
||||
#define BOOST_THREAD_EXCLUSIVE_LOCKS_REQUIRED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))
|
||||
|
||||
// Replaced by REQUIRES_SHARED
|
||||
#define BOOST_THREAD_SHARED_LOCKS_REQUIRED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))
|
||||
|
||||
// Replaced by CAPABILITY
|
||||
#define BOOST_THREAD_LOCKABLE \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lockable)
|
||||
|
||||
// Replaced by SCOPED_CAPABILITY
|
||||
#define BOOST_THREAD_SCOPED_LOCKABLE \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
|
||||
|
||||
// Replaced by ACQUIRE
|
||||
#define BOOST_THREAD_EXCLUSIVE_LOCK_FUNCTION(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))
|
||||
|
||||
// Replaced by ACQUIRE_SHARED
|
||||
#define BOOST_THREAD_SHARED_LOCK_FUNCTION(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))
|
||||
|
||||
// Replaced by RELEASE and RELEASE_SHARED
|
||||
#define BOOST_THREAD_UNLOCK_FUNCTION(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))
|
||||
|
||||
// Replaced by TRY_ACQUIRE
|
||||
#define BOOST_THREAD_EXCLUSIVE_TRYLOCK_FUNCTION(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))
|
||||
|
||||
// Replaced by TRY_ACQUIRE_SHARED
|
||||
#define BOOST_THREAD_SHARED_TRYLOCK_FUNCTION(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))
|
||||
|
||||
// Replaced by ASSERT_CAPABILITY
|
||||
#define BOOST_THREAD_ASSERT_EXCLUSIVE_LOCK(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__))
|
||||
|
||||
// Replaced by ASSERT_SHARED_CAPABILITY
|
||||
#define BOOST_THREAD_ASSERT_SHARED_LOCK(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__))
|
||||
|
||||
// Replaced by EXCLUDE_CAPABILITY.
|
||||
#define BOOST_THREAD_LOCKS_EXCLUDED(...) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
|
||||
|
||||
// Replaced by RETURN_CAPABILITY
|
||||
#define BOOST_THREAD_LOCK_RETURNED(x) \
|
||||
BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
|
||||
|
||||
#endif // USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES
|
||||
|
||||
#endif // BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <boost/config/abi_prefix.hpp>
|
||||
|
||||
#if defined(BOOST_HAS_WINTHREADS)
|
||||
#if defined(BOOST_THREAD_WIN32)
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -58,7 +58,7 @@ namespace boost
|
||||
//it to be linked into the Boost.Threads library.
|
||||
}
|
||||
|
||||
#endif //defined(BOOST_HAS_WINTHREADS)
|
||||
#endif //defined(BOOST_THREAD_WIN32)
|
||||
|
||||
#include <boost/config/abi_suffix.hpp>
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace boost
|
||||
{
|
||||
}
|
||||
|
||||
~thread_exception() throw()
|
||||
~thread_exception() BOOST_NOEXCEPT_OR_NOTHROW
|
||||
{}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ namespace boost
|
||||
{
|
||||
}
|
||||
|
||||
~lock_error() throw()
|
||||
~lock_error() BOOST_NOEXCEPT_OR_NOTHROW
|
||||
{}
|
||||
|
||||
};
|
||||
@@ -141,7 +141,7 @@ namespace boost
|
||||
}
|
||||
|
||||
|
||||
~thread_resource_error() throw()
|
||||
~thread_resource_error() BOOST_NOEXCEPT_OR_NOTHROW
|
||||
{}
|
||||
|
||||
};
|
||||
|
||||
@@ -231,13 +231,36 @@ namespace executors
|
||||
// signal to all the worker threads that there will be no more submissions.
|
||||
close();
|
||||
// joins all the threads before destroying the thread pool resources (e.g. the queue).
|
||||
join();
|
||||
interrupt_and_join();
|
||||
}
|
||||
|
||||
/**
|
||||
* \b Effects: join all the threads.
|
||||
*/
|
||||
void join()
|
||||
{
|
||||
for (unsigned i = 0; i < threads.size(); ++i)
|
||||
{
|
||||
//threads[i].interrupt();
|
||||
threads[i].join();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \b Effects: interrupt all the threads.
|
||||
*/
|
||||
void interrupt()
|
||||
{
|
||||
for (unsigned i = 0; i < threads.size(); ++i)
|
||||
{
|
||||
threads[i].interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \b Effects: interrupt and join all the threads.
|
||||
*/
|
||||
void interrupt_and_join()
|
||||
{
|
||||
for (unsigned i = 0; i < threads.size(); ++i)
|
||||
{
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
#ifdef BOOST_NO_EXCEPTIONS
|
||||
namespace boost
|
||||
{
|
||||
|
||||
namespace detail {
|
||||
struct shared_state_base {
|
||||
void notify_deferred();
|
||||
void notify_deferred() {}
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace boost
|
||||
{
|
||||
|
||||
template <typename Mutex>
|
||||
class lock_guard
|
||||
class BOOST_THREAD_SCOPED_CAPABILITY lock_guard
|
||||
{
|
||||
private:
|
||||
Mutex& m;
|
||||
@@ -32,13 +32,13 @@ namespace boost
|
||||
typedef Mutex mutex_type;
|
||||
BOOST_THREAD_NO_COPYABLE( lock_guard )
|
||||
|
||||
explicit lock_guard(Mutex& m_) :
|
||||
explicit lock_guard(Mutex& m_) BOOST_THREAD_ACQUIRE(m_) :
|
||||
m(m_)
|
||||
{
|
||||
m.lock();
|
||||
}
|
||||
|
||||
lock_guard(Mutex& m_, adopt_lock_t) :
|
||||
lock_guard(Mutex& m_, adopt_lock_t) BOOST_THREAD_REQUIRES(m_) :
|
||||
m(m_)
|
||||
{
|
||||
#if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
|
||||
@@ -62,7 +62,7 @@ namespace boost
|
||||
}
|
||||
|
||||
#endif
|
||||
~lock_guard()
|
||||
~lock_guard() BOOST_THREAD_RELEASE()
|
||||
{
|
||||
m.unlock();
|
||||
}
|
||||
|
||||
@@ -11,7 +11,12 @@
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#ifdef BOOST_NO_CXX11_SFINAE_EXPR
|
||||
#include <boost/type_traits/is_class.hpp>
|
||||
#else
|
||||
#include <boost/type_traits/declval.hpp>
|
||||
#endif
|
||||
|
||||
#include <boost/config/abi_prefix.hpp>
|
||||
|
||||
@@ -33,6 +38,7 @@ namespace boost
|
||||
#ifndef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
||||
namespace detail
|
||||
{
|
||||
#ifdef BOOST_NO_CXX11_SFINAE_EXPR
|
||||
#define BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(member_name) \
|
||||
template<typename T, bool=boost::is_class<T>::value> \
|
||||
struct has_member_called_##member_name \
|
||||
@@ -142,6 +148,31 @@ namespace boost
|
||||
BOOST_STATIC_CONSTANT(
|
||||
bool,value=sizeof(has_member_try_lock<T>::has_member(&T::try_lock))==sizeof(true_type));
|
||||
};
|
||||
#else
|
||||
template<typename T,typename Enabled=void>
|
||||
struct has_member_lock : false_type {};
|
||||
|
||||
template<typename T>
|
||||
struct has_member_lock<T,
|
||||
decltype(void(boost::declval<T&>().lock()))
|
||||
> : true_type {};
|
||||
|
||||
template<typename T,typename Enabled=void>
|
||||
struct has_member_unlock : false_type {};
|
||||
|
||||
template<typename T>
|
||||
struct has_member_unlock<T,
|
||||
decltype(void(boost::declval<T&>().unlock()))
|
||||
> : true_type {};
|
||||
|
||||
template<typename T,typename Enabled=bool>
|
||||
struct has_member_try_lock : false_type {};
|
||||
|
||||
template<typename T>
|
||||
struct has_member_try_lock<T,
|
||||
decltype(bool(boost::declval<T&>().try_lock()))
|
||||
> : true_type {};
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -249,7 +249,7 @@ namespace boost
|
||||
#endif
|
||||
}
|
||||
template<typename lock_type>
|
||||
bool timed_wait(lock_type& m,xtime const& abs_time)
|
||||
bool timed_wait(lock_type& m,::boost::xtime const& abs_time)
|
||||
{
|
||||
return timed_wait(m,system_time(abs_time));
|
||||
}
|
||||
@@ -309,7 +309,7 @@ namespace boost
|
||||
}
|
||||
|
||||
template<typename lock_type,typename predicate_type>
|
||||
bool timed_wait(lock_type& m,xtime const& abs_time, predicate_type pred)
|
||||
bool timed_wait(lock_type& m,::boost::xtime const& abs_time, predicate_type pred)
|
||||
{
|
||||
return timed_wait(m,system_time(abs_time),pred);
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace boost
|
||||
}
|
||||
bool timed_wait(
|
||||
unique_lock<mutex>& m,
|
||||
xtime const& abs_time)
|
||||
::boost::xtime const& abs_time)
|
||||
{
|
||||
return timed_wait(m,system_time(abs_time));
|
||||
}
|
||||
@@ -194,7 +194,7 @@ namespace boost
|
||||
template<typename predicate_type>
|
||||
bool timed_wait(
|
||||
unique_lock<mutex>& m,
|
||||
xtime const& abs_time,predicate_type pred)
|
||||
::boost::xtime const& abs_time,predicate_type pred)
|
||||
{
|
||||
return timed_wait(m,system_time(abs_time),pred);
|
||||
}
|
||||
|
||||
@@ -39,53 +39,8 @@
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace posix {
|
||||
#ifdef BOOST_THREAD_HAS_EINTR_BUG
|
||||
BOOST_FORCEINLINE int pthread_mutex_destroy(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_destroy(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
BOOST_FORCEINLINE int pthread_mutex_lock(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_lock(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
BOOST_FORCEINLINE int pthread_mutex_unlock(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_unlock(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
BOOST_FORCEINLINE int pthread_mutex_destroy(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_destroy(m);
|
||||
}
|
||||
BOOST_FORCEINLINE int pthread_mutex_lock(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_lock(m);
|
||||
}
|
||||
BOOST_FORCEINLINE int pthread_mutex_unlock(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_unlock(m);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
class mutex
|
||||
class BOOST_THREAD_CAPABILITY("mutex") mutex
|
||||
{
|
||||
private:
|
||||
pthread_mutex_t m;
|
||||
@@ -107,7 +62,7 @@ namespace boost
|
||||
BOOST_ASSERT(!res);
|
||||
}
|
||||
|
||||
void lock()
|
||||
void lock() BOOST_THREAD_ACQUIRE()
|
||||
{
|
||||
int res = posix::pthread_mutex_lock(&m);
|
||||
if (res)
|
||||
@@ -116,7 +71,7 @@ namespace boost
|
||||
}
|
||||
}
|
||||
|
||||
void unlock()
|
||||
void unlock() BOOST_THREAD_RELEASE()
|
||||
{
|
||||
int res = posix::pthread_mutex_unlock(&m);
|
||||
(void)res;
|
||||
@@ -127,12 +82,12 @@ namespace boost
|
||||
// }
|
||||
}
|
||||
|
||||
bool try_lock()
|
||||
bool try_lock() BOOST_THREAD_TRY_ACQUIRE(true)
|
||||
{
|
||||
int res;
|
||||
do
|
||||
{
|
||||
res = pthread_mutex_trylock(&m);
|
||||
res = posix::pthread_mutex_trylock(&m);
|
||||
} while (res == EINTR);
|
||||
if (res==EBUSY)
|
||||
{
|
||||
@@ -251,7 +206,7 @@ namespace boost
|
||||
int res;
|
||||
do
|
||||
{
|
||||
res = pthread_mutex_trylock(&m);
|
||||
res = posix::pthread_mutex_trylock(&m);
|
||||
} while (res == EINTR);
|
||||
if (res==EBUSY)
|
||||
{
|
||||
@@ -277,7 +232,7 @@ namespace boost
|
||||
boost::pthread::pthread_mutex_scoped_lock const local_lock(&m);
|
||||
while(is_locked)
|
||||
{
|
||||
BOOST_VERIFY(!pthread_cond_wait(&cond,&m));
|
||||
BOOST_VERIFY(!posix::pthread_cond_wait(&cond,&m));
|
||||
}
|
||||
is_locked=true;
|
||||
}
|
||||
@@ -286,7 +241,7 @@ namespace boost
|
||||
{
|
||||
boost::pthread::pthread_mutex_scoped_lock const local_lock(&m);
|
||||
is_locked=false;
|
||||
BOOST_VERIFY(!pthread_cond_signal(&cond));
|
||||
BOOST_VERIFY(!posix::pthread_cond_signal(&cond));
|
||||
}
|
||||
|
||||
bool try_lock()
|
||||
|
||||
@@ -13,6 +13,75 @@
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace posix {
|
||||
#ifdef BOOST_THREAD_HAS_EINTR_BUG
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_destroy(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_destroy(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_lock(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_lock(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_unlock(pthread_mutex_t* m)
|
||||
{
|
||||
int ret;
|
||||
do
|
||||
{
|
||||
ret = ::pthread_mutex_unlock(m);
|
||||
} while (ret == EINTR);
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_destroy(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_destroy(m);
|
||||
}
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_lock(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_lock(m);
|
||||
}
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_unlock(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_unlock(m);
|
||||
}
|
||||
|
||||
#endif
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_mutex_trylock(pthread_mutex_t* m)
|
||||
{
|
||||
return ::pthread_mutex_trylock(m);
|
||||
}
|
||||
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
return ::pthread_cond_wait(cond, mutex);
|
||||
}
|
||||
BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
|
||||
int pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
return ::pthread_cond_signal(cond);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
namespace pthread
|
||||
{
|
||||
class pthread_mutex_scoped_lock
|
||||
@@ -23,11 +92,11 @@ namespace boost
|
||||
explicit pthread_mutex_scoped_lock(pthread_mutex_t* m_) BOOST_NOEXCEPT:
|
||||
m(m_),locked(true)
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_lock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(m));
|
||||
}
|
||||
void unlock() BOOST_NOEXCEPT
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
|
||||
locked=false;
|
||||
}
|
||||
void unlock_if_locked() BOOST_NOEXCEPT
|
||||
@@ -54,11 +123,11 @@ namespace boost
|
||||
explicit pthread_mutex_scoped_unlock(pthread_mutex_t* m_) BOOST_NOEXCEPT:
|
||||
m(m_)
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
|
||||
}
|
||||
~pthread_mutex_scoped_unlock() BOOST_NOEXCEPT
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_lock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(m));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -105,17 +105,17 @@ namespace boost
|
||||
#ifdef BOOST_THREAD_HAS_PTHREAD_MUTEXATTR_SETTYPE
|
||||
void lock()
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_lock(&m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(&m));
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(&m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(&m));
|
||||
}
|
||||
|
||||
bool try_lock() BOOST_NOEXCEPT
|
||||
{
|
||||
int const res=pthread_mutex_trylock(&m);
|
||||
int const res=posix::pthread_mutex_trylock(&m);
|
||||
BOOST_ASSERT(!res || res==EBUSY);
|
||||
return !res;
|
||||
}
|
||||
@@ -270,17 +270,17 @@ namespace boost
|
||||
#ifdef BOOST_USE_PTHREAD_RECURSIVE_TIMEDLOCK
|
||||
void lock()
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_lock(&m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(&m));
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(&m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(&m));
|
||||
}
|
||||
|
||||
bool try_lock()
|
||||
{
|
||||
int const res=pthread_mutex_trylock(&m);
|
||||
int const res=posix::pthread_mutex_trylock(&m);
|
||||
BOOST_ASSERT(!res || res==EBUSY);
|
||||
return !res;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <boost/thread/lock_types.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/thread/pthread/condition_variable_fwd.hpp>
|
||||
#include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
@@ -56,7 +57,7 @@ namespace boost
|
||||
#else
|
||||
std::size_t page_size = ::sysconf( _SC_PAGESIZE);
|
||||
#endif
|
||||
#ifdef PTHREAD_STACK_MIN
|
||||
#if PTHREAD_STACK_MIN > 0
|
||||
if (size<PTHREAD_STACK_MIN) size=PTHREAD_STACK_MIN;
|
||||
#endif
|
||||
size = ((size+page_size-1)/page_size)*page_size;
|
||||
@@ -209,11 +210,11 @@ namespace boost
|
||||
check_for_interruption();
|
||||
thread_info->cond_mutex=cond_mutex;
|
||||
thread_info->current_cond=cond;
|
||||
BOOST_VERIFY(!pthread_mutex_lock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(m));
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_lock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_lock(m));
|
||||
}
|
||||
}
|
||||
void unlock_if_locked()
|
||||
@@ -221,14 +222,14 @@ namespace boost
|
||||
if ( ! done) {
|
||||
if (set)
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
|
||||
lock_guard<mutex> guard(thread_info->data_mutex);
|
||||
thread_info->cond_mutex=NULL;
|
||||
thread_info->current_cond=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_VERIFY(!pthread_mutex_unlock(m));
|
||||
BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
|
||||
}
|
||||
done = true;
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace boost
|
||||
template<typename Duration>
|
||||
bool timed_lock(Duration const& target)
|
||||
{
|
||||
long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
|
||||
long const current_thread_id=boost::winapi::GetCurrentThreadId();
|
||||
return try_recursive_lock(current_thread_id) || try_timed_lock(current_thread_id,target);
|
||||
}
|
||||
#endif
|
||||
@@ -76,13 +76,13 @@ namespace boost
|
||||
template <class Rep, class Period>
|
||||
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
||||
{
|
||||
long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
|
||||
long const current_thread_id=boost::winapi::GetCurrentThreadId();
|
||||
return try_recursive_lock(current_thread_id) || try_timed_lock_for(current_thread_id,rel_time);
|
||||
}
|
||||
template <class Clock, class Duration>
|
||||
bool try_lock_until(const chrono::time_point<Clock, Duration>& t)
|
||||
{
|
||||
long const current_thread_id=boost::detail::winapi::GetCurrentThreadId();
|
||||
long const current_thread_id=boost::winapi::GetCurrentThreadId();
|
||||
return try_recursive_lock(current_thread_id) || try_timed_lock_until(current_thread_id,t);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -87,9 +87,9 @@ namespace boost
|
||||
{
|
||||
void* const res=
|
||||
#if defined(_M_ARM64)
|
||||
__iso_volatile_load64((const volatile __int64*)x);
|
||||
(void*)__iso_volatile_load64((const volatile __int64*)x);
|
||||
#else
|
||||
__iso_volatile_load32((const volatile __int32*)x);
|
||||
(void*)__iso_volatile_load32((const volatile __int32*)x);
|
||||
#endif
|
||||
BOOST_THREAD_DETAIL_COMPILER_BARRIER();
|
||||
__dmb(0xB); // _ARM_BARRIER_ISH, see armintr.h from MSVC 11 and later
|
||||
|
||||
@@ -57,17 +57,17 @@ struct xtime
|
||||
|
||||
};
|
||||
|
||||
inline xtime get_xtime(boost::system_time const& abs_time)
|
||||
inline ::boost::xtime get_xtime(boost::system_time const& abs_time)
|
||||
{
|
||||
xtime res;
|
||||
::boost::xtime res;
|
||||
boost::posix_time::time_duration const time_since_epoch=abs_time-boost::posix_time::from_time_t(0);
|
||||
|
||||
res.sec=static_cast<xtime::xtime_sec_t>(time_since_epoch.total_seconds());
|
||||
res.nsec=static_cast<xtime::xtime_nsec_t>(time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()));
|
||||
res.sec=static_cast< ::boost::xtime::xtime_sec_t>(time_since_epoch.total_seconds());
|
||||
res.nsec=static_cast< ::boost::xtime::xtime_nsec_t>(time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()));
|
||||
return res;
|
||||
}
|
||||
|
||||
inline int xtime_get(struct xtime* xtp, int clock_type)
|
||||
inline int xtime_get(struct ::boost::xtime* xtp, int clock_type)
|
||||
{
|
||||
if (clock_type == TIME_UTC_)
|
||||
{
|
||||
@@ -78,7 +78,7 @@ inline int xtime_get(struct xtime* xtp, int clock_type)
|
||||
}
|
||||
|
||||
|
||||
inline int xtime_cmp(const xtime& xt1, const xtime& xt2)
|
||||
inline int xtime_cmp(const ::boost::xtime& xt1, const ::boost::xtime& xt2)
|
||||
{
|
||||
if (xt1.sec == xt2.sec)
|
||||
return (int)(xt1.nsec - xt2.nsec);
|
||||
|
||||
@@ -7,11 +7,10 @@
|
||||
"Vicente J. Botet Escriba"
|
||||
],
|
||||
"maintainers": [
|
||||
"Vicente J. Botet Escriba <vicente.botet -at- wanadoo.fr>",
|
||||
"Niall Douglas <niall -at- nedprod.com>"
|
||||
"Vicente J. Botet Escriba <vicente.botet -at- wanadoo.fr>"
|
||||
],
|
||||
"description":
|
||||
"Portable C++ multi-threading. C++11, C++14.",
|
||||
"Portable C++ multi-threading. C++03, C++11, C++14, C++17.",
|
||||
"std": [ "proposal" ],
|
||||
"category": [
|
||||
"Concurrent", "System"
|
||||
|
||||
@@ -5,14 +5,7 @@
|
||||
|
||||
#include <boost/thread/detail/config.hpp>
|
||||
|
||||
#ifdef BOOST_NO_EXCEPTIONS
|
||||
namespace boost
|
||||
{
|
||||
void shared_state_base::notify_deferred() {}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
|
||||
#include <boost/thread/futures/future_error_code.hpp>
|
||||
#include <string>
|
||||
|
||||
@@ -149,7 +149,7 @@ namespace boost
|
||||
|
||||
boost::detail::thread_data_base* get_current_thread_data()
|
||||
{
|
||||
boost::call_once(current_thread_tls_init_flag,create_current_thread_tls_key);
|
||||
boost::call_once(current_thread_tls_init_flag,&create_current_thread_tls_key);
|
||||
return (boost::detail::thread_data_base*)pthread_getspecific(current_thread_tls_key);
|
||||
}
|
||||
|
||||
@@ -470,7 +470,7 @@ namespace boost
|
||||
# elif defined(BOOST_HAS_PTHREAD_YIELD)
|
||||
BOOST_VERIFY(!pthread_yield());
|
||||
//# elif defined BOOST_THREAD_USES_DATETIME
|
||||
// xtime xt;
|
||||
// ::boost::xtime xt;
|
||||
// xtime_get(&xt, TIME_UTC_);
|
||||
// sleep(xt);
|
||||
// sleep_for(chrono::milliseconds(0));
|
||||
@@ -478,7 +478,7 @@ namespace boost
|
||||
mutex mx;
|
||||
unique_lock<mutex> lock(mx);
|
||||
condition_variable cond;
|
||||
cond.do_wait_until(lock, detail::internal_platform_clock::now())
|
||||
cond.do_wait_until(lock, detail::internal_platform_clock::now());
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
#include <boost/thread/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_HAS_WINTHREADS) && (defined(BOOST_THREAD_BUILD_LIB) || defined(BOOST_THREAD_TEST) || defined(UNDER_CE)) && (!defined(_MSC_VER) || defined(UNDER_CE))
|
||||
#if defined(BOOST_THREAD_WIN32) && (defined(BOOST_THREAD_BUILD_LIB) || defined(BOOST_THREAD_TEST) || defined(UNDER_CE)) && (!defined(_MSC_VER) || defined(UNDER_CE))
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -35,4 +35,4 @@ namespace boost
|
||||
|
||||
}
|
||||
|
||||
#endif //defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_LIB) && !defined(_MSC_VER)
|
||||
#endif //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_LIB) && !defined(_MSC_VER)
|
||||
|
||||
@@ -522,12 +522,12 @@ namespace boost
|
||||
GetLogicalProcessorInformation(NULL, &size);
|
||||
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
|
||||
return 0;
|
||||
const size_t Elements = size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
|
||||
|
||||
std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> buffer(size);
|
||||
std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> buffer(Elements);
|
||||
if (GetLogicalProcessorInformation(&buffer.front(), &size) == FALSE)
|
||||
return 0;
|
||||
|
||||
const size_t Elements = size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
|
||||
|
||||
for (size_t i = 0; i < Elements; ++i) {
|
||||
if (buffer[i].Relationship == RelationProcessorCore)
|
||||
|
||||
@@ -93,8 +93,24 @@ ticks_type WINAPI get_tick_count_init()
|
||||
boost::winapi::HMODULE_ hKernel32 = boost::winapi::GetModuleHandleW(L"kernel32.dll");
|
||||
if (hKernel32)
|
||||
{
|
||||
// GetProcAddress returns a pointer to some function. It can return
|
||||
// pointers to different functions, so it has to return something that is
|
||||
// suitable to store any pointer to function. Microsoft chose FARPROC,
|
||||
// which is int (WINAPI *)() on 32-bit Windows. The user is supposed to
|
||||
// know the signature of the function he requests and perform a cast
|
||||
// (which is a nop on this platform). The result is a pointer to function
|
||||
// with the required signature, which is bitwise equal to what
|
||||
// GetProcAddress returned.
|
||||
// However, gcc >= 8 warns about that.
|
||||
#if defined(BOOST_GCC) && BOOST_GCC >= 80000
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wcast-function-type"
|
||||
#endif
|
||||
boost::detail::win32::detail::gettickcount64_t p =
|
||||
(boost::detail::win32::detail::gettickcount64_t)boost::winapi::get_proc_address(hKernel32, "GetTickCount64");
|
||||
#if defined(BOOST_GCC) && BOOST_GCC >= 80000
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
if (p)
|
||||
{
|
||||
// Use native API
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <boost/thread/detail/config.hpp>
|
||||
|
||||
|
||||
#if defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
#if defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
|
||||
#include <boost/thread/detail/tss_hooks.hpp>
|
||||
|
||||
@@ -73,7 +73,7 @@ namespace boost
|
||||
}
|
||||
}
|
||||
|
||||
#else //defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
#else //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// Prevent LNK4221 warning with link=static
|
||||
@@ -82,4 +82,4 @@ namespace boost { namespace link_static_warning_inhibit {
|
||||
} }
|
||||
#endif
|
||||
|
||||
#endif //defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
#endif //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_DLL)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <boost/winapi/config.hpp>
|
||||
#include <boost/thread/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_LIB)
|
||||
#if defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_LIB)
|
||||
|
||||
#if (defined(__MINGW32__) && !defined(_WIN64)) || defined(__MINGW64__) || (__MINGW64_VERSION_MAJOR)
|
||||
|
||||
@@ -334,4 +334,4 @@ namespace boost
|
||||
|
||||
#endif //defined(_MSC_VER) && !defined(UNDER_CE)
|
||||
|
||||
#endif //defined(BOOST_HAS_WINTHREADS) && defined(BOOST_THREAD_BUILD_LIB)
|
||||
#endif //defined(BOOST_THREAD_WIN32) && defined(BOOST_THREAD_BUILD_LIB)
|
||||
|
||||
@@ -208,6 +208,36 @@ rule thread-compile-fail ( sources : reqs * : name )
|
||||
;
|
||||
}
|
||||
|
||||
rule clang-thread-safety ( properties * )
|
||||
{
|
||||
if <toolset>clang in $(properties)
|
||||
{
|
||||
return <cxxflags>-Werror=thread-safety <define>BOOST_THREAD_ENABLE_THREAD_SAFETY_ANALYSIS ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return <build>no ;
|
||||
}
|
||||
}
|
||||
|
||||
rule thread-safety-compile ( sources : reqs * : name )
|
||||
{
|
||||
return
|
||||
[ compile $(sources)
|
||||
: $(reqs) <conditional>@clang-thread-safety
|
||||
: $(name) ]
|
||||
;
|
||||
}
|
||||
|
||||
rule thread-safety-compile-fail ( sources : reqs * : name )
|
||||
{
|
||||
return
|
||||
[ compile-fail $(sources)
|
||||
: $(reqs) <conditional>@clang-thread-safety
|
||||
: $(name) ]
|
||||
;
|
||||
}
|
||||
|
||||
rule thread-compile ( sources : reqs * : name )
|
||||
{
|
||||
return
|
||||
@@ -266,8 +296,8 @@ rule thread-compile ( sources : reqs * : name )
|
||||
#[ thread-test test_vhh_shared_mutex_timed_locks.cpp ]
|
||||
;
|
||||
|
||||
#explicit t_futures ;
|
||||
test-suite t_futures
|
||||
explicit t_futures_too_long ;
|
||||
test-suite t_futures_too_long
|
||||
:
|
||||
[ thread-test test_futures.cpp ]
|
||||
;
|
||||
@@ -461,6 +491,10 @@ rule thread-compile ( sources : reqs * : name )
|
||||
:
|
||||
[ thread-compile-fail ./sync/mutual_exclusion/locks/lock_guard/copy_assign_fail.cpp : : lock_guard__cons__copy_assign_f ]
|
||||
[ thread-compile-fail ./sync/mutual_exclusion/locks/lock_guard/copy_ctor_fail.cpp : : lock_guard__cons__copy_ctor_f ]
|
||||
[ thread-safety-compile ./sync/mutual_exclusion/locks/lock_guard/lock_guard_compile_pass.cpp : : lock_guard__lock_compile_p ]
|
||||
[ thread-safety-compile-fail ./sync/mutual_exclusion/locks/lock_guard/lock_guard_compile_fail.cpp : : lock_guard__lock_compile_f ]
|
||||
[ thread-safety-compile ./sync/mutual_exclusion/locks/lock_guard/lock_guard_adopt_lock_compile_pass.cpp : : lock_guard__adopt_lock_compile_p ]
|
||||
[ thread-safety-compile-fail ./sync/mutual_exclusion/locks/lock_guard/lock_guard_adopt_lock_compile_fail.cpp : : lock_guard__adopt_lock_compile_f ]
|
||||
[ thread-run2-noit ./sync/mutual_exclusion/locks/lock_guard/adopt_lock_pass.cpp : lock_guard__cons__adopt_lock_p ]
|
||||
[ thread-run2-noit ./sync/mutual_exclusion/locks/lock_guard/default_pass.cpp : lock_guard__cons__default_p ]
|
||||
[ thread-run2-noit ./sync/mutual_exclusion/locks/lock_guard/types_pass.cpp : lock_guard__types_p ]
|
||||
@@ -615,6 +649,12 @@ rule thread-compile ( sources : reqs * : name )
|
||||
:
|
||||
[ thread-compile-fail ./sync/mutual_exclusion/mutex/assign_fail.cpp : : mutex__assign_f ]
|
||||
[ thread-compile-fail ./sync/mutual_exclusion/mutex/copy_fail.cpp : : mutex__copy_f ]
|
||||
[ thread-safety-compile ./sync/mutual_exclusion/mutex/lock_compile_pass.cpp : : mutex__lock_compile_p ]
|
||||
[ thread-safety-compile-fail ./sync/mutual_exclusion/mutex/lock_compile_fail.cpp : : mutex__lock_compile_f ]
|
||||
# https://bugs.llvm.org/show_bug.cgi?id=32954
|
||||
# http://clang-developers.42468.n3.nabble.com/thread-safety-warnings-specifically-try-acquire-capability-td4059337.html
|
||||
#[ thread-safety-compile ./sync/mutual_exclusion/mutex/try_lock_compile_pass.cpp : : mutex__try_lock_compile_p ]
|
||||
[ thread-safety-compile-fail ./sync/mutual_exclusion/mutex/try_lock_compile_fail.cpp : : mutex__try_lock_compile_f ]
|
||||
[ thread-run2-noit ./sync/mutual_exclusion/mutex/default_pass.cpp : mutex__default_p ]
|
||||
[ thread-run2-noit ./sync/mutual_exclusion/mutex/lock_pass.cpp : mutex__lock_p ]
|
||||
[ thread-run2-noit-pthread ./sync/mutual_exclusion/mutex/native_handle_pass.cpp : mutex__native_handle_p ]
|
||||
@@ -775,6 +815,12 @@ rule thread-compile ( sources : reqs * : name )
|
||||
[ thread-run2-noit ./threads/container/thread_ptr_list_pass.cpp : container__thread_ptr_list_p ]
|
||||
;
|
||||
|
||||
explicit ts_examples_too_long ;
|
||||
test-suite ts_examples_too_long
|
||||
:
|
||||
[ thread-run2 ../example/shared_mutex.cpp : ex_shared_mutex ]
|
||||
;
|
||||
|
||||
#explicit ts_examples ;
|
||||
test-suite ts_examples
|
||||
:
|
||||
@@ -790,7 +836,6 @@ rule thread-compile ( sources : reqs * : name )
|
||||
[ thread-run2-noit ../example/tss.cpp : ex_tss ]
|
||||
[ thread-run2 ../example/xtime.cpp : ex_xtime ]
|
||||
[ thread-run2 ../example/shared_monitor.cpp : ex_shared_monitor ]
|
||||
[ thread-run2 ../example/shared_mutex.cpp : ex_shared_mutex ]
|
||||
#[ thread-run ../example/vhh_shared_monitor.cpp ]
|
||||
#[ thread-run ../example/vhh_shared_mutex.cpp ]
|
||||
[ thread-run2 ../example/make_future.cpp : ex_make_future ]
|
||||
@@ -971,7 +1016,8 @@ rule thread-compile ( sources : reqs * : name )
|
||||
#[ thread-run test_11796.cpp ]
|
||||
#[ thread-run test_12293.cpp ]
|
||||
#[ thread-run test_12949.cpp ]
|
||||
[ thread-run test_13480b.cpp ]
|
||||
#[ thread-run test_13480b.cpp ]
|
||||
[ thread-run test_13561.cpp ]
|
||||
|
||||
;
|
||||
|
||||
|
||||
@@ -237,5 +237,5 @@ int main()
|
||||
test_chrono_wait_function(wait_for_with_pred);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -67,12 +67,14 @@ void f()
|
||||
Clock::time_point t1 = Clock::now();
|
||||
if (runs == 0)
|
||||
{
|
||||
assert(t1 - t0 < max_diff);
|
||||
ns d = t1 - t0;
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
assert(test2 != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(t1 - t0 - Clock::duration(250) < max_diff);
|
||||
ns d = t1 - t0 - Clock::duration(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
assert(test2 == 0);
|
||||
}
|
||||
++runs;
|
||||
|
||||
@@ -237,5 +237,5 @@ int main()
|
||||
test_chrono_wait_function(wait_for_with_pred);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ int main()
|
||||
BOOST_TEST(!p0.valid());
|
||||
BOOST_TEST(!p.valid());
|
||||
}
|
||||
return boost::report_errors();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -205,7 +205,6 @@ int main()
|
||||
BOOST_TEST(all.valid());
|
||||
BOOST_TEST(! all.is_ready());
|
||||
pt1();
|
||||
BOOST_TEST(! all.is_ready());
|
||||
pt2();
|
||||
boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
|
||||
BOOST_TEST(all.is_ready());
|
||||
|
||||
@@ -169,7 +169,6 @@ int main()
|
||||
BOOST_TEST(all.valid());
|
||||
BOOST_TEST(! all.is_ready());
|
||||
pt1();
|
||||
BOOST_TEST(! all.is_ready());
|
||||
pt2();
|
||||
boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
|
||||
BOOST_TEST(all.is_ready());
|
||||
|
||||
@@ -30,6 +30,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
boost::mutex m;
|
||||
|
||||
@@ -38,15 +40,12 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
m.lock();
|
||||
boost::lock_guard<boost::mutex> lg(m, boost::adopt_lock);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -65,11 +64,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -39,14 +41,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::lock_guard<boost::mutex> lg(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -64,10 +63,21 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright (C) 2018 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/lock_guard.hpp>
|
||||
|
||||
// template <class Mutex> class lock_guard;
|
||||
|
||||
// lock_guard(Mutex& m_, adopt_lock_t)
|
||||
|
||||
#include <boost/thread/lock_guard.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
boost::mutex m;
|
||||
|
||||
void fail()
|
||||
{
|
||||
boost::lock_guard<boost::mutex> lk(m, boost::adopt_lock);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2018 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/lock_guard.hpp>
|
||||
|
||||
// template <class Mutex> class lock_guard;
|
||||
|
||||
// lock_guard(Mutex& m_, adopt_lock_t)
|
||||
|
||||
#include <boost/thread/lock_guard.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
boost::mutex m;
|
||||
|
||||
void pass()
|
||||
{
|
||||
m.lock();
|
||||
boost::lock_guard<boost::mutex> lk(m, boost::adopt_lock);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2018 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/lock_guard.hpp>
|
||||
|
||||
// template <class Mutex> class lock_guard;
|
||||
|
||||
// lock_guard(Mutex& m_)
|
||||
|
||||
#include <boost/thread/lock_guard.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
boost::mutex m;
|
||||
|
||||
void fail()
|
||||
{
|
||||
boost::lock_guard<boost::mutex> lk0(m);
|
||||
boost::lock_guard<boost::mutex> lk1(m);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright (C) 2018 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/lock_guard.hpp>
|
||||
|
||||
// template <class Mutex> class lock_guard;
|
||||
|
||||
// lock_guard(Mutex& m_)
|
||||
|
||||
#include <boost/thread/lock_guard.hpp>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
boost::mutex m;
|
||||
|
||||
void pass()
|
||||
{
|
||||
{
|
||||
boost::lock_guard<boost::mutex> lk0(m);
|
||||
}
|
||||
boost::lock_guard<boost::mutex> lk1(m);
|
||||
}
|
||||
@@ -32,6 +32,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
boost::mutex m;
|
||||
|
||||
@@ -42,16 +44,13 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
m.lock();
|
||||
auto&& lg = boost::make_lock_guard(m, boost::adopt_lock); (void)lg;
|
||||
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -72,10 +71,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -42,27 +44,33 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
const auto&& lg = boost::make_lock_guard(m); (void)lg;
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD && defined BOOST_THREAD_USES_CHRONO
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
|
||||
@@ -22,6 +22,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -31,15 +33,12 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::mutex> lg(m);
|
||||
{
|
||||
boost::nested_strict_lock<boost::unique_lock<boost::mutex> > nlg(lg);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -59,10 +58,21 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
||||
@@ -24,6 +24,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -34,28 +36,34 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::mutex> lg(m);
|
||||
{
|
||||
const auto&& nlg = boost::make_nested_strict_lock(lg); (void)nlg;
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK && defined BOOST_THREAD_USES_CHRONO
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
|
||||
@@ -28,30 +28,30 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -61,9 +61,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,14 +42,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> ul(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -65,12 +64,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,30 +27,30 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, Clock::now() + ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, Clock::now() + ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -60,9 +60,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,7 +42,7 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
@@ -56,11 +58,11 @@ void f()
|
||||
for (;;)
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> lk(m, boost::try_to_lock);
|
||||
if (lk.owns_lock()) break;
|
||||
if (lk.owns_lock()) {
|
||||
t1 = Clock::now();
|
||||
break;
|
||||
}
|
||||
}
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
// time_point t0 = Clock::now();
|
||||
// {
|
||||
@@ -91,12 +93,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,11 +28,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -42,12 +44,10 @@ void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
boost::shared_lock < boost::shared_mutex > lk(m, boost::defer_lock);
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
lk.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
try
|
||||
{
|
||||
lk.lock();
|
||||
@@ -104,12 +104,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,15 +42,12 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
m.lock_shared();
|
||||
boost::shared_lock_guard<boost::shared_mutex> lg(m, boost::adopt_lock);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -67,12 +66,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -41,14 +43,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::shared_lock_guard<boost::shared_mutex> lg(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -66,11 +65,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -30,14 +32,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::strict_lock<boost::mutex> lg(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -55,10 +54,21 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#ifdef BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
boost::mutex m;
|
||||
@@ -33,8 +35,7 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
const auto&& lg = boost::make_strict_lock(m); (void)lg;
|
||||
t1 = Clock::now();
|
||||
@@ -47,13 +48,22 @@ void f()
|
||||
int main()
|
||||
{
|
||||
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_STRICT_LOCK
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_STRICT_LOCK && defined BOOST_THREAD_USES_CHRONO
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
|
||||
@@ -32,32 +32,32 @@
|
||||
|
||||
boost::timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::timed_mutex> lk(m, ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::timed_mutex> lk(m, ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_TEST(d < max_diff);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
int main()
|
||||
@@ -65,9 +65,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -23,11 +23,13 @@ boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -36,8 +38,7 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
|
||||
auto
|
||||
@@ -48,8 +49,6 @@ void f()
|
||||
_ = boost::make_unique_lock(m); (void)_;
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -73,12 +72,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
//#else
|
||||
|
||||
@@ -20,11 +20,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -34,7 +36,7 @@ void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
|
||||
auto
|
||||
#else
|
||||
@@ -42,12 +44,12 @@ void f()
|
||||
#endif
|
||||
lk = boost::make_unique_lock(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0;
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
|
||||
auto
|
||||
#else
|
||||
@@ -55,12 +57,12 @@ void f()
|
||||
#endif
|
||||
lk = boost::make_unique_lock(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0;
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
|
||||
auto
|
||||
#else
|
||||
@@ -68,12 +70,12 @@ void f()
|
||||
#endif
|
||||
lk = boost::make_unique_lock(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0;
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
for (;;)
|
||||
{
|
||||
#if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
|
||||
@@ -82,11 +84,11 @@ void f()
|
||||
boost::unique_lock<boost::mutex>
|
||||
#endif
|
||||
lk = boost::make_unique_lock(m, boost::try_to_lock);
|
||||
if (lk.owns_lock()) break;
|
||||
if (lk.owns_lock()) {
|
||||
t1 = Clock::now();
|
||||
break;
|
||||
}
|
||||
}
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
#else
|
||||
// time_point t0 = Clock::now();
|
||||
@@ -123,11 +125,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -25,11 +25,13 @@ boost::mutex m3;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -38,14 +40,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
auto&& _ = boost::make_unique_locks(m1,m2,m3); (void)_;
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -65,7 +64,9 @@ int main()
|
||||
m3.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m1.unlock();
|
||||
@@ -73,6 +74,15 @@ int main()
|
||||
m3.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
#else
|
||||
|
||||
@@ -30,11 +30,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -43,14 +45,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::unique_lock<boost::mutex> ul(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -68,12 +67,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -31,30 +31,30 @@
|
||||
|
||||
boost::timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::timed_mutex> lk(m, Clock::now() + ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::unique_lock<boost::timed_mutex> lk(m, Clock::now() + ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_TEST(d < max_diff);
|
||||
}
|
||||
@@ -64,9 +64,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -29,11 +29,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -42,7 +44,7 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::unique_lock<boost::mutex> lk(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
@@ -58,12 +60,12 @@ void f()
|
||||
for (;;)
|
||||
{
|
||||
boost::unique_lock<boost::mutex> lk(m, boost::try_to_lock);
|
||||
if (lk.owns_lock()) break;
|
||||
if (lk.owns_lock()) {
|
||||
t1 = Clock::now();
|
||||
break;
|
||||
}
|
||||
}
|
||||
time_point t1 = Clock::now();
|
||||
//m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
// time_point t0 = Clock::now();
|
||||
// {
|
||||
@@ -94,12 +96,25 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
std::cout << "d_ns: " << d_ns.count() << std::endl;
|
||||
std::cout << "d_ms: " << d_ms.count() << std::endl;
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,11 +28,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -42,12 +44,10 @@ void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
boost::unique_lock < boost::mutex > lk(m, boost::defer_lock);
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
lk.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
try
|
||||
{
|
||||
lk.lock();
|
||||
@@ -104,12 +104,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -30,30 +30,30 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -63,9 +63,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -29,11 +29,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -42,16 +44,11 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
time_point t1;
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::upgrade_lock<boost::shared_mutex> ul(m);
|
||||
t1 = Clock::now();
|
||||
}
|
||||
ns d = t1 - t0 - ms(250);
|
||||
std::cout << "diff= " << d.count() << std::endl;
|
||||
std::cout << "max_diff= " << max_diff.count() << std::endl;
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//time_point t1;
|
||||
@@ -69,12 +66,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -29,30 +29,30 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, Clock::now() + ms(750));
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
time_point t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
t1 = Clock::now();
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, Clock::now() + ms(250));
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -62,9 +62,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -28,11 +28,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -41,7 +43,7 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
{
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, boost::try_to_lock);
|
||||
BOOST_TEST(lk.owns_lock() == false);
|
||||
@@ -57,12 +59,12 @@ void f()
|
||||
for (;;)
|
||||
{
|
||||
boost::upgrade_lock<boost::shared_mutex> lk(m, boost::try_to_lock);
|
||||
if (lk.owns_lock()) break;
|
||||
if (lk.owns_lock()) {
|
||||
t1 = Clock::now();
|
||||
break;
|
||||
}
|
||||
}
|
||||
time_point t1 = Clock::now();
|
||||
//m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
// time_point t0 = Clock::now();
|
||||
// {
|
||||
@@ -93,12 +95,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,11 +28,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -42,12 +44,10 @@ void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
boost::upgrade_lock < boost::shared_mutex > lk(m, boost::defer_lock);
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
lk.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(lk.owns_lock() == true);
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
try
|
||||
{
|
||||
lk.lock();
|
||||
@@ -104,12 +104,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
19
test/sync/mutual_exclusion/mutex/lock_compile_fail.cpp
Normal file
19
test/sync/mutual_exclusion/mutex/lock_compile_fail.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
// Copyright (C) 2017 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/mutex.hpp>
|
||||
|
||||
// class mutex;
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
void fail()
|
||||
{
|
||||
boost::mutex m0;
|
||||
m0.lock();
|
||||
m0.lock();
|
||||
m0.unlock();
|
||||
}
|
||||
18
test/sync/mutual_exclusion/mutex/lock_compile_pass.cpp
Normal file
18
test/sync/mutual_exclusion/mutex/lock_compile_pass.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (C) 2017 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/mutex.hpp>
|
||||
|
||||
// class mutex;
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
void pass()
|
||||
{
|
||||
boost::mutex m0;
|
||||
m0.lock();
|
||||
m0.unlock();
|
||||
}
|
||||
@@ -26,11 +26,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -39,12 +41,10 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
m.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
m.lock();
|
||||
@@ -60,11 +60,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
19
test/sync/mutual_exclusion/mutex/try_lock_compile_fail.cpp
Normal file
19
test/sync/mutual_exclusion/mutex/try_lock_compile_fail.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
// Copyright (C) 2017 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/mutex.hpp>
|
||||
|
||||
// class mutex;
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
void fail()
|
||||
{
|
||||
boost::mutex m0;
|
||||
if (!m0.try_lock()) {
|
||||
m0.unlock();
|
||||
}
|
||||
}
|
||||
19
test/sync/mutual_exclusion/mutex/try_lock_compile_pass.cpp
Normal file
19
test/sync/mutual_exclusion/mutex/try_lock_compile_pass.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
// Copyright (C) 2017 Tom Hughes
|
||||
//
|
||||
// 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)
|
||||
|
||||
// <boost/thread/mutex.hpp>
|
||||
|
||||
// class mutex;
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
void pass()
|
||||
{
|
||||
boost::mutex m0;
|
||||
if (m0.try_lock()) {
|
||||
m0.unlock();
|
||||
}
|
||||
}
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#endif
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
@@ -39,16 +41,14 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
while (!m.try_lock())
|
||||
;
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//BOOST_TEST(!m.try_lock());
|
||||
@@ -69,11 +69,22 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
boost::null_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
boost::null_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
boost::null_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::recursive_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,14 +42,12 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
m.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.lock();
|
||||
m.unlock();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
m.lock();
|
||||
@@ -65,12 +65,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::recursive_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,18 +42,16 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
// BOOST_TEST(!m.try_lock());
|
||||
// BOOST_TEST(!m.try_lock());
|
||||
// BOOST_TEST(!m.try_lock());
|
||||
while (!m.try_lock())
|
||||
;
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(m.try_lock());
|
||||
m.unlock();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//BOOST_TEST(!m.try_lock());
|
||||
@@ -73,12 +73,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::recursive_timed_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,14 +42,12 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
m.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.lock();
|
||||
m.unlock();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
m.lock();
|
||||
@@ -65,12 +65,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,24 +28,24 @@
|
||||
|
||||
boost::recursive_timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_for(ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(m.try_lock());
|
||||
m.unlock();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
@@ -62,9 +62,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -26,11 +26,13 @@
|
||||
boost::recursive_timed_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -39,18 +41,16 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
while (!m.try_lock())
|
||||
;
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
BOOST_TEST(m.try_lock());
|
||||
m.unlock();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//BOOST_TEST(!m.try_lock());
|
||||
@@ -72,12 +72,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,29 +28,29 @@
|
||||
|
||||
boost::recursive_timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(250)) == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -60,9 +60,20 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -26,11 +26,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -39,12 +41,10 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
m.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
m.lock();
|
||||
@@ -60,12 +60,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,29 +26,29 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_for(ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_for(ms(250)) == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -58,9 +58,20 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -26,11 +26,13 @@
|
||||
boost::shared_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -39,16 +41,14 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
while (!m.try_lock())
|
||||
;
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//BOOST_TEST(!m.try_lock());
|
||||
@@ -68,12 +68,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,29 +26,29 @@
|
||||
|
||||
boost::shared_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(250)) == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -58,9 +58,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -26,11 +26,13 @@
|
||||
boost::timed_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -39,12 +41,10 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
m.lock();
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
m.lock();
|
||||
@@ -60,12 +60,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,29 +28,29 @@
|
||||
|
||||
boost::timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_for(ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_for(ms(250)) == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -60,9 +60,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
@@ -27,11 +27,13 @@
|
||||
boost::timed_mutex m;
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
typedef boost::chrono::system_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
#else
|
||||
#endif
|
||||
|
||||
@@ -40,16 +42,14 @@ const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
void f()
|
||||
{
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
BOOST_TEST(!m.try_lock());
|
||||
while (!m.try_lock())
|
||||
;
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
#else
|
||||
//time_point t0 = Clock::now();
|
||||
//BOOST_TEST(!m.try_lock());
|
||||
@@ -69,12 +69,23 @@ int main()
|
||||
m.lock();
|
||||
boost::thread t(f);
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
#else
|
||||
#endif
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
#if defined BOOST_THREAD_USES_CHRONO
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,29 +28,29 @@
|
||||
|
||||
boost::timed_mutex m;
|
||||
|
||||
typedef boost::chrono::steady_clock Clock;
|
||||
typedef boost::chrono::high_resolution_clock Clock;
|
||||
typedef Clock::time_point time_point;
|
||||
typedef Clock::duration duration;
|
||||
typedef boost::chrono::milliseconds ms;
|
||||
typedef boost::chrono::nanoseconds ns;
|
||||
time_point t0;
|
||||
time_point t1;
|
||||
|
||||
const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
|
||||
|
||||
void f1()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(750)) == true);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
m.unlock();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
|
||||
void f2()
|
||||
{
|
||||
time_point t0 = Clock::now();
|
||||
t0 = Clock::now();
|
||||
BOOST_TEST(m.try_lock_until(Clock::now() + ms(250)) == false);
|
||||
time_point t1 = Clock::now();
|
||||
t1 = Clock::now();
|
||||
ns d = t1 - t0 - ms(250);
|
||||
BOOST_THREAD_TEST_IT(d, ns(max_diff));
|
||||
}
|
||||
@@ -60,9 +60,18 @@ int main()
|
||||
{
|
||||
m.lock();
|
||||
boost::thread t(f1);
|
||||
time_point t2 = Clock::now();
|
||||
boost::this_thread::sleep_for(ms(250));
|
||||
time_point t3 = Clock::now();
|
||||
m.unlock();
|
||||
t.join();
|
||||
|
||||
ns sleep_time = t3 - t2;
|
||||
ns d_ns = t1 - t0 - sleep_time;
|
||||
ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns);
|
||||
// BOOST_TEST_GE(d_ms.count(), 0);
|
||||
BOOST_THREAD_TEST_IT(d_ms, max_diff);
|
||||
BOOST_THREAD_TEST_IT(d_ns, ns(max_diff));
|
||||
}
|
||||
{
|
||||
m.lock();
|
||||
|
||||
17
test/test_13561.cpp
Normal file
17
test/test_13561.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
// Copyright (C) 2018 Vicente Botet
|
||||
//
|
||||
// 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)
|
||||
|
||||
#define BOOST_THREAD_VERSION 4
|
||||
|
||||
#include <boost/thread/detail/nullary_function.hpp>
|
||||
#include <boost/system/detail/error_code.ipp>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
boost::detail::nullary_function<void ()> f1;
|
||||
auto f2 = f1;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ void run_thread() {
|
||||
}
|
||||
|
||||
int main() {
|
||||
boost::thread t(run_thread);
|
||||
boost::thread t(&run_thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -179,13 +179,13 @@ namespace
|
||||
|
||||
void do_test_notify_all_following_notify_one_wakes_all_threads()
|
||||
{
|
||||
boost::thread thread1(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread2(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread1(&wait_for_condvar_and_increase_count);
|
||||
boost::thread thread2(&wait_for_condvar_and_increase_count);
|
||||
|
||||
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
|
||||
multiple_wake_cond.notify_one();
|
||||
|
||||
boost::thread thread3(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread3(&wait_for_condvar_and_increase_count);
|
||||
|
||||
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
|
||||
multiple_wake_cond.notify_one();
|
||||
|
||||
@@ -114,13 +114,13 @@ namespace
|
||||
|
||||
void do_test_multiple_notify_one_calls_wakes_multiple_threads()
|
||||
{
|
||||
boost::thread thread1(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread2(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread1(&wait_for_condvar_and_increase_count);
|
||||
boost::thread thread2(&wait_for_condvar_and_increase_count);
|
||||
|
||||
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
|
||||
multiple_wake_cond.notify_one();
|
||||
|
||||
boost::thread thread3(wait_for_condvar_and_increase_count);
|
||||
boost::thread thread3(&wait_for_condvar_and_increase_count);
|
||||
|
||||
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
|
||||
multiple_wake_cond.notify_one();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user