2
0
mirror of https://github.com/boostorg/thread.git synced 2026-02-03 09:42:16 +00:00

Compare commits

..

77 Commits

Author SHA1 Message Date
Vicente J. Botet Escriba
8d0f077ab2 Merge branch 'develop' 2018-11-15 06:45:24 +01:00
Vicente J. Botet Escriba
dfe6cc3c49 Remove Niall as maintainer 2018-11-15 06:44:45 +01:00
Vicente J. Botet Escriba
330a0a15e6 Merge branch 'develop' 2018-11-14 23:27:25 +01:00
Vicente J. Botet Escriba
f60dfdfad9 Merge pull request #247 from Romain-Geissler-1A/noexcept
Remove all "throw()" specification to prepare for C++20 where it is r…
2018-11-12 19:30:24 +01:00
Romain Geissler
ccb1b99e3f Remove all "throw()" specification to prepare for C++20 where it is removed. 2018-11-11 22:24:38 +00:00
Vicente J. Botet Escriba
aa444afc5c Merge branch 'develop' 2018-11-01 07:57:44 +01:00
Vicente J. Botet Escriba
f1d464d0d5 added cygwin platform configuration. 2018-10-25 04:18:27 +02:00
Vicente J. Botet Escriba
57161ddbb6 Merge pull request #246 from Kojoley/patch-1
DOC: Fixed a small typo
2018-10-25 03:45:06 +02:00
Nikita Kniazev
9a7d21444f DOC: Fixed a small typo 2018-10-24 23:13:43 +03:00
Vicente J. Botet Escriba
1b2bc4e451 Merge branch 'develop' 2018-10-20 19:04:45 +02:00
Vicente J. Botet Escriba
e1b5f9d786 Try to catch the CircleCi clang issues. 2018-10-18 18:59:49 +02:00
Vicente J. Botet Escriba
8b5cd5f02a Merge branch 'develop' of https://github.com/boostorg/thread into develop 2018-10-18 07:35:50 +02:00
Vicente J. Botet Escriba
5b2ffe7104 try to fix decay_copy issue with reference to functions: function cannot return function type 2018-10-17 20:54:21 +02:00
Vicente J. Botet Escriba
5af180ba36 Merge pull request #244 from boostorg/pr/fix-cygwin-win32
Fix uses of BOOST_HAS_WINTHREADS (not correct on Cygwin)
2018-10-16 21:52:45 +02:00
Vicente J. Botet Escriba
340cc5ab61 Try to catch the CircleCi clang issues. 2018-10-16 00:02:31 +02:00
Vicente J. Botet Escriba
9a3b8bb4b0 Try to catch the CircleCi issue. 2018-10-15 07:10:05 +02:00
Vicente J. Botet Escriba
79f955e229 Try to catch the CircleCi issue. 2018-10-14 09:55:47 +02:00
Vicente J. Botet Escriba
1da2a57124 Try to catch the CircleCi issue. 2018-10-13 15:24:58 +02:00
Peter Dimov
54871e21a1 Fix uses of BOOST_HAS_WINTHREADS (not correct on Cygwin) 2018-10-13 04:56:08 +03:00
Vicente J. Botet Escriba
00efec75d9 Merge branch 'develop' 2018-10-13 02:12:28 +02:00
Vicente J. Botet Escriba
c66c4b1c76 Don't report unusable-partial-specialization due to type_traits #93 issue. 2018-10-11 07:28:20 +02:00
Vicente J. Botet Escriba
6c70eccb01 Merge branch 'develop' 2018-10-11 06:58:26 +02:00
Vicente J. Botet Escriba
fbf8d58ad7 Set time limit to 60s 2018-10-10 18:54:23 +02:00
Vicente J. Botet Escriba
46a94dd8ba Extract test too long. 2018-10-10 06:04:17 +02:00
Vicente J. Botet Escriba
76c7b25d4b Extract test too long. 2018-10-09 21:17:24 +02:00
Vicente J. Botet Escriba
eb297ce86c Merge branch 'develop' 2018-10-09 20:59:21 +02:00
Vicente J. Botet Escriba
cc31d32b3f Merge pull request #243 from Kojoley/execution_monitor-use_mutex-sleep
execution_monitor::use_mutex sleeps the whole timeout duration
2018-10-09 06:25:40 +02:00
Nikita Kniazev
7f258e5da3 execution_monitor::use_mutex sleeps the whole timeout duration
Instead of sleeping the whole timeout duration, sleep for 500ms
in a loop and check every iteration if the job was already done.
2018-10-08 22:34:37 +03:00
Vicente J. Botet Escriba
c3897bea65 Merge pull request #242 from Kojoley/ci-added-tests-timeout
CI: Limit single test execution time to 30 seconds
2018-10-08 20:34:20 +02:00
Vicente J. Botet Escriba
502876f0e9 Merge branch 'develop' 2018-10-07 19:41:15 +02:00
Vicente J. Botet Escriba
e1e4cbf4be Merge pull request #240 from Kojoley/fix-lockable_traits
Fixed lockable_traits bugs
2018-10-07 19:07:49 +02:00
Nikita Kniazev
d2679fec89 CI: Limit single test execution time to 30 seconds
It should help identify hanging tests that push CI over build time limit.
2018-10-05 20:11:18 +03:00
Vicente J. Botet Escriba
ba5632e33a Merge pull request #241 from Kojoley/suppress-varadic-macro-warnings
Suppress variadic macro warnings
2018-10-05 06:59:50 +02:00
Nikita Kniazev
9a3b7ff859 Suppress variadic macro warnings
The workaround was stolen from `boost/static_assert.hpp` and works in Clang too
2018-10-05 00:47:03 +03:00
Nikita Kniazev
a35ffa3a83 lockable_traits: Use decltype based methods detection
Traits does not detect methods with `noexcept` qualifiers which are part of
function type in C++17 (P0012R1).
2018-10-04 18:36:38 +03:00
Vicente J. Botet Escriba
1a8229160e Merge branch 'develop' 2018-10-01 05:58:16 +02:00
Vicente J. Botet Escriba
acda67baf4 Merge pull request #234 from DjArt/develop
Fixing compiling on VS2017 for ARM & ARM64
2018-10-01 05:49:15 +02:00
Vicente J. Botet Escriba
f6609a42dc Merge pull request #235 from boostorg/pr/fix-detail-winapi
Fix boost::detail::winapi references
2018-09-27 20:42:07 +02:00
Peter Dimov
534f5af9e6 Fix boost::detail::winapi references 2018-09-27 08:58:47 +03:00
Vicente J. Botet Escriba
2be8908dcd Merge branch 'develop' 2018-09-23 15:54:09 +02:00
Vicente J. Botet Escriba
aaca72e34b Fix __attribute(()) syntax typo. 2018-09-23 15:53:28 +02:00
Vicente J. Botet Escriba
24404dcae4 Merge branch 'develop' 2018-09-15 21:03:10 +02:00
Vicente J. Botet Escriba
f4b239bab1 fix <:: 2018-09-15 10:17:54 +02:00
Vicente J. Botet Escriba
bf7e79c709 fix <:: 2018-09-15 10:16:25 +02:00
Vicente J. Botet Escriba
526e2d6554 Merge branch 'develop' 2018-09-15 08:56:22 +02:00
Vicente J. Botet Escriba
8c1d232b8c try to manage with #11477. 2018-09-15 07:11:37 +02:00
Vicente J. Botet Escriba
92a5bc4300 manage with #232 2018-09-15 07:10:05 +02:00
Dj Art
0389f58f23 Fixing compiling on VS2017 for ARM & ARM64 2018-09-15 03:15:04 +08:00
Vicente J. Botet Escriba
5b209c2e83 try to fix thread safety issues raised on FreeBSD. 2018-09-10 23:52:48 +02:00
Vicente J. Botet Escriba
33ad8b1834 Merge branch 'develop' of https://github.com/boostorg/thread into develop 2018-09-06 21:12:13 +02:00
Vicente J. Botet Escriba
8fb92dfb52 Merge pull request #231 from ffontaine/develop
fix static detection of lock-free atomic ints
2018-09-06 21:03:20 +02:00
Vicente J. Botet Escriba
c550979eff Merge branch 'develop' of https://github.com/boostorg/thread into develop 2018-09-06 07:16:29 +02:00
Vicente J. Botet Escriba
15f2d7a21c fix test not returning boost::report_errors(). 2018-09-06 07:16:17 +02:00
Vicente J. Botet Escriba
371fb42709 Merge pull request #229 from huangqinjin/develop
fix compilation with BOOST_NO_EXCEPTIONS
2018-09-06 06:54:27 +02:00
Fabrice Fontaine
f7581a3662 fix static detection of lock-free atomic ints
When build statically, boost is unable to detect lock-free atomics ints
because it tries to link dynamically with boost_system, see
output/build/boost-1.67.0/bin.v2/config.log (with -d5 option):

Using shell: /bin/sh -c
    argv[0] = '/bin/sh'
    argv[1] = '-c'
    argv[2] = '
    "/home/fabrice/buildroot/output/host/bin/arm-linux-g++"   -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os   -Wl,-elf2flt -static  -Wl,-elf2flt -static -fPIC -pthread -O0 -fno-inline -Wall -pedantic -g -Wextra -Wno-long-long -Wno-unused-parameter -Wunused-function -pedantic -DBOOST_ALL_NO_LIB=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_THREAD_BUILD_DLL=1  -I"." -c -o "bin.v2/libs/thread/build/gcc-6.4.0/debug/threading-multi/has_atomic_flag_lockfree_test.o" "libs/thread/src/../build/has_atomic_flag_lockfree_test.cpp"
'
gcc.compile.c++ bin.v2/libs/thread/build/gcc-6.4.0/debug/threading-multi/has_atomic_flag_lockfree_test.o

    "/home/fabrice/buildroot/output/host/bin/arm-linux-g++"   -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os   -Wl,-elf2flt -static  -Wl,-elf2flt -static -fPIC -pthread -O0 -fno-inline -Wall -pedantic -g -Wextra -Wno-long-long -Wno-unused-parameter -Wunused-function -pedantic -DBOOST_ALL_NO_LIB=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_THREAD_BUILD_DLL=1  -I"." -c -o "bin.v2/libs/thread/build/gcc-6.4.0/debug/threading-multi/has_atomic_flag_lockfree_test.o" "libs/thread/src/../build/has_atomic_flag_lockfree_test.cpp"

0.033561 sec system; 0.126314 sec user; 288.682473 sec clock
gcc.compile.c++ bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/error_code.o

    "/home/fabrice/buildroot/output/host/bin/arm-linux-g++"   -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -Os   -Wl,-elf2flt -static  -Wl,-elf2flt -static -fPIC -pthread -O0 -fno-inline -Wall -pedantic -g  -DBOOST_ALL_NO_LIB=1 -DBOOST_SYSTEM_DYN_LINK=1  -I"." -c -o "bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/error_code.o" "libs/system/src/error_code.cpp"

0.084060 sec system; 0.644133 sec user; 8.858824 sec clock
SEM: <s>gcc-link-semaphore now used by <pbin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi>libboost_system.so.1.67.0
Using shell: /bin/sh -c
    argv[0] = '/bin/sh'
    argv[1] = '-c'
    argv[2] = '
    "/home/fabrice/buildroot/output/host/bin/arm-linux-g++"    -o "bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/libboost_system.so.1.67.0" -Wl,-h -Wl,libboost_system.so.1.67.0 -shared -Wl,--start-group "bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/error_code.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lrt -Wl,--end-group -fPIC -pthread -g  -Wl,-elf2flt -static
'
gcc.link.dll bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/libboost_system.so.1.67.0

    "/home/fabrice/buildroot/output/host/bin/arm-linux-g++"    -o "bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/libboost_system.so.1.67.0" -Wl,-h -Wl,libboost_system.so.1.67.0 -shared -Wl,--start-group "bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/error_code.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lrt -Wl,--end-group -fPIC -pthread -g  -Wl,-elf2flt -static

ld (ld-elf2flt): -shared used without passing a shared library ID
collect2: error: ld a retourné le statut de sortie 1
0.003123 sec system; 0.004732 sec user; 15.646509 sec clock
...failed gcc.link.dll bin.v2/libs/system/build/gcc-6.4.0/debug/threading-multi/libboost_system.so.1.67.0...

To fix this, move the exe statement before the boost/thread project

Fixes:
 - http://autobuild.buildroot.org/results/f46d38991385cbc2a4fa14eb31074e770cd79803

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2018-09-05 12:24:04 +02:00
huangqinjin
e54f7e3960 fix warning: comparison of unsigned expression < 0 2018-08-31 13:53:54 +08:00
huangqinjin
d1284b02ad fix compilation with BOOST_NO_EXCEPTIONS 2018-08-31 10:54:35 +08:00
Vicente J. Botet Escriba
c5e756d196 Merge pull request #227 from kivadiu/develop
Fixed warning cast between incompatible function types from FARPROC_ to gettickcount64_t
2018-08-09 22:52:06 +02:00
Frédéric Bron
ee607c86d4 Fixed warning cast between incompatible function types from FARPROC_ to gettickcount64_t
On Windows, GetProcAddress must be cast to something useful which
generates a warning with gcc. This patch silents the warning.

Fixes issue #225
2018-08-09 10:16:05 +02:00
Vicente J. Botet Escriba
68eef9240f try to fix it for C++98. 2018-08-07 17:02:04 +02:00
Vicente J. Botet Escriba
de7608f067 manage #224: thread::physical_concurrency() allocates a buffer that is bigger than necessary. 2018-08-07 14:19:32 +02:00
Vicente J. Botet Escriba
743f2a0348 manage #226: 1.68 thread pool join do interruption. 2018-08-07 14:15:18 +02:00
Vicente J. Botet Escriba
d8d549cf3e manage #13561. 2018-08-07 13:54:35 +02:00
Vicente J. Botet Escriba
fc08c1fe28 Merge pull request #220 from thughes/feature/test_measure_sleep_time
Account for sleep time in timing tests
2018-04-28 17:47:37 +02:00
Tom Hughes
dce24d5b43 Use default test timing, except mac
The condition variable wait tests are still a little flaky on CircleCI
since we can't account for overwaiting with pthread_cond_timedwait

See https://circleci.com/gh/thughes/thread/483
2018-04-27 12:03:49 -07:00
Tom Hughes
b45ae62791 Use macro for comparison so times are printed on failure 2018-04-27 12:03:49 -07:00
Tom Hughes
b0485bafdd Reduce parallel build jobs on CircleCI
The Linux executors have 2 CPUs and the macOS executors have 4. The
build time does speed up as we increase the number of parallel jobs to
10, but the tests that rely on timing measurements start to fail.
2018-04-27 12:03:49 -07:00
Tom Hughes
3b52a8950f Subtract measured sleep time instead of constant 250 ms
boost::this_thread::sleep_for is allowed to sleep longer than the
requested sleep time. This seems to happen especially on virtualized
systems, such as CircleCI.
2018-04-27 12:03:49 -07:00
Vicente J. Botet Escriba
e60f66e023 Merge pull request #219 from thughes/feature/remove_racy_checks
Remove racy checks
2018-04-27 14:43:14 +02:00
Tom Hughes
2a68582676 Remove racy check
This check may or may not be true depending on how long it takes pt1 to
finish executing. You can verify this by adding a sleep before the check
in which case "is_ready()" is always true.
2018-04-26 07:30:43 -07:00
Tom Hughes
b7ebda0f15 Remove racy check
This check may or may not be true depending on how long it takes p1 to
finish executing. You can verify this by adding a sleep before the check
in which case "is_ready()" is always true.
2018-04-26 07:30:33 -07:00
Vicente J. Botet Escriba
7b2289a1c5 Merge pull request #212 from thughes/feature/add_thread_safety_annotations
Add clang thread-safety annotations to boost::mutex (pthread-only)
2018-04-25 19:13:05 +02:00
Tom Hughes
1874018c12 Add thread safety annotations for lock_guard 2018-03-01 15:57:00 -08:00
Tom Hughes
d78a0ca53f Remove clang toolset from target requirements
This forces clang to be used regardless of the toolset configured
2018-02-28 15:51:38 -08:00
Tom Hughes
d1ef6369d9 Fix bjam thread safety compile rules so they only build with clang 2018-02-28 13:33:09 -08:00
Tom Hughes
8ce9826d98 Prefix macros with BOOST_THREAD 2018-02-27 16:51:10 -08:00
Tom Hughes
5fa7ae14b9 Add clang thread-safety annotations to boost::mutex (pthread-only) 2018-02-27 09:30:49 -08:00
108 changed files with 1412 additions and 480 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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) ;

View File

@@ -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

View File

@@ -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.]]

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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

View File

@@ -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))))
{}

View File

@@ -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));
}

View 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

View File

@@ -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>

View File

@@ -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
{}
};

View File

@@ -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)
{

View File

@@ -18,11 +18,11 @@
#ifdef BOOST_NO_EXCEPTIONS
namespace boost
{
namespace detail {
struct shared_state_base {
void notify_deferred();
void notify_deferred() {}
};
}
}
#else

View File

@@ -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();
}

View File

@@ -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
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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()

View File

@@ -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));
}
};

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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"

View File

@@ -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>

View File

@@ -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
}
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 ]
;

View File

@@ -237,5 +237,5 @@ int main()
test_chrono_wait_function(wait_for_with_pred);
#endif
return 0;
return boost::report_errors();
}

View File

@@ -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;

View File

@@ -237,5 +237,5 @@ int main()
test_chrono_wait_function(wait_for_with_pred);
#endif
return 0;
return boost::report_errors();
}

View File

@@ -59,6 +59,7 @@ int main()
BOOST_TEST(!p0.valid());
BOOST_TEST(!p.valid());
}
return boost::report_errors();
}

View File

@@ -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());

View File

@@ -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());

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();
}

View 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();
}

View 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();
}

View File

@@ -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();
}

View 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();
}
}

View 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();
}
}

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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
View 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;
}

View File

@@ -12,7 +12,7 @@ void run_thread() {
}
int main() {
boost::thread t(run_thread);
boost::thread t(&run_thread);
return 0;
}

View File

@@ -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();

View File

@@ -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