1
0
mirror of https://git.suyu.dev/suyu/suyu synced 2025-09-11 16:56:32 -05:00

Initial commit

This commit is contained in:
Crimson-Hawk
2024-03-05 16:42:40 +08:00
commit f1e4595ebf
39576 changed files with 7006612 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
set(VCPKG_DETECTED_CMAKE_CROSSCOMPILING "OFF")
set(VCPKG_DETECTED_CMAKE_SYSTEM_NAME "Windows")
set(VCPKG_DETECTED_CMAKE_HOST_SYSTEM_NAME "Windows")
set(VCPKG_DETECTED_CMAKE_SYSTEM_PROCESSOR "AMD64")
set(VCPKG_DETECTED_CMAKE_HOST_SYSTEM_PROCESSOR "AMD64")
set(VCPKG_DETECTED_CMAKE_SIZEOF_VOID_P "8")
set(VCPKG_DETECTED_MSVC "1")
set(VCPKG_DETECTED_MSVC_VERSION "1929")
set(VCPKG_DETECTED_CMAKE_AR "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/lib.exe")
set(VCPKG_DETECTED_CMAKE_RANLIB ":")
set(VCPKG_DETECTED_CMAKE_STRIP "")
set(VCPKG_DETECTED_CMAKE_NM "")
set(VCPKG_DETECTED_CMAKE_OBJDUMP "")
set(VCPKG_DETECTED_CMAKE_DLLTOOL "")
set(VCPKG_DETECTED_CMAKE_MT "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64/mt.exe")
set(VCPKG_DETECTED_CMAKE_LINKER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/link.exe")
set(VCPKG_DETECTED_CMAKE_C_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")
set(VCPKG_DETECTED_CMAKE_C_COMPILER_ID "MSVC")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID "MSVC")
set(VCPKG_DETECTED_CMAKE_RC_COMPILER "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64/rc.exe")
set(VCPKG_DETECTED_CMAKE_RC_COMPILER_ID "")
set(VCPKG_DETECTED_CMAKE_C_STANDARD_INCLUDE_DIRECTORIES "")
set(VCPKG_DETECTED_CMAKE_C_STANDARD_LIBRARIES "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
set(VCPKG_DETECTED_CMAKE_C_STANDARD "")
set(VCPKG_DETECTED_CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17")
set(VCPKG_DETECTED_CMAKE_C_EXTENSION "")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD "")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23")
set(VCPKG_DETECTED_CMAKE_CXX_EXTENSION "")
set(VCPKG_DETECTED_CMAKE_C_FLAGS " /nologo /DWIN32 /D_WINDOWS /W3 /utf-8 /MP ")
set(VCPKG_DETECTED_CMAKE_CXX_FLAGS " /nologo /DWIN32 /D_WINDOWS /W3 /utf-8 /GR /EHsc /MP ")
set(VCPKG_DETECTED_CMAKE_RC_FLAGS "-c65001 /DWIN32")
set(VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_CMAKE_STATIC_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_CMAKE_EXE_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_ENV_PATH "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE//Extensions/Microsoft/IntelliCode/CLI;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/HostX64/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/VC/VCPackages;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/TestWindow;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/TeamFoundation/Team Explorer;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/bin/Roslyn;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Team Tools/Performance Tools/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Team Tools/Performance Tools;C:/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019//x64;C:/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019/;C:/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.8 Tools/x64/;C:/Program Files (x86)/HTML Help Workshop;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/FSharp/Tools;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/Tools/devinit;C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64;C:/Program Files (x86)/Windows Kits/10/bin/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise//MSBuild/Current/Bin;C:/Windows/Microsoft.NET/Framework64/v4.0.30319;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/Tools/;C:/Program Files/PowerShell/7;C:/Windows/system32;C:/Windows;C:/Windows/system32/Wbem;C:/Windows/system32/WindowsPowerShell/v1.0/;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/Llvm/x64/bin;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/VC/Linux/bin/ConnectionManagerExe;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja")
set(VCPKG_DETECTED_ENV_INCLUDE "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/include;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/include;C:/Program Files (x86)/Windows Kits/NETFXSDK/4.8/include/um;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/ucrt;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/shared;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/um;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/winrt;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/cppwinrt")
set(VCPKG_DETECTED_ENV_C_INCLUDE_PATH "")
set(VCPKG_DETECTED_ENV_CPLUS_INCLUDE_PATH "")
set(VCPKG_DETECTED_ENV_LIB "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x64;C:/Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x64;C:/Program Files (x86)/Windows Kits/10/lib/10.0.22000.0/ucrt/x64;C:/Program Files (x86)/Windows Kits/10/lib/10.0.22000.0/um/x64")
set(VCPKG_DETECTED_ENV_LIBPATH "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x86/store/references;C:/Program Files (x86)/Windows Kits/10/UnionMetadata/10.0.22000.0;C:/Program Files (x86)/Windows Kits/10/References/10.0.22000.0;C:/Windows/Microsoft.NET/Framework64/v4.0.30319")
set(VCPKG_DETECTED_ENV_LIBRARY_PATH "")
set(VCPKG_DETECTED_ENV_LD_LIBRARY_PATH "")
set(VCPKG_COMBINED_CXX_FLAGS_DEBUG " -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -D_DEBUG -MDd -Z7 -Ob0 -Od -RTC1 ")
set(VCPKG_COMBINED_C_FLAGS_DEBUG " -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -MP -D_DEBUG -MDd -Z7 -Ob0 -Od -RTC1 ")
set(VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG "-machine:x64 -nologo -debug -INCREMENTAL ")
set(VCPKG_COMBINED_EXE_LINKER_FLAGS_DEBUG "-machine:x64 -nologo -debug -INCREMENTAL ")
set(VCPKG_COMBINED_STATIC_LINKER_FLAGS_DEBUG "-machine:x64 -nologo")
set(VCPKG_COMBINED_RC_FLAGS_DEBUG "-c65001 -DWIN32 -D_DEBUG")

View File

@@ -0,0 +1,50 @@
[1/2] cmd /c "cd ../../x64-windows-dbg && "C:/Program Files/CMake/bin/cmake.exe" "D:/a/1/s/build/vcpkg_installed/x64-windows/share/vcpkg-cmake-get-vars/cmake_get_vars" "-G" "Ninja" "-DCMAKE_BUILD_TYPE=Debug" "-DCMAKE_INSTALL_PREFIX=D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/debug" "-DCMAKE_MAKE_PROGRAM=C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" "-DBUILD_SHARED_LIBS=ON" "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/toolchains/windows.cmake" "-DVCPKG_TARGET_TRIPLET=x64-windows" "-DVCPKG_SET_CHARSET_FLAG=ON" "-DVCPKG_PLATFORM_TOOLSET=v142" "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON" "-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE" "-DCMAKE_VERBOSE_MAKEFILE=ON" "-DVCPKG_APPLOCAL_DEPS=OFF" "-DCMAKE_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON" "-DVCPKG_CXX_FLAGS=" "-DVCPKG_CXX_FLAGS_RELEASE=" "-DVCPKG_CXX_FLAGS_DEBUG=" "-DVCPKG_C_FLAGS=" "-DVCPKG_C_FLAGS_RELEASE=" "-DVCPKG_C_FLAGS_DEBUG=" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_LINKER_FLAGS=" "-DVCPKG_LINKER_FLAGS_RELEASE=" "-DVCPKG_LINKER_FLAGS_DEBUG=" "-DVCPKG_TARGET_ARCHITECTURE=x64" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" "-DCMAKE_INSTALL_BINDIR:STRING=bin" "-D_VCPKG_ROOT_DIR=D:/a/1/s/externals/vcpkg" "-D_VCPKG_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed" "-DVCPKG_MANIFEST_INSTALL=OFF" "-DVCPKG_OUTPUT_FILE:PATH=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/cmake-get-vars-x64-windows-dbg.cmake.log""
-- The C compiler identification is MSVC 19.29.30146.0
-- The CXX compiler identification is MSVC 19.29.30146.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
BUILD_SHARED_LIBS
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_LIBDIR
_VCPKG_ROOT_DIR
-- Build files have been written to: D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg
[2/2] cmd /c "cd .. && "C:/Program Files/CMake/bin/cmake.exe" "D:/a/1/s/build/vcpkg_installed/x64-windows/share/vcpkg-cmake-get-vars/cmake_get_vars" "-G" "Ninja" "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows" "-DCMAKE_MAKE_PROGRAM=C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" "-DBUILD_SHARED_LIBS=ON" "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/toolchains/windows.cmake" "-DVCPKG_TARGET_TRIPLET=x64-windows" "-DVCPKG_SET_CHARSET_FLAG=ON" "-DVCPKG_PLATFORM_TOOLSET=v142" "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON" "-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE" "-DCMAKE_VERBOSE_MAKEFILE=ON" "-DVCPKG_APPLOCAL_DEPS=OFF" "-DCMAKE_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON" "-DVCPKG_CXX_FLAGS=" "-DVCPKG_CXX_FLAGS_RELEASE=" "-DVCPKG_CXX_FLAGS_DEBUG=" "-DVCPKG_C_FLAGS=" "-DVCPKG_C_FLAGS_RELEASE=" "-DVCPKG_C_FLAGS_DEBUG=" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_LINKER_FLAGS=" "-DVCPKG_LINKER_FLAGS_RELEASE=" "-DVCPKG_LINKER_FLAGS_DEBUG=" "-DVCPKG_TARGET_ARCHITECTURE=x64" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" "-DCMAKE_INSTALL_BINDIR:STRING=bin" "-D_VCPKG_ROOT_DIR=D:/a/1/s/externals/vcpkg" "-D_VCPKG_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed" "-DVCPKG_MANIFEST_INSTALL=OFF" "-DVCPKG_OUTPUT_FILE:PATH=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/cmake-get-vars-x64-windows-rel.cmake.log""
-- The C compiler identification is MSVC 19.29.30146.0
-- The CXX compiler identification is MSVC 19.29.30146.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
BUILD_SHARED_LIBS
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_LIBDIR
_VCPKG_ROOT_DIR
-- Build files have been written to: D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel

View File

@@ -0,0 +1,52 @@
set(VCPKG_DETECTED_CMAKE_CROSSCOMPILING "OFF")
set(VCPKG_DETECTED_CMAKE_SYSTEM_NAME "Windows")
set(VCPKG_DETECTED_CMAKE_HOST_SYSTEM_NAME "Windows")
set(VCPKG_DETECTED_CMAKE_SYSTEM_PROCESSOR "AMD64")
set(VCPKG_DETECTED_CMAKE_HOST_SYSTEM_PROCESSOR "AMD64")
set(VCPKG_DETECTED_CMAKE_SIZEOF_VOID_P "8")
set(VCPKG_DETECTED_MSVC "1")
set(VCPKG_DETECTED_MSVC_VERSION "1929")
set(VCPKG_DETECTED_CMAKE_AR "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/lib.exe")
set(VCPKG_DETECTED_CMAKE_RANLIB ":")
set(VCPKG_DETECTED_CMAKE_STRIP "")
set(VCPKG_DETECTED_CMAKE_NM "")
set(VCPKG_DETECTED_CMAKE_OBJDUMP "")
set(VCPKG_DETECTED_CMAKE_DLLTOOL "")
set(VCPKG_DETECTED_CMAKE_MT "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64/mt.exe")
set(VCPKG_DETECTED_CMAKE_LINKER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/link.exe")
set(VCPKG_DETECTED_CMAKE_C_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")
set(VCPKG_DETECTED_CMAKE_C_COMPILER_ID "MSVC")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID "MSVC")
set(VCPKG_DETECTED_CMAKE_RC_COMPILER "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64/rc.exe")
set(VCPKG_DETECTED_CMAKE_RC_COMPILER_ID "")
set(VCPKG_DETECTED_CMAKE_C_STANDARD_INCLUDE_DIRECTORIES "")
set(VCPKG_DETECTED_CMAKE_C_STANDARD_LIBRARIES "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
set(VCPKG_DETECTED_CMAKE_C_STANDARD "")
set(VCPKG_DETECTED_CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17")
set(VCPKG_DETECTED_CMAKE_C_EXTENSION "")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD_LIBRARIES "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
set(VCPKG_DETECTED_CMAKE_CXX_STANDARD "")
set(VCPKG_DETECTED_CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23")
set(VCPKG_DETECTED_CMAKE_CXX_EXTENSION "")
set(VCPKG_DETECTED_CMAKE_C_FLAGS " /nologo /DWIN32 /D_WINDOWS /W3 /utf-8 /MP ")
set(VCPKG_DETECTED_CMAKE_CXX_FLAGS " /nologo /DWIN32 /D_WINDOWS /W3 /utf-8 /GR /EHsc /MP ")
set(VCPKG_DETECTED_CMAKE_RC_FLAGS "-c65001 /DWIN32")
set(VCPKG_DETECTED_CMAKE_SHARED_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_CMAKE_STATIC_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_CMAKE_EXE_LINKER_FLAGS "/machine:x64")
set(VCPKG_DETECTED_ENV_PATH "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE//Extensions/Microsoft/IntelliCode/CLI;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/HostX64/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/VC/VCPackages;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/TestWindow;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/TeamFoundation/Team Explorer;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/bin/Roslyn;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Team Tools/Performance Tools/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Team Tools/Performance Tools;C:/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019//x64;C:/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019/;C:/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.8 Tools/x64/;C:/Program Files (x86)/HTML Help Workshop;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/FSharp/Tools;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/Tools/devinit;C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64;C:/Program Files (x86)/Windows Kits/10/bin/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise//MSBuild/Current/Bin;C:/Windows/Microsoft.NET/Framework64/v4.0.30319;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/Tools/;C:/Program Files/PowerShell/7;C:/Windows/system32;C:/Windows;C:/Windows/system32/Wbem;C:/Windows/system32/WindowsPowerShell/v1.0/;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/Llvm/x64/bin;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/VC/Linux/bin/ConnectionManagerExe;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja")
set(VCPKG_DETECTED_ENV_INCLUDE "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/include;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/include;C:/Program Files (x86)/Windows Kits/NETFXSDK/4.8/include/um;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/ucrt;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/shared;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/um;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/winrt;C:/Program Files (x86)/Windows Kits/10/include/10.0.22000.0/cppwinrt")
set(VCPKG_DETECTED_ENV_C_INCLUDE_PATH "")
set(VCPKG_DETECTED_ENV_CPLUS_INCLUDE_PATH "")
set(VCPKG_DETECTED_ENV_LIB "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x64;C:/Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x64;C:/Program Files (x86)/Windows Kits/10/lib/10.0.22000.0/ucrt/x64;C:/Program Files (x86)/Windows Kits/10/lib/10.0.22000.0/um/x64")
set(VCPKG_DETECTED_ENV_LIBPATH "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/ATLMFC/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x64;C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/lib/x86/store/references;C:/Program Files (x86)/Windows Kits/10/UnionMetadata/10.0.22000.0;C:/Program Files (x86)/Windows Kits/10/References/10.0.22000.0;C:/Windows/Microsoft.NET/Framework64/v4.0.30319")
set(VCPKG_DETECTED_ENV_LIBRARY_PATH "")
set(VCPKG_DETECTED_ENV_LD_LIBRARY_PATH "")
set(VCPKG_COMBINED_CXX_FLAGS_RELEASE " -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -MD -O2 -Oi -Gy -DNDEBUG -Z7 ")
set(VCPKG_COMBINED_C_FLAGS_RELEASE " -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -MP -MD -O2 -Oi -Gy -DNDEBUG -Z7 ")
set(VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE "-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF ")
set(VCPKG_COMBINED_EXE_LINKER_FLAGS_RELEASE "-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF ")
set(VCPKG_COMBINED_STATIC_LINKER_FLAGS_RELEASE "-machine:x64 -nologo")
set(VCPKG_COMBINED_RC_FLAGS_RELEASE "-c65001 -DWIN32 ")

View File

@@ -0,0 +1,2 @@
include("${CMAKE_CURRENT_LIST_DIR}/cmake-get-vars-x64-windows-rel.cmake.log")
include("${CMAKE_CURRENT_LIST_DIR}/cmake-get-vars-x64-windows-dbg.cmake.log")

View File

@@ -0,0 +1,26 @@
[1/2] cmd /c "cd ../../x64-windows-dbg && "C:/Program Files/CMake/bin/cmake.exe" "D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build" "-G" "Ninja" "-DCMAKE_BUILD_TYPE=Debug" "-DCMAKE_INSTALL_PREFIX=D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/debug" "-DPORT=boost-coroutine" "-DFEATURES=core" "-DWITH_PYTHON2=OFF" "-DWITH_PYTHON3=OFF" "-DCURRENT_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed/x64-windows" "-DB2_EXE=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/b2.exe" "-DSOURCE_PATH=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/src/ost-1.79.0-1abbb33423.clean" "-DBOOST_BUILD_PATH=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_CMAKE_VARS_FILE=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/cmake-get-vars-x64-windows.cmake.log" "-DCMAKE_MAKE_PROGRAM=C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" "-DBUILD_SHARED_LIBS=ON" "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/toolchains/windows.cmake" "-DVCPKG_TARGET_TRIPLET=x64-windows" "-DVCPKG_SET_CHARSET_FLAG=ON" "-DVCPKG_PLATFORM_TOOLSET=v142" "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON" "-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE" "-DCMAKE_VERBOSE_MAKEFILE=ON" "-DVCPKG_APPLOCAL_DEPS=OFF" "-DCMAKE_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON" "-DVCPKG_CXX_FLAGS=" "-DVCPKG_CXX_FLAGS_RELEASE=" "-DVCPKG_CXX_FLAGS_DEBUG=" "-DVCPKG_C_FLAGS=" "-DVCPKG_C_FLAGS_RELEASE=" "-DVCPKG_C_FLAGS_DEBUG=" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_LINKER_FLAGS=" "-DVCPKG_LINKER_FLAGS_RELEASE=" "-DVCPKG_LINKER_FLAGS_DEBUG=" "-DVCPKG_TARGET_ARCHITECTURE=x64" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" "-DCMAKE_INSTALL_BINDIR:STRING=bin" "-D_VCPKG_ROOT_DIR=D:/a/1/s/externals/vcpkg" "-D_VCPKG_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed" "-DVCPKG_MANIFEST_INSTALL=OFF""
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_LIBDIR
FEATURES
_VCPKG_ROOT_DIR
-- Build files have been written to: D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg
[2/2] cmd /c "cd .. && "C:/Program Files/CMake/bin/cmake.exe" "D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build" "-G" "Ninja" "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows" "-DPORT=boost-coroutine" "-DFEATURES=core" "-DWITH_PYTHON2=OFF" "-DWITH_PYTHON3=OFF" "-DCURRENT_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed/x64-windows" "-DB2_EXE=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/b2.exe" "-DSOURCE_PATH=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/src/ost-1.79.0-1abbb33423.clean" "-DBOOST_BUILD_PATH=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_CMAKE_VARS_FILE=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/cmake-get-vars-x64-windows.cmake.log" "-DCMAKE_MAKE_PROGRAM=C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" "-DBUILD_SHARED_LIBS=ON" "-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/toolchains/windows.cmake" "-DVCPKG_TARGET_TRIPLET=x64-windows" "-DVCPKG_SET_CHARSET_FLAG=ON" "-DVCPKG_PLATFORM_TOOLSET=v142" "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON" "-DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=ON" "-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE" "-DCMAKE_VERBOSE_MAKEFILE=ON" "-DVCPKG_APPLOCAL_DEPS=OFF" "-DCMAKE_TOOLCHAIN_FILE=D:/a/1/s/externals/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION=ON" "-DVCPKG_CXX_FLAGS=" "-DVCPKG_CXX_FLAGS_RELEASE=" "-DVCPKG_CXX_FLAGS_DEBUG=" "-DVCPKG_C_FLAGS=" "-DVCPKG_C_FLAGS_RELEASE=" "-DVCPKG_C_FLAGS_DEBUG=" "-DVCPKG_CRT_LINKAGE=dynamic" "-DVCPKG_LINKER_FLAGS=" "-DVCPKG_LINKER_FLAGS_RELEASE=" "-DVCPKG_LINKER_FLAGS_DEBUG=" "-DVCPKG_TARGET_ARCHITECTURE=x64" "-DCMAKE_INSTALL_LIBDIR:STRING=lib" "-DCMAKE_INSTALL_BINDIR:STRING=bin" "-D_VCPKG_ROOT_DIR=D:/a/1/s/externals/vcpkg" "-D_VCPKG_INSTALLED_DIR=D:/a/1/s/build/vcpkg_installed" "-DVCPKG_MANIFEST_INSTALL=OFF""
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_LIBDIR
FEATURES
_VCPKG_ROOT_DIR
-- Build files have been written to: D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel

View File

View File

View File

@@ -0,0 +1,384 @@
[1/2] cmd.exe /C "cd /D D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build && D:\a\1\s\build\vcpkg_installed\x64-windows\tools\boost-build\b2.exe toolset=msvc --user-config=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/user-config.jam --stagedir=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/stage --build-dir=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg runtime-link=shared link=shared address-model=64 architecture=x86 target-os=windows threadapi=win32 variant=debug --disable-icu --with-atomic --with-random --with-date_time --with-filesystem --with-system --with-thread --with-chrono -j2 -sBOOST_ROOT=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build -sBOOST_BUILD_PATH=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build --debug-configuration --debug-building --debug-generators --ignore-site-config --hash -q debug-symbols=on -d +2 threading=multi stage"
notice: found boost-build.jam at D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/boost-build.jam
notice: loading B2 from D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/src/kernel/bootstrap.jam
notice: Site configuration files will be ignored due to the
notice: --ignore-site-config command-line option.
notice: Loading explicitly specified user configuration file:
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\user-config.jam
notice: Searching 'D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg' for user-config configuration file 'user-config.jam'.
notice: Loading user-config configuration file 'user-config.jam' from 'D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg'.
notice: [msvc-cfg] msvc-14.0 detected, command: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe'
notice: [msvc-cfg] msvc-14.2 detected, command: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.16.27023\bin\HostX64\arm\cl.exe'
notice: will use 'C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe' for msvc, condition <toolset>msvc-142
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>ia64/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_ia64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>ia64/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_ia64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>arm/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_arm'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>arm/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_arm64'
Building target '../build/stage'
Build request: object(property-set)@396 <address-model>64 <architecture>x86 <debug-symbols>on <link>shared <runtime-link>shared <target-os>windows <threadapi>win32 <threading>multi <toolset>msvc <variant>debug
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <hardcode-dll-paths>false <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/stage/lib <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>false <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/stage/lib <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@423 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>off <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>debug
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Usage requirements for boost_context:
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>object(file-target)@429 <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** construct LIB
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>object(file-target)@429 <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= LIB property-set= debug
trying type LIB
there are generators for this type
trying generator builtin.lib-generator ( -> LIB )
is viable
trying generator builtin.prebuilt ( -> LIB )
is viable
*** 1 viable generators
returned { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB }
generator builtin.prebuilt spawned
{ /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB }
with usage requirements: [ ]
Usage requirements from boost_context: <relevant>variant
Building target '../build/boost_coroutine'
Build request: object(property-set)@419 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>off <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <link>shared:<library>/boost/context//boost_context <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@423 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>off <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>debug
Already built
Usage requirements from boost_context: <relevant>variant
Building target '../build/stack_traits_sources'
Build request: object(property-set)@445 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>off <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>target-os <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <target-os>windows <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@423 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>off <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>debug
Already built
Usage requirements from boost_context: <relevant>variant
Usage requirements for stack_traits_sources: <relevant>variant
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Usage requirements from stack_traits_sources: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>define:<relevant>link <relevant>target-os <relevant>variant
Usage requirements for boost_coroutine: <relevant>variant <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>define:<relevant>link <relevant>target-os <relevant>variant
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** construct LIB
from { detail/coroutine_context.cpp.CPP }
from { exceptions.cpp.CPP }
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= LIB property-set= debug
trying type LIB
there are generators for this type
trying generator builtin.lib-generator ( -> LIB )
is viable
trying generator builtin.prebuilt ( -> LIB )
*** 1 viable generators
*** construct SHARED_LIB
from { detail/coroutine_context.cpp.CPP }
from { exceptions.cpp.CPP }
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= SHARED_LIB property-set= debug
trying type SHARED_LIB
there are generators for this type
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB IMPORT_LIB )
is viable
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB )
*** 1 viable generators
** generator msvc.link.dll
composing: true
*** construct OBJ
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= OBJ property-set= debug
trying type OBJ
there are generators for this type
trying generator rc.compile.resource ( RC -> OBJ )
is viable
trying generator msvc.compile.c++ ( CPP -> OBJ )
is viable
trying generator msvc.compile.c ( C -> OBJ )
is viable
trying generator msvc.compile.rc ( RC -> OBJ )
is viable
trying generator msvc.compile.asm ( ASM -> OBJ )
is viable
trying generator msvc.compile.c.pch ( H -> C_PCH OBJ )
is viable
trying generator msvc.compile.c++.pch ( H -> CPP_PCH OBJ )
is viable
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= SEARCHED_LIB property-set= debug
trying type SEARCHED_LIB
there are generators for this type
trying generator searched-lib-generator ( -> SEARCHED_LIB )
is viable
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= STATIC_LIB property-set= debug
trying type STATIC_LIB
there are generators for this type
trying generator msvc.archive ( OBJ -> STATIC_LIB )
is viable
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= IMPORT_LIB property-set= debug
trying type IMPORT_LIB
there are generators for this type
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB IMPORT_LIB )
is viable
generator msvc.link.dll is active, discaring
*** 0 viable generators
*** construct OBJ
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
generator msvc.link.dll is active, discaring
*** 0 viable generators
*** construct OBJ
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
generator msvc.link.dll is active, discaring
*** 0 viable generators
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>find-shared-library <relevant>find-static-library <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>response-file <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>toolset <relevant>toolset-msvc:version <relevant>user-interface <relevant>windows-api ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
generator msvc.link.dll spawned
{ msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a ]
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
generator builtin.lib-generator spawned
{ msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a ]
Usage requirements from boost_coroutine: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a
Usage requirements for stage: <relevant>variant <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>false <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/stage/lib <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a
*** construct INSTALLED_SHARED_LIB
from { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>off <install-dependencies>off <library>object(file-target)@429 <link>shared <linkflags>-machine:x64 -nologo -debug -INCREMENTAL <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/stage/lib <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>off <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>library:<relevant>link <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>target-os <relevant>threading <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <response-file>auto <rtti>on <runtime-debugging>on <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>debug <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= INSTALLED_SHARED_LIB property-set= msvc-142/debug/address-model-64/architecture-x86/threading-multi
trying type INSTALLED_SHARED_LIB
there are generators for this type
trying generator install-shared-lib ( SHARED_LIB -> INSTALLED_SHARED_LIB )
is viable
*** 1 viable generators
returned { common%common.copy-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } }
generator install-shared-lib spawned
{ common%common.copy-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.link.dll-boost_coroutine-vc142-mt-gd-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib.STATIC_LIB } } }
with usage requirements: [ ]
Usage requirements from stage: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-dbg/boost/build/390fd8092bb4d388fcb8550939707c7a
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail"
msvc.read-setup <pD:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18>msvc-setup.read
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18"
file C:\Users\VssAdministrator\AppData\Local\Temp\jam12b8b010.000
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows"
msvc.write-setup-script D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat
type "C:\Users\VssAdministrator\AppData\Local\Temp\jam12b8b010.000" > "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat"
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail\coroutine_context.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\detail\coroutine_context.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail\coroutine_context.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -D_DEBUG -MDd -Z7 -Ob0 -Od -RTC1 /Z7 /Od /Ob0 /W3 /MDd /Zc:forScope /Zc:wchar_t /Zc:inline /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
coroutine_context.cpp
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\exceptions.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\exceptions.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\exceptions.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -D_DEBUG -MDd -Z7 -Ob0 -Od -RTC1 /Z7 /Od /Ob0 /W3 /MDd /Zc:forScope /Zc:wchar_t /Zc:inline /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
exceptions.cpp
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows\stack_traits.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\windows\stack_traits.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows\stack_traits.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -D_DEBUG -MDd -Z7 -Ob0 -Od -RTC1 /Z7 /Od /Ob0 /W3 /MDd /Zc:forScope /Zc:wchar_t /Zc:inline /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
stack_traits.cpp
msvc.link.dll D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.dll
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
link /NOLOGO /INCREMENTAL:NO "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\detail\coroutine_context.obj" "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\exceptions.obj" "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\windows\stack_traits.obj" "D:\a\1\s\build\vcpkg_installed\x64-windows\debug\lib\boost_context-vc140-mt-gd.lib" /DEBUG -machine:x64 -nologo -debug -INCREMENTAL /MACHINE:X64 /MANIFEST:EMBED /subsystem:console /out:"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.dll" /DLL /IMPLIB:"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.lib"
Creating library D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.lib and object D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.exp
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.dll
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.dll" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.dll"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.dll
1 file(s) copied.
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.lib
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.lib" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.lib"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.lib
1 file(s) copied.
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.pdb
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.pdb" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\stage\lib\boost_coroutine-vc142-mt-gd-x64-1_79.pdb"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg\boost\build\390fd8092bb4d388fcb8550939707c7a\boost_coroutine-vc142-mt-gd-x64-1_79.pdb
1 file(s) copied.
[1/2] cmd.exe /C "cd /D D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-dbg && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake"
-- Install configuration: "Debug"
-- Installing: D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/debug/lib/boost_coroutine-vc142-mt-gd-x64-1_79.lib
-- Installing: D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/debug/bin/boost_coroutine-vc142-mt-gd-x64-1_79.dll

View File

@@ -0,0 +1,384 @@
[1/2] cmd.exe /C "cd /D D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build && D:\a\1\s\build\vcpkg_installed\x64-windows\tools\boost-build\b2.exe toolset=msvc --user-config=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/user-config.jam --stagedir=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/stage --build-dir=D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel runtime-link=shared link=shared address-model=64 architecture=x86 target-os=windows threadapi=win32 variant=release --disable-icu --with-atomic --with-random --with-date_time --with-filesystem --with-system --with-thread --with-chrono -j2 -sBOOST_ROOT=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build -sBOOST_BUILD_PATH=D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build --debug-configuration --debug-building --debug-generators --ignore-site-config --hash -q debug-symbols=on -d +2 threading=multi stage"
notice: found boost-build.jam at D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/boost-build.jam
notice: loading B2 from D:/a/1/s/build/vcpkg_installed/x64-windows/tools/boost-build/src/kernel/bootstrap.jam
notice: Site configuration files will be ignored due to the
notice: --ignore-site-config command-line option.
notice: Loading explicitly specified user configuration file:
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\user-config.jam
notice: Searching 'D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel' for user-config configuration file 'user-config.jam'.
notice: Loading user-config configuration file 'user-config.jam' from 'D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel'.
notice: [msvc-cfg] msvc-14.0 detected, command: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe'
notice: [msvc-cfg] msvc-14.2 detected, command: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.16.27023\bin\HostX64\arm\cl.exe'
notice: will use 'C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe' for msvc, condition <toolset>msvc-142
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>x86/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat amd64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>ia64/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_ia64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>ia64/<address-model>', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_ia64'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>arm/<address-model>32', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_arm'
notice: [msvc-cfg] condition: '<toolset>msvc-142/<architecture>arm/<address-model>64', setup: 'D:/a/1/s/build/vcpkg_installed/x64-windows/share/boost-build/nothing.bat x86_arm64'
Building target '../build/stage'
Build request: object(property-set)@396 <address-model>64 <architecture>x86 <debug-symbols>on <link>shared <runtime-link>shared <target-os>windows <threadapi>win32 <threading>multi <toolset>msvc <variant>release
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <hardcode-dll-paths>false <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/stage/lib <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>false <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/stage/lib <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@424 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>release
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>off <define>BOOST_ALL_NO_LIB=1 <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Usage requirements for boost_context:
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>off <define>BOOST_ALL_NO_LIB=1 <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>object(file-target)@431 <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** construct LIB
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>off <define>BOOST_ALL_NO_LIB=1 <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <file>object(file-target)@431 <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= LIB property-set= release
trying type LIB
there are generators for this type
trying generator builtin.lib-generator ( -> LIB )
is viable
trying generator builtin.prebuilt ( -> LIB )
is viable
*** 1 viable generators
returned { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB }
generator builtin.prebuilt spawned
{ /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB }
with usage requirements: [ ]
Usage requirements from boost_context: <relevant>variant
Building target '../build/boost_coroutine'
Build request: object(property-set)@419 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <link>shared:<library>/boost/context//boost_context <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@424 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>release
Already built
Usage requirements from boost_context: <relevant>variant
Building target '../build/stack_traits_sources'
Build request: object(property-set)@447 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>target-os <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_SOURCE <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <library>/boost/context//boost_context <link>shared:<define>BOOST_COROUTINES_DYN_LINK=1 <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack <target-os>windows <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack <toolset>msvc,<runtime-link>shared:<threading>multi
Common properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>/boost/context//boost_context <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Building target '../boost_context'
Build request: object(property-set)@424 <address-model>64 <architecture>x86 <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>variant <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Command line free features:
Target requirements: <archiveflags>-machine:x64 -nologo <define>BOOST_ALL_NO_LIB=1 <file>/boost//D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <toolset>msvc,<runtime-link>shared:<threading>multi <variant>release
Already built
Usage requirements from boost_context: <relevant>variant
Usage requirements for stack_traits_sources: <relevant>variant
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
Usage requirements from stack_traits_sources: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>define:<relevant>link <relevant>target-os <relevant>variant
Usage requirements for boost_coroutine: <relevant>variant <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>define:<relevant>link <relevant>target-os <relevant>variant
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** construct LIB
from { detail/coroutine_context.cpp.CPP }
from { exceptions.cpp.CPP }
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= LIB property-set= release
trying type LIB
there are generators for this type
trying generator builtin.lib-generator ( -> LIB )
is viable
trying generator builtin.prebuilt ( -> LIB )
*** 1 viable generators
*** construct SHARED_LIB
from { detail/coroutine_context.cpp.CPP }
from { exceptions.cpp.CPP }
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= SHARED_LIB property-set= release
trying type SHARED_LIB
there are generators for this type
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB IMPORT_LIB )
is viable
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB )
*** 1 viable generators
** generator msvc.link.dll
composing: true
*** construct OBJ
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= OBJ property-set= release
trying type OBJ
there are generators for this type
trying generator rc.compile.resource ( RC -> OBJ )
is viable
trying generator msvc.compile.c++ ( CPP -> OBJ )
is viable
trying generator msvc.compile.c ( C -> OBJ )
is viable
trying generator msvc.compile.rc ( RC -> OBJ )
is viable
trying generator msvc.compile.asm ( ASM -> OBJ )
is viable
trying generator msvc.compile.c.pch ( H -> C_PCH OBJ )
is viable
trying generator msvc.compile.c++.pch ( H -> CPP_PCH OBJ )
is viable
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= SEARCHED_LIB property-set= release
trying type SEARCHED_LIB
there are generators for this type
trying generator searched-lib-generator ( -> SEARCHED_LIB )
is viable
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= STATIC_LIB property-set= release
trying type STATIC_LIB
there are generators for this type
trying generator msvc.archive ( OBJ -> STATIC_LIB )
is viable
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { detail/coroutine_context.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= IMPORT_LIB property-set= release
trying type IMPORT_LIB
there are generators for this type
trying generator msvc.link.dll ( OBJ SEARCHED_LIB STATIC_LIB IMPORT_LIB -> SHARED_LIB IMPORT_LIB )
is viable
generator msvc.link.dll is active, discaring
*** 0 viable generators
*** construct OBJ
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { exceptions.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
generator msvc.link.dll is active, discaring
*** 0 viable generators
*** construct OBJ
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 6 viable generators
** generator msvc.compile.c++
composing:
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ] { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
generator msvc.compile.c++ spawned
{ msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>define <relevant>exception-handling <relevant>extern-c-nothrow <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>lto <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api ]
** generator 'msvc.compile.c' pruned
** generator 'msvc.compile.rc' pruned
** generator 'msvc.compile.asm' pruned
** generator 'msvc.compile.c.pch' pruned
** generator 'msvc.compile.c++.pch' pruned
*** construct SEARCHED_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
returned
generator searched-lib-generator spawned
*** construct STATIC_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
*** 1 viable generators
** generator msvc.archive
composing: true
returned
generator msvc.archive spawned
*** construct IMPORT_LIB
from { windows/stack_traits.cpp.CPP }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>define:<relevant>link <relevant>library:<relevant>link <relevant>link <relevant>target-os <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>variant <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
generator msvc.link.dll is active, discaring
*** 0 viable generators
SUCCESS: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>find-shared-library <relevant>find-static-library <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>response-file <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>toolset <relevant>toolset-msvc:version <relevant>user-interface <relevant>windows-api ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218 ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
generator msvc.link.dll spawned
{ msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218 ]
returned [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218 ] { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
generator builtin.lib-generator spawned
{ msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.lib.IMPORT_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.pdb.PDB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
with usage requirements: [ <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>threading <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218 ]
Usage requirements from boost_coroutine: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218
Usage requirements for stage: <relevant>variant <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218
Build properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>false <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/stage/lib <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <tag>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean>.tag <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <translate-path>@Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>%Jamfile<D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\src\ost-1.79.0-1abbb33423.clean\build>.stage-translate-path <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218
*** construct INSTALLED_SHARED_LIB
from { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } }
properties: <address-model>64 <architecture>x86 <archiveflags>-machine:x64 -nologo <asynch-exceptions>off <coverage>off <debug-store>object <debug-symbols>on <define>BOOST_ALL_NO_LIB=1 <define>BOOST_COROUTINES_DYN_LINK=1 <define>BOOST_COROUTINES_SOURCE <define>NDEBUG <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <hardcode-dll-paths>true <host-os>windows <include>../include&&/D:/a/1/s/build/vcpkg_installed/x64-windows/include <inlining>full <install-dependencies>off <library>object(file-target)@431 <link>shared <linkflags>-machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF <location>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/stage/lib <main-target-type>LIB <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cflags <relevant>cxxflags <relevant>cxxflags:<relevant>segmented-stacks <relevant>cxxflags:<relevant>target-os <relevant>cxxflags:<relevant>toolset <relevant>cxxstd <relevant>debug-store <relevant>debug-symbols <relevant>def-file <relevant>define <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-file <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>find-shared-library <relevant>find-static-library <relevant>force-include <relevant>include <relevant>inlining <relevant>instruction-set <relevant>library-file <relevant>library-path <relevant>library:<relevant>link <relevant>link <relevant>linkflags <relevant>lto <relevant>main-target-type <relevant>mc-input-encoding <relevant>mc-output-encoding <relevant>mc-set-customer-bit <relevant>optimization <relevant>pch <relevant>pch-file <relevant>pch-header <relevant>pch-source <relevant>response-file <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>suppress-import-lib <relevant>target-os <relevant>threading <relevant>threading:<relevant>runtime-link <relevant>threading:<relevant>toolset <relevant>toolset <relevant>toolset-msvc:version <relevant>undef <relevant>user-interface <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <response-file>auto <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <suppress-import-lib>false <symlink-location>project-relative <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <toolset-msvc:version>142 <toolset>msvc <user-interface>console <variant>release <vectorize>off <warnings-as-errors>off <warnings>on <windows-api>desktop
find-viable-generators target-type= INSTALLED_SHARED_LIB property-set= msvc-142/release/address-model-64/architecture-x86/debug-symbols-on/threading-multi
trying type INSTALLED_SHARED_LIB
there are generators for this type
trying generator install-shared-lib ( SHARED_LIB -> INSTALLED_SHARED_LIB )
is viable
*** 1 viable generators
returned { common%common.copy-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } }
generator install-shared-lib spawned
{ common%common.copy-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.link.dll-boost_coroutine-vc142-mt-x64-1_79.dll.SHARED_LIB { msvc%msvc.compile.c++-detail\coroutine_context.obj.OBJ { detail/coroutine_context.cpp.CPP } } { msvc%msvc.compile.c++-exceptions.obj.OBJ { exceptions.cpp.CPP } } { msvc%msvc.compile.c++-windows\stack_traits.obj.OBJ { windows/stack_traits.cpp.CPP } } { /D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib.STATIC_LIB } } }
with usage requirements: [ ]
Usage requirements from stage: <define>BOOST_COROUTINES_DYN_LINK=1 <relevant>address-model <relevant>address-sanitizer <relevant>architecture <relevant>asynch-exceptions <relevant>cxxstd <relevant>cxxstd-dialect <relevant>debug-store <relevant>debug-symbols <relevant>deduced-address-model <relevant>deduced-architecture <relevant>define:<relevant>link <relevant>embed-manifest <relevant>embed-manifest-via <relevant>exception-handling <relevant>extern-c-nothrow <relevant>inlining <relevant>instruction-set <relevant>link <relevant>lto <relevant>lto-mode <relevant>optimization <relevant>pch <relevant>rtti <relevant>runtime-debugging <relevant>runtime-link <relevant>segmented-stacks <relevant>target-os <relevant>threading <relevant>toolset <relevant>toolset-msvc:vendor <relevant>toolset-msvc:version <relevant>variant <relevant>warnings <relevant>warnings-as-errors <relevant>windows-api <xdll-path>/D:/a/1/s/externals/vcpkg/buildtrees/boost-coroutine/x64-windows-rel/boost/build/aa84e6e880a9d383ddf248bc50c22218
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc"
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail"
msvc.read-setup <pD:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18>msvc-setup.read
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18"
file C:\Users\VssAdministrator\AppData\Local\Temp\jam15c4b011.000
common.mkdir D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows
if not exist "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows\\" mkdir "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows"
msvc.write-setup-script D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat
type "C:\Users\VssAdministrator\AppData\Local\Temp\jam15c4b011.000" > "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat"
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail\coroutine_context.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\detail\coroutine_context.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail\coroutine_context.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -MD -O2 -Oi -Gy -DNDEBUG -Z7 /O2 /Z7 /Ob2 /W3 /MD /Zc:forScope /Zc:wchar_t /Zc:inline /Gw /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE -DNDEBUG "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
coroutine_context.cpp
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\exceptions.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\exceptions.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\exceptions.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -MD -O2 -Oi -Gy -DNDEBUG -Z7 /O2 /Z7 /Ob2 /W3 /MD /Zc:forScope /Zc:wchar_t /Zc:inline /Gw /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE -DNDEBUG "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
exceptions.cpp
compile-c-c++ D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows\stack_traits.obj
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
cl "..\src\windows\stack_traits.cpp" -c -Fo"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows\stack_traits.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew -nologo -DWIN32 -D_WINDOWS -W3 -utf-8 -GR -EHsc -MP -MD -O2 -Oi -Gy -DNDEBUG -Z7 /O2 /Z7 /Ob2 /W3 /MD /Zc:forScope /Zc:wchar_t /Zc:inline /Gw /favor:blend -DBOOST_ALL_NO_LIB=1 -DBOOST_COROUTINES_DYN_LINK=1 -DBOOST_COROUTINES_SOURCE -DNDEBUG "-I..\include" "-ID:\a\1\s\build\vcpkg_installed\x64-windows\include"
stack_traits.cpp
msvc.link.dll D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.dll
call "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\standalone\msvc\19858a0c092d6daed3b7579665d68f18\msvc-setup.bat" amd64 >nul
link /NOLOGO /INCREMENTAL:NO "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\detail\coroutine_context.obj" "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\exceptions.obj" "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\windows\stack_traits.obj" "D:\a\1\s\build\vcpkg_installed\x64-windows\lib\boost_context-vc140-mt.lib" /DEBUG -machine:x64 -nologo -DEBUG -INCREMENTAL:NO -OPT:REF -OPT:ICF /MACHINE:X64 /MANIFEST:EMBED /OPT:REF,ICF /subsystem:console /out:"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.dll" /DLL /IMPLIB:"D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.lib"
Creating library D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.lib and object D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.exp
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.dll
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.dll" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.dll"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.dll
1 file(s) copied.
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.lib
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.lib" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.lib"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.lib
1 file(s) copied.
common.copy D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.pdb
copy /b "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.pdb" + this-file-does-not-exist-A698EE7806899E69 "D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\stage\lib\boost_coroutine-vc142-mt-x64-1_79.pdb"
D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel\boost\build\aa84e6e880a9d383ddf248bc50c22218\boost_coroutine-vc142-mt-x64-1_79.pdb
1 file(s) copied.
[1/2] cmd.exe /C "cd /D D:\a\1\s\externals\vcpkg\buildtrees\boost-coroutine\x64-windows-rel && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake"
-- Install configuration: "Release"
-- Installing: D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/lib/boost_coroutine-vc142-mt-x64-1_79.lib
-- Installing: D:/a/1/s/externals/vcpkg/packages/boost-coroutine_x64-windows/bin/boost_coroutine-vc142-mt-x64-1_79.dll

View File

@@ -0,0 +1,96 @@
* text=auto !eol svneol=native#text/plain
*.gitattributes text svneol=native#text/plain
# Scriptish formats
*.bat text svneol=native#text/plain
*.bsh text svneol=native#text/x-beanshell
*.cgi text svneol=native#text/plain
*.cmd text svneol=native#text/plain
*.js text svneol=native#text/javascript
*.php text svneol=native#text/x-php
*.pl text svneol=native#text/x-perl
*.pm text svneol=native#text/x-perl
*.py text svneol=native#text/x-python
*.sh eol=lf svneol=LF#text/x-sh
configure eol=lf svneol=LF#text/x-sh
# Image formats
*.bmp binary svneol=unset#image/bmp
*.gif binary svneol=unset#image/gif
*.ico binary svneol=unset#image/ico
*.jpeg binary svneol=unset#image/jpeg
*.jpg binary svneol=unset#image/jpeg
*.png binary svneol=unset#image/png
*.tif binary svneol=unset#image/tiff
*.tiff binary svneol=unset#image/tiff
*.svg text svneol=native#image/svg%2Bxml
# Data formats
*.pdf binary svneol=unset#application/pdf
*.avi binary svneol=unset#video/avi
*.doc binary svneol=unset#application/msword
*.dsp text svneol=crlf#text/plain
*.dsw text svneol=crlf#text/plain
*.eps binary svneol=unset#application/postscript
*.gz binary svneol=unset#application/gzip
*.mov binary svneol=unset#video/quicktime
*.mp3 binary svneol=unset#audio/mpeg
*.ppt binary svneol=unset#application/vnd.ms-powerpoint
*.ps binary svneol=unset#application/postscript
*.psd binary svneol=unset#application/photoshop
*.rdf binary svneol=unset#text/rdf
*.rss text svneol=unset#text/xml
*.rtf binary svneol=unset#text/rtf
*.sln text svneol=native#text/plain
*.swf binary svneol=unset#application/x-shockwave-flash
*.tgz binary svneol=unset#application/gzip
*.vcproj text svneol=native#text/xml
*.vcxproj text svneol=native#text/xml
*.vsprops text svneol=native#text/xml
*.wav binary svneol=unset#audio/wav
*.xls binary svneol=unset#application/vnd.ms-excel
*.zip binary svneol=unset#application/zip
# Text formats
.htaccess text svneol=native#text/plain
*.bbk text svneol=native#text/xml
*.cmake text svneol=native#text/plain
*.css text svneol=native#text/css
*.dtd text svneol=native#text/xml
*.htm text svneol=native#text/html
*.html text svneol=native#text/html
*.ini text svneol=native#text/plain
*.log text svneol=native#text/plain
*.mak text svneol=native#text/plain
*.qbk text svneol=native#text/plain
*.rst text svneol=native#text/plain
*.sql text svneol=native#text/x-sql
*.txt text svneol=native#text/plain
*.xhtml text svneol=native#text/xhtml%2Bxml
*.xml text svneol=native#text/xml
*.xsd text svneol=native#text/xml
*.xsl text svneol=native#text/xml
*.xslt text svneol=native#text/xml
*.xul text svneol=native#text/xul
*.yml text svneol=native#text/plain
boost-no-inspect text svneol=native#text/plain
CHANGES text svneol=native#text/plain
COPYING text svneol=native#text/plain
INSTALL text svneol=native#text/plain
Jamfile text svneol=native#text/plain
Jamroot text svneol=native#text/plain
Jamfile.v2 text svneol=native#text/plain
Jamrules text svneol=native#text/plain
Makefile* text svneol=native#text/plain
README text svneol=native#text/plain
TODO text svneol=native#text/plain
# Code formats
*.c text svneol=native#text/plain
*.cpp text svneol=native#text/plain
*.h text svneol=native#text/plain
*.hpp text svneol=native#text/plain
*.ipp text svneol=native#text/plain
*.tpp text svneol=native#text/plain
*.jam text svneol=native#text/plain
*.java text svneol=native#text/plain

View File

@@ -0,0 +1,4 @@
*~
*.sw*
*.xml
html

View File

@@ -0,0 +1,58 @@
# Copyright 2020, 2021 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
cmake_minimum_required(VERSION 3.5...3.16)
project(boost_coroutine VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
set(STACK_TRAITS_SOURCES
src/windows/stack_traits.cpp
)
else()
set(STACK_TRAITS_SOURCES
src/posix/stack_traits.cpp
)
endif()
add_library(boost_coroutine
src/detail/coroutine_context.cpp
src/exceptions.cpp
${STACK_TRAITS_SOURCES}
)
add_library(Boost::coroutine ALIAS boost_coroutine)
target_include_directories(boost_coroutine PUBLIC include)
target_link_libraries(boost_coroutine
PUBLIC
Boost::assert
Boost::config
Boost::context
Boost::core
Boost::exception
Boost::move
Boost::system
Boost::throw_exception
Boost::type_traits
Boost::utility
)
target_compile_definitions(boost_coroutine
PUBLIC BOOST_COROUTINE_NO_LIB
PRIVATE BOOST_COROUTINE_SOURCE BOOST_COROUTINES_SOURCE
)
if(BUILD_SHARED_LIBS)
target_compile_definitions(boost_coroutine PUBLIC BOOST_COROUTINE_DYN_LINK BOOST_COROUTINES_DYN_LINK)
else()
target_compile_definitions(boost_coroutine PUBLIC BOOST_COROUTINE_STATIC_LINK)
endif()
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
add_subdirectory(test)
endif()

View File

@@ -0,0 +1,180 @@
constant BOOST_VERSION : 1.79.0 ;
constant BOOST_VERSION_ABI_TAG : 1_79 ;
constant BOOST_JAMROOT_MODULE : $(__name__) ;
import boostcpp ;
import feature ;
boostcpp.set-version $(BOOST_VERSION) ;
project boost : requirements
<include>include&&"D:/a/1/s/build/vcpkg_installed/x64-windows/include"
<define>BOOST_ALL_NO_LIB=1
<tag>@$(__name__).tag
;
rule boost-install ( libraries * )
{
stagedir = [ option.get stagedir ] ;
install stage
: $(libraries)
: <location>$(stagedir)/lib ;
}
rule tag ( name : type ? : property-set )
{
return [ boostcpp.tag $(name) : $(type) : $(property-set) ] ;
}
rule python-tag ( name : type ? : property-set )
{
return [ boostcpp.python-tag $(name) : $(type) : $(property-set) ] ;
}
if "boost-coroutine" != "boost-system"
{
use-project /boost/system : . ;
lib boost_system : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_system-vc140-mt.lib" <variant>release ;
lib boost_system : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_system-vc140-mt-gd.lib" <variant>debug ;
explicit boost_system ;
use-project /boost : . ;
alias system : boost_system ;
}
if "boost-coroutine" != "boost-chrono"
{
use-project /boost/chrono : . ;
lib boost_chrono : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_chrono-vc140-mt.lib" <variant>release ;
lib boost_chrono : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_chrono-vc140-mt-gd.lib" <variant>debug ;
explicit boost_chrono ;
}
if "boost-coroutine" != "boost-regex"
{
use-project /boost/regex : . ;
lib boost_regex : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_regex-vc140-mt.lib" <variant>release ;
lib boost_regex : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_regex-vc140-mt-gd.lib" <variant>debug ;
explicit boost_regex ;
}
if "boost-coroutine" != "boost-date-time"
{
use-project /boost/date_time : . ;
lib boost_date_time : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_date_time-vc140-mt.lib" <variant>release -<library>/boost/date_time//boost_date_time ;
lib boost_date_time : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_date_time-vc140-mt-gd.lib" <variant>debug -<library>/boost/date_time//boost_date_time ;
explicit boost_date_time ;
}
if "boost-coroutine" != "boost-thread"
{
use-project /boost/thread : . ;
lib boost_thread : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_thread-vc140-mt.lib" <variant>release : : <library>/boost/date_time//boost_date_time ;
lib boost_thread : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_thread-vc140-mt-gd.lib" <variant>debug : : <library>/boost/date_time//boost_date_time ;
explicit boost_thread ;
}
if "boost-coroutine" != "boost-timer"
{
use-project /boost/timer : . ;
lib boost_timer : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_timer-vc140-mt.lib" <variant>release ;
lib boost_timer : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_timer-vc140-mt-gd.lib" <variant>debug ;
explicit boost_timer ;
}
if "boost-coroutine" != "boost-filesystem"
{
use-project /boost/filesystem : . ;
lib boost_filesystem : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_filesystem-vc140-mt.lib" <variant>release : : <library>/boost/system//boost_system ;
lib boost_filesystem : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_filesystem-vc140-mt-gd.lib" <variant>debug : : <library>/boost/system//boost_system ;
explicit boost_filesystem ;
}
if "boost-coroutine" != "boost-atomic"
{
use-project /boost/atomic : . ;
lib boost_atomic : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_atomic-vc140-mt.lib" <variant>release ;
lib boost_atomic : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_atomic-vc140-mt-gd.lib" <variant>debug ;
explicit boost_atomic ;
}
if "boost-coroutine" != "boost-context"
{
feature.feature segmented-stacks : on : optional propagated composite ;
feature.compose <segmented-stacks>on : <define>BOOST_USE_SEGMENTED_STACKS ;
use-project /boost/context : . ;
lib boost_context : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_context-vc140-mt.lib" <variant>release ;
lib boost_context : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_context-vc140-mt-gd.lib" <variant>debug ;
explicit boost_context ;
}
if "boost-coroutine" != "boost-test"
{
use-project /boost/test : . ;
lib boost_unit_test_framework : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_unit_test_framework-vc140-mt.lib" <variant>release ;
lib boost_unit_test_framework : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_unit_test_framework-vc140-mt-gd.lib" <variant>debug ;
explicit boost_unit_test_framework ;
}
if "boost-coroutine" != "boost-serialization"
{
use-project /boost/serialization : . ;
lib boost_serialization : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_serialization-vc140-mt.lib" <variant>release ;
lib boost_serialization : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_serialization-vc140-mt-gd.lib" <variant>debug ;
explicit boost_serialization ;
}
if "boost-coroutine" != "boost-mpi"
{
use-project /boost/mpi : . ;
lib boost_mpi : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_mpi-vc140-mt.lib" <variant>release : : <library>/boost/serialization//boost_serialization ;
lib boost_mpi : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_mpi-vc140-mt-gd.lib" <variant>debug : : <library>/boost/serialization//boost_serialization ;
explicit boost_mpi ;
}
if "boost-coroutine" != "boost-container"
{
use-project /boost/container : . ;
lib boost_container : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_container-vc140-mt.lib" <variant>release ;
lib boost_container : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_container-vc140-mt-gd.lib" <variant>debug ;
explicit boost_container ;
}
if "boost-coroutine" != "boost-python"
{
use-project /boost/python : . ;
lib boost_python : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/lib/boost_python-vc140-mt.lib" <variant>release ;
lib boost_python : : <file>"D:/a/1/s/build/vcpkg_installed/x64-windows/debug/lib/boost_python-vc140-mt-gd.lib" <variant>debug ;
explicit boost_python ;
}
rule requires ( foo * )
{
}
rule boost-lib ( name : sources * : requirements * : default-build * : usage-requirements * )
{
name = boost_$(name) ;
lib $(name) : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;
boost-install $(name) ;
}
use-project /boost/boost-coroutine : build ;
build-project build ;

View File

@@ -0,0 +1,14 @@
boost.coroutine
===============
boost.coroutine provides templates for generalized subroutines which allow multiple entry points for
suspending and resuming execution at certain locations. It preserves the local state of execution and
allows re-entering subroutines more than once (useful if state must be kept across function calls).
Coroutines can be viewed as a language-level construct providing a special kind of control flow.
In contrast to threads, which are pre-emptive, coroutines switches are cooperative (programmer controls
when a switch will happen). The kernel is not involved in the coroutine switches.
Note that boost.coroutine is deprecated - boost.coroutine2 is its successor.
If you are forced to use a pre-C++11 compiler you should still use boost.coroutine.

View File

@@ -0,0 +1,43 @@
# Copyright Oliver Kowalke 2009.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
import feature ;
import modules ;
import toolset ;
project boost/coroutine
: requirements
<library>/boost/context//boost_context
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack
<toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<link>shared:<define>BOOST_COROUTINES_DYN_LINK=1
<define>BOOST_COROUTINES_SOURCE
: usage-requirements
<link>shared:<define>BOOST_COROUTINES_DYN_LINK=1
: source-location ../src
;
alias stack_traits_sources
: windows/stack_traits.cpp
: <target-os>windows
;
alias stack_traits_sources
: posix/stack_traits.cpp
;
explicit stack_traits_sources ;
lib boost_coroutine
: detail/coroutine_context.cpp
exceptions.cpp
stack_traits_sources
: <link>shared:<library>/boost/context//boost_context
;
boost-install boost_coroutine ;

View File

@@ -0,0 +1,39 @@
# (C) Copyright 2008 Anthony Williams
#
# 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)
project coroutine/doc ;
import boostbook ;
import quickbook ;
import modules ;
path-constant here : . ;
boostbook coro
:
coro.qbk
:
# Path for links to Boost:
<xsl:param>boost.root=../../../..
# HTML options first:
# How far down we chunk nested sections, basically all of them:
<xsl:param>chunk.section.depth=3
# Don't put the first section on the same page as the TOC:
<xsl:param>chunk.first.sections=1
# How far down sections get TOC's
<xsl:param>toc.section.depth=10
# Max depth in each TOC:
<xsl:param>toc.max.depth=3
# How far down we go with TOC's
<xsl:param>generate.section.toc.level=10
# Absolute path for images:
<format>pdf:<xsl:param>img.src.path=$(here)/html/
;
###############################################################################
alias boostdoc ;
explicit boostdoc ;
alias boostrelease : coro ;
explicit boostrelease ;

View File

@@ -0,0 +1,17 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:acknowledgements Acknowledgments]
I'd like to thank Alex Hagen-Zanker, Christopher Kormanyos, Conrad Poelman,
Eugene Yakubovich, Giovanni Piero Deretta, Hartmut Kaiser, Jeffrey Lee Hellrung,
[*Nat Goodspeed], Robert Stewart, Vicente J. Botet Escriba and Yuriy Krasnoschek.
Especially Eugene Yakubovich, Giovanni Piero Deretta and Vicente J. Botet
Escriba contributed many good ideas during the review.
[endsect]

View File

@@ -0,0 +1,13 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:architectures Architectures]
__boost_coroutine__ depends on __boost_context__ which supports these
[@boost:/libs/context/doc/html/context/architectures.html architectures].
[endsect]

View File

@@ -0,0 +1,690 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:asymmetric Asymmetric coroutine]
Two asymmetric coroutine types - __push_coro__ and __pull_coro__ - provide a
unidirectional transfer of data.
[heading __pull_coro__]
__pull_coro__ transfers data from another execution context (== pulled-from).
The template parameter defines the transferred parameter type.
The constructor of __pull_coro__ takes a function (__coro_fn__) accepting a
reference to an __push_coro__ as argument. Instantiating an __pull_coro__ passes
the control of execution to __coro_fn__ and a complementary __push_coro__ is
synthesized by the library and passed as reference to __coro_fn__.
This kind of coroutine provides __pull_coro_op__. This method only switches
context; it transfers no data.
__pull_coro__ provides input iterators (__pull_coro_it__) and __begin__/__end__
are overloaded. The increment-operation switches the context and transfers data.
boost::coroutines::asymmetric_coroutine<int>::pull_type source(
[&](boost::coroutines::asymmetric_coroutine<int>::push_type& sink){
int first=1,second=1;
sink(first);
sink(second);
for(int i=0;i<8;++i){
int third=first+second;
first=second;
second=third;
sink(third);
}
});
for(auto i:source)
std::cout << i << " ";
output:
1 1 2 3 5 8 13 21 34 55
In this example an __pull_coro__ is created in the main execution context taking
a lambda function (== __coro_fn__) which calculates Fibonacci numbers in a
simple ['for]-loop.
The __coro_fn__ is executed in a newly created execution context which is
managed by the instance of __pull_coro__.
An __push_coro__ is automatically generated by the library and passed as
reference to the lambda function. Each time the lambda function calls
__push_coro_op__ with another Fibonacci number, __push_coro__ transfers it back
to the main execution context. The local state of __coro_fn__ is preserved and
will be restored upon transferring execution control back to __coro_fn__
to calculate the next Fibonacci number.
Because __pull_coro__ provides input iterators and __begin__/__end__ are
overloaded, a ['range-based for]-loop can be used to iterate over the generated
Fibonacci numbers.
[heading __push_coro__]
__push_coro__ transfers data to the other execution context (== pushed-to).
The template parameter defines the transferred parameter type.
The constructor of __push_coro__ takes a function (__coro_fn__) accepting a
reference to an __pull_coro__ as argument. In contrast to __pull_coro__,
instantiating an __push_coro__ does not pass the control of execution to
__coro_fn__ - instead the first call of __push_coro_op__ synthesizes a
complementary __pull_coro__ and passes it as reference to __coro_fn__.
The __push_coro__ interface does not contain a ['get()]-function: you can not retrieve
values from another execution context with this kind of coroutine.
__push_coro__ provides output iterators (__push_coro_it__) and
__begin__/__end__ are overloaded. The increment-operation switches the context
and transfers data.
struct FinalEOL{
~FinalEOL(){
std::cout << std::endl;
}
};
const int num=5, width=15;
boost::coroutines::asymmetric_coroutine<std::string>::push_type writer(
[&](boost::coroutines::asymmetric_coroutine<std::string>::pull_type& in){
// finish the last line when we leave by whatever means
FinalEOL eol;
// pull values from upstream, lay them out 'num' to a line
for (;;){
for(int i=0;i<num;++i){
// when we exhaust the input, stop
if(!in) return;
std::cout << std::setw(width) << in.get();
// now that we've handled this item, advance to next
in();
}
// after 'num' items, line break
std::cout << std::endl;
}
});
std::vector<std::string> words{
"peas", "porridge", "hot", "peas",
"porridge", "cold", "peas", "porridge",
"in", "the", "pot", "nine",
"days", "old" };
std::copy(boost::begin(words),boost::end(words),boost::begin(writer));
output:
peas porridge hot peas porridge
cold peas porridge in the
pot nine days old
In this example an __push_coro__ is created in the main execution context
accepting a lambda function (== __coro_fn__) which requests strings and lays out
'num' of them on each line.
This demonstrates the inversion of control permitted by coroutines. Without
coroutines, a utility function to perform the same job would necessarily
accept each new value as a function parameter, returning after processing that
single value. That function would depend on a static state variable. A
__coro_fn__, however, can request each new value as if by calling a function
-- even though its caller also passes values as if by calling a function.
The __coro_fn__ is executed in a newly created execution context which is
managed by the instance of __push_coro__.
The main execution context passes the strings to the __coro_fn__ by calling
__push_coro_op__.
An __pull_coro__ instance is automatically generated by the library and passed as
reference to the lambda function. The __coro_fn__ accesses the strings passed
from the main execution context by calling __pull_coro_get__ and lays those
strings out on ['std::cout] according the parameters 'num' and 'width'.
The local state of __coro_fn__ is preserved and will be restored after
transferring execution control back to __coro_fn__.
Because __push_coro__ provides output iterators and __begin__/__end__ are
overloaded, the ['std::copy] algorithm can be used to iterate over the vector
containing the strings and pass them one by one to the coroutine.
[heading coroutine-function]
The __coro_fn__ returns ['void] and takes its counterpart-coroutine as
argument, so that using the coroutine passed as argument to __coro_fn__ is the
only way to transfer data and execution control back to the caller.
Both coroutine types take the same template argument.
For __pull_coro__ the __coro_fn__ is entered at __pull_coro__ construction.
For __push_coro__ the __coro_fn__ is not entered at __push_coro__ construction
but entered by the first invocation of __push_coro_op__.
After execution control is returned from __coro_fn__ the state of the
coroutine can be checked via __pull_coro_bool__ returning `true` if the
coroutine is still valid (__coro_fn__ has not terminated). Unless the first
template parameter is `void`, `true` also implies that a data value is
available.
[heading passing data from a pull-coroutine to main-context]
In order to transfer data from an __pull_coro__ to the main-context the framework
synthesizes an __push_coro__ associated with the __pull_coro__ instance in the
main-context. The synthesized __push_coro__ is passed as argument to __coro_fn__.
The __coro_fn__ must call this __push_coro_op__ in order to transfer each
data value back to the main-context.
In the main-context, the __pull_coro_bool__ determines whether the coroutine is
still valid and a data value is available or __coro_fn__ has terminated
(__pull_coro__ is invalid; no data value available). Access to the transferred
data value is given by __pull_coro_get__.
boost::coroutines::asymmetric_coroutine<int>::pull_type source( // constructor enters coroutine-function
[&](boost::coroutines::asymmetric_coroutine<int>::push_type& sink){
sink(1); // push {1} back to main-context
sink(1); // push {1} back to main-context
sink(2); // push {2} back to main-context
sink(3); // push {3} back to main-context
sink(5); // push {5} back to main-context
sink(8); // push {8} back to main-context
});
while(source){ // test if pull-coroutine is valid
int ret=source.get(); // access data value
source(); // context-switch to coroutine-function
}
[heading passing data from main-context to a push-coroutine]
In order to transfer data to an __push_coro__ from the main-context the framework
synthesizes an __pull_coro__ associated with the __push_coro__ instance in the
main-context. The synthesized __pull_coro__ is passed as argument to __coro_fn__.
The main-context must call this __push_coro_op__ in order to transfer each data
value into the __coro_fn__.
Access to the transferred data value is given by __pull_coro_get__.
boost::coroutines::asymmetric_coroutine<int>::push_type sink( // constructor does NOT enter coroutine-function
[&](boost::coroutines::asymmetric_coroutine<int>::pull_type& source){
for (int i:source) {
std::cout << i << " ";
}
});
std::vector<int> v{1,1,2,3,5,8,13,21,34,55};
for( int i:v){
sink(i); // push {i} to coroutine-function
}
[heading accessing parameters]
Parameters returned from or transferred to the __coro_fn__ can be accessed with
__pull_coro_get__.
Splitting-up the access of parameters from context switch function enables to
check if __pull_coro__ is valid after return from __pull_coro_op__, e.g.
__pull_coro__ has values and __coro_fn__ has not terminated.
boost::coroutines::asymmetric_coroutine<boost::tuple<int,int>>::push_type sink(
[&](boost::coroutines::asymmetric_coroutine<boost::tuple<int,int>>::pull_type& source){
// access tuple {7,11}; x==7 y==1
int x,y;
boost::tie(x,y)=source.get();
});
sink(boost::make_tuple(7,11));
[heading exceptions]
An exception thrown inside an __pull_coro__'s __coro_fn__ before its first call
to __push_coro_op__ will be re-thrown by the __pull_coro__ constructor. After an
__pull_coro__'s __coro_fn__'s first call to __push_coro_op__, any subsequent
exception inside that __coro_fn__ will be re-thrown by __pull_coro_op__.
__pull_coro_get__ does not throw.
An exception thrown inside an __push_coro__'s __coro_fn__ will be re-thrown by
__push_coro_op__.
[important Code executed by __coro_fn__ must not prevent the propagation of the
__forced_unwind__ exception. Absorbing that exception will cause stack
unwinding to fail. Thus, any code that catches all exceptions must re-throw any
pending __forced_unwind__ exception.]
try {
// code that might throw
} catch(const boost::coroutines::detail::forced_unwind&) {
throw;
} catch(...) {
// possibly not re-throw pending exception
}
[important Do not jump from inside a catch block and then re-throw the
exception in another execution context.]
[heading Stack unwinding]
Sometimes it is necessary to unwind the stack of an unfinished coroutine to
destroy local stack variables so they can release allocated resources (RAII
pattern). The `attributes` argument of the coroutine constructor
indicates whether the destructor should unwind the stack (stack is unwound by
default).
Stack unwinding assumes the following preconditions:
* The coroutine is not __not_a_coro__
* The coroutine is not complete
* The coroutine is not running
* The coroutine owns a stack
After unwinding, a __coro__ is complete.
struct X {
X(){
std::cout<<"X()"<<std::endl;
}
~X(){
std::cout<<"~X()"<<std::endl;
}
};
{
boost::coroutines::asymmetric_coroutine<void>::push_type sink(
[&](boost::coroutines::asymmetric_coroutine<void>::pull_type& source){
X x;
for(int i=0;;++i){
std::cout<<"fn(): "<<i<<std::endl;
// transfer execution control back to main()
source();
}
});
sink();
sink();
sink();
sink();
sink();
std::cout<<"sink is complete: "<<std::boolalpha<<!sink<<"\n";
}
output:
X()
fn(): 0
fn(): 1
fn(): 2
fn(): 3
fn(): 4
sink is complete: false
~X()
[heading Range iterators]
__boost_coroutine__ provides output- and input-iterators using __boost_range__.
__pull_coro__ can be used via input-iterators using __begin__ and __end__.
int number=2,exponent=8;
boost::coroutines::asymmetric_coroutine< int >::pull_type source(
[&]( boost::coroutines::asymmetric_coroutine< int >::push_type & sink){
int counter=0,result=1;
while(counter++<exponent){
result=result*number;
sink(result);
}
});
for (auto i:source)
std::cout << i << " ";
output:
2 4 8 16 32 64 128 256
['asymmetric_coroutine<>::pull_type::iterator::operator++()] corresponds to
__pull_coro_op__; ['asymmetric_coroutine<>::pull_type::iterator::operator*()]
roughly corresponds to __pull_coro_get__. An iterator originally obtained from
__begin__ of an __pull_coro__ compares equal to an iterator obtained from
__end__ of that same __pull_coro__ instance when its __pull_coro_bool__ would
return `false`].
[note If `T` is a move-only type, then
['asymmetric_coroutine<T>::pull_type::iterator] may only be dereferenced once
before it is incremented again.]
Output-iterators can be created from __push_coro__.
boost::coroutines::asymmetric_coroutine<int>::push_type sink(
[&](boost::coroutines::asymmetric_coroutine<int>::pull_type& source){
while(source){
std::cout << source.get() << " ";
source();
}
});
std::vector<int> v{1,1,2,3,5,8,13,21,34,55};
std::copy(boost::begin(v),boost::end(v),boost::begin(sink));
['asymmetric_coroutine<>::push_type::iterator::operator*()] roughly
corresponds to __push_coro_op__. An iterator originally obtained from
__begin__ of an __push_coro__ compares equal to an iterator obtained from
__end__ of that same __push_coro__ instance when its __push_coro_bool__ would
return `false`.
[heading Exit a __coro_fn__]
__coro_fn__ is exited with a simple return statement jumping back to the calling
routine. The __pull_coro__, __push_coro__ becomes complete, e.g. __pull_coro_bool__,
__push_coro_bool__ will return `false`.
[important After returning from __coro_fn__ the __coro__ is complete (can not
resumed with __push_coro_op__, __pull_coro_op__).]
[section:pull_coro Class `asymmetric_coroutine<>::pull_type`]
#include <boost/coroutine/asymmetric_coroutine.hpp>
template< typename R >
class asymmetric_coroutine<>::pull_type
{
public:
pull_type() noexcept;
template< typename Fn >
pull_type( Fn && fn, attributes const& attr = attributes() );
template< typename Fn, typename StackAllocator >
pull_type( Fn && fn, attributes const& attr, StackAllocator stack_alloc);
pull_type( pull_type const& other)=delete;
pull_type & operator=( pull_type const& other)=delete;
~pull_type();
pull_type( pull_type && other) noexcept;
pull_type & operator=( pull_type && other) noexcept;
operator unspecified-bool-type() const noexcept;
bool operator!() const noexcept;
void swap( pull_type & other) noexcept;
pull_type & operator()();
R get() const;
};
template< typename R >
void swap( pull_type< R > & l, pull_type< R > & r);
template< typename R >
range_iterator< pull_type< R > >::type begin( pull_type< R > &);
template< typename R >
range_iterator< pull_type< R > >::type end( pull_type< R > &);
[heading `pull_type()`]
[variablelist
[[Effects:] [Creates a coroutine representing __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `template< typename Fn >
pull_type( Fn && fn, attributes const& attr)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`, and enters it.
Argument `attr` determines stack clean-up.]]
[[Throws:] [Exceptions thrown inside __coro_fn__.]]
]
[heading `template< typename Fn, typename StackAllocator >
pull_type( Fn && fn, attributes const& attr, StackAllocator const& stack_alloc)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`. Argument `attr`
determines stack clean-up.
For allocating/deallocating the stack `stack_alloc` is used.]]
[[Throws:] [Exceptions thrown inside __coro_fn__.]]
]
[heading `~pull_type()`]
[variablelist
[[Effects:] [Destroys the context and deallocates the stack.]]
]
[heading `pull_type( pull_type && other)`]
[variablelist
[[Effects:] [Moves the internal data of `other` to `*this`.
`other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `pull_type & operator=( pull_type && other)`]
[variablelist
[[Effects:] [Destroys the internal data of `*this` and moves the
internal data of `other` to `*this`. `other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `operator unspecified-bool-type() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `false`. Otherwise `true`.]]
[[Throws:] [Nothing.]]
]
[heading `bool operator!() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `true`. Otherwise `false`.]]
[[Throws:] [Nothing.]]
]
[heading `pull_type<> & operator()()`]
[variablelist
[[Preconditions:] [`*this` is not a __not_a_coro__.]]
[[Effects:] [Execution control is transferred to __coro_fn__ (no parameter is
passed to the coroutine-function).]]
[[Throws:] [Exceptions thrown inside __coro_fn__.]]
]
[heading `R get()`]
R asymmetric_coroutine<R,StackAllocator>::pull_type::get();
R& asymmetric_coroutine<R&,StackAllocator>::pull_type::get();
void asymmetric_coroutine<void,StackAllocator>::pull_type::get()=delete;
[variablelist
[[Preconditions:] [`*this` is not a __not_a_coro__.]]
[[Returns:] [Returns data transferred from coroutine-function via
__push_coro_op__.]]
[[Throws:] [`invalid_result`]]
[[Note:] [If `R` is a move-only type, you may only call `get()` once before
the next __pull_coro_op__ call.]]
]
[heading `void swap( pull_type & other)`]
[variablelist
[[Effects:] [Swaps the internal data from `*this` with the values
of `other`.]]
[[Throws:] [Nothing.]]
]
[heading Non-member function `swap()`]
template< typename R >
void swap( pull_type< R > & l, pull_type< R > & r);
[variablelist
[[Effects:] [As if 'l.swap( r)'.]]
]
[heading Non-member function `begin( pull_type< R > &)`]
template< typename R >
range_iterator< pull_type< R > >::type begin( pull_type< R > &);
[variablelist
[[Returns:] [Returns a range-iterator (input-iterator).]]
]
[heading Non-member function `end( pull_type< R > &)`]
template< typename R >
range_iterator< pull_type< R > >::type end( pull_type< R > &);
[variablelist
[[Returns:] [Returns an end range-iterator (input-iterator).]]
[[Note:] [When first obtained from `begin( pull_type< R > &)`, or after some
number of increment operations, an iterator will compare equal to the iterator
returned by `end( pull_type< R > &)` when the corresponding __pull_coro_bool__
would return `false`.]]
]
[endsect]
[section:push_coro Class `asymmetric_coroutine<>::push_type`]
#include <boost/coroutine/asymmetric_coroutine.hpp>
template< typename Arg >
class asymmetric_coroutine<>::push_type
{
public:
push_type() noexcept;
template< typename Fn >
push_type( Fn && fn, attributes const& attr = attributes() );
template< typename Fn, typename StackAllocator >
push_type( Fn && fn, attributes const& attr, StackAllocator stack_alloc);
push_type( push_type const& other)=delete;
push_type & operator=( push_type const& other)=delete;
~push_type();
push_type( push_type && other) noexcept;
push_type & operator=( push_type && other) noexcept;
operator unspecified-bool-type() const noexcept;
bool operator!() const noexcept;
void swap( push_type & other) noexcept;
push_type & operator()( Arg arg);
};
template< typename Arg >
void swap( push_type< Arg > & l, push_type< Arg > & r);
template< typename Arg >
range_iterator< push_type< Arg > >::type begin( push_type< Arg > &);
template< typename Arg >
range_iterator< push_type< Arg > >::type end( push_type< Arg > &);
[heading `push_type()`]
[variablelist
[[Effects:] [Creates a coroutine representing __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `template< typename Fn >
push_type( Fn && fn, attributes const& attr)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`. Argument `attr`
determines stack clean-up.]]
]
[heading `template< typename Fn, typename StackAllocator >
push_type( Fn && fn, attributes const& attr, StackAllocator const& stack_alloc)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`. Argument `attr`
determines stack clean-up.
For allocating/deallocating the stack `stack_alloc` is used.]]
]
[heading `~push_type()`]
[variablelist
[[Effects:] [Destroys the context and deallocates the stack.]]
]
[heading `push_type( push_type && other)`]
[variablelist
[[Effects:] [Moves the internal data of `other` to `*this`.
`other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `push_type & operator=( push_type && other)`]
[variablelist
[[Effects:] [Destroys the internal data of `*this` and moves the
internal data of `other` to `*this`. `other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `operator unspecified-bool-type() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `false`. Otherwise `true`.]]
[[Throws:] [Nothing.]]
]
[heading `bool operator!() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `true`. Otherwise `false`.]]
[[Throws:] [Nothing.]]
]
[heading `push_type & operator()(Arg arg)`]
push_type& asymmetric_coroutine<Arg>::push_type::operator()(Arg);
push_type& asymmetric_coroutine<Arg&>::push_type::operator()(Arg&);
push_type& asymmetric_coroutine<void>::push_type::operator()();
[variablelist
[[Preconditions:] [operator unspecified-bool-type() returns `true` for `*this`.]]
[[Effects:] [Execution control is transferred to __coro_fn__ and the argument
`arg` is passed to the coroutine-function.]]
[[Throws:] [Exceptions thrown inside __coro_fn__.]]
]
[heading `void swap( push_type & other)`]
[variablelist
[[Effects:] [Swaps the internal data from `*this` with the values
of `other`.]]
[[Throws:] [Nothing.]]
]
[heading Non-member function `swap()`]
template< typename Arg >
void swap( push_type< Arg > & l, push_type< Arg > & r);
[variablelist
[[Effects:] [As if 'l.swap( r)'.]]
]
[heading Non-member function `begin( push_type< Arg > &)`]
template< typename Arg >
range_iterator< push_type< Arg > >::type begin( push_type< Arg > &);
[variablelist
[[Returns:] [Returns a range-iterator (output-iterator).]]
]
[heading Non-member function `end( push_type< Arg > &)`]
template< typename Arg >
range_iterator< push_type< Arg > >::type end( push_type< Arg > &);
[variablelist
[[Returns:] [Returns a end range-iterator (output-iterator).]]
[[Note:] [When first obtained from `begin( push_type< R > &)`, or after some
number of increment operations, an iterator will compare equal to the iterator
returned by `end( push_type< R > &)` when the corresponding __push_coro_bool__
would return `false`.]]
]
[endsect]
[endsect]

View File

@@ -0,0 +1,60 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:attributes Attributes]
Class `attributes` is used to specify parameters required to setup a
coroutine's context.
enum flag_unwind_t
{
stack_unwind,
no_stack_unwind
};
struct attributes
{
std::size_t size;
flag_unwind_t do_unwind;
attributes() noexcept;
explicit attributes( std::size_t size_) noexcept;
explicit attributes( flag_unwind_t do_unwind_) noexcept;
explicit attributes( std::size_t size_, flag_unwind_t do_unwind_) noexcept;
};
[heading `attributes()`]
[variablelist
[[Effects:] [Default constructor using `boost::context::default_stacksize()`, does unwind
the stack after coroutine/generator is complete.]]
[[Throws:] [Nothing.]]
]
[heading `attributes( std::size_t size)`]
[variablelist
[[Effects:] [Argument `size` defines stack size of the new coroutine.
Stack unwinding after termination.]]
[[Throws:] [Nothing.]]
]
[heading `attributes( flag_unwind_t do_unwind)`]
[variablelist
[[Effects:] [Argument `do_unwind` determines if stack will be unwound after
termination or not. The default stacksize is used for the new coroutine.]]
[[Throws:] [Nothing.]]
]
[heading `attributes( std::size_t size, flag_unwind_t do_unwind)`]
[variablelist
[[Effects:] [Arguments `size` and `do_unwind` are given by the user.]]
[[Throws:] [Nothing.]]
]
[endsect]

View File

@@ -0,0 +1,108 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[library Coroutine
[quickbook 1.5]
[authors [Kowalke, Oliver]]
[copyright 2009 Oliver Kowalke]
[purpose C++ Library providing coroutine facility]
[id coroutine]
[category text]
[license
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])
]
]
[def __boost_asio__ [*Boost.Asio]]
[def __boost_build__ [*Boost.Build]]
[def __boost_context__ [*Boost.Context]]
[def __boost_coroutine__ [*Boost.Coroutine]]
[def __boost_exception__ [*Boost.Exception]]
[def __boost_function_types__ [*Boost.FunctionTypes]]
[def __boost_move__ [*Boost.Move]]
[def __boost_mpl__ [*Boost.MPL]]
[def __boost_optional__ [*Boost.Optional]]
[def __boost_preprocessor__ [*Boost.Preprocessor]]
[def __boost_range__ [*Boost.Range]]
[def __boost_result_of__ [*Boost.ResultOf]]
[def __boost_smart_ptr__ [*Boost.SmartPtr]]
[def __boost_static_assert__ [*Boost.StaticAssert]]
[def __boost_tuple__ [*Boost.Tuple]]
[def __boost_type_traits__ [*Boost.TypeTraits]]
[def __boost_utility__ [*Boost.Utility]]
[def __boost_version__ [*Boost-1.52.0]]
[def __coro__ ['coroutine]]
[def __coro_fn__ ['coroutine-function]]
[def __coros__ ['coroutines]]
[def __ctx__ ['context]]
[def __not_a_coro__ ['not-a-coroutine]]
[def __segmented_stack__ ['segmented-stack]]
[def __signature__ ['Signature]]
[def __stack_allocator_concept__ ['stack-allocator concept]]
[def __stack_allocator__ ['stack-allocator]]
[def __stack_traits__ ['stack-traits]]
[def __stack__ ['stack]]
[def __tls__ ['thread-local-storage]]
[def __acoro__ ['asymmetric_coroutine<>]]
[def __attrs__ ['attributes]]
[def __begin__ ['std::begin()]]
[def __bind__ ['boost::bind()]]
[def __call_coro_bool__ ['symmetric_coroutine<>::call_type::operator bool]]
[def __call_coro_op__ ['symmetric_coroutine<>::call_type::operator()]]
[def __call_coro__ ['symmetric_coroutine<>::call_type]]
[def __coro_allocator__ ['stack_allocator]]
[def __coro_ns__ ['boost::coroutines]]
[def __end__ ['std::end()]]
[def __fcontext__ ['boost::contexts::fcontext_t]]
[def __fetch__ ['inbuf::fetch()]]
[def __forced_unwind__ ['detail::forced_unwind]]
[def __getline__ ['std::getline()]]
[def __handle_read__ ['session::handle_read()]]
[def __io_service__ ['boost::asio::io_sevice]]
[def __protected_allocator__ ['protected_stack_allocator]]
[def __pull_coro__ ['asymmetric_coroutine<>::pull_type]]
[def __pull_coro_bool__ ['asymmetric_coroutine<>::pull_type::operator bool]]
[def __pull_coro_get__ ['asymmetric_coroutine<>::pull_type::get()]]
[def __pull_coro_it__ ['asymmetric_coroutine<>::pull_type::iterator]]
[def __pull_coro_op__ ['asymmetric_coroutine<>::pull_type::operator()]]
[def __push_coro__ ['asymmetric_coroutine<>::push_type]]
[def __push_coro_bool__ ['asymmetric_coroutine<>::push_type::operator bool]]
[def __push_coro_it__ ['asymmetric_coroutine<>::push_type::iterator]]
[def __push_coro_op__ ['asymmetric_coroutine<>::push_type::operator()]]
[def __scoro__ ['symmetric_coroutine<>]]
[def __segmented_allocator__ ['segmented_stack_allocator]]
[def __server__ ['server]]
[def __session__ ['session]]
[def __stack_context__ ['stack_context]]
[def __segmented_allocator__ ['segmented_stack_allocator]]
[def __standard_allocator__ ['standard_stack_allocator]]
[def __start__ ['session::start()]]
[def __terminate__ ['std::terminate()]]
[def __thread__ ['boost::thread]]
[def __tie__ ['boost::tie]]
[def __tuple__ ['boost::tuple<>]]
[def __underflow__ ['stream_buf::underflow()]]
[def __yield_context__ ['boost::asio::yield_context]]
[def __yield_coro_bool__ ['symmetric_coroutine<>::yield_type::operator bool]]
[def __yield_coro_get__ ['symmetric_coroutine<>::yield_type::get()]]
[def __yield_coro_op__ ['symmetric_coroutine<>::yield_type::operator()]]
[def __yield_coro__ ['symmetric_coroutine<>::yield_type]]
[include overview.qbk]
[include intro.qbk]
[include motivation.qbk]
[include coroutine.qbk]
[include attributes.qbk]
[include stack.qbk]
[include performance.qbk]
[include architectures.qbk]
[include acknowledgements.qbk]

View File

@@ -0,0 +1,101 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:coroutine Coroutine]
__boost_coroutine__ provides two implementations - asymmetric and symmetric
coroutines.
Symmetric coroutines occur usually in the context of concurrent programming
in order to represent independent units of execution.
Implementations that produce sequences of values typically use asymmetric
coroutines.
[footnote Moura, Ana Lucia De and Ierusalimschy, Roberto.
"Revisiting coroutines". ACM Trans. Program. Lang. Syst., Volume 31 Issue 2,
February 2009, Article No. 6]
[heading stackful]
Each instance of a coroutine has its own stack.
In contrast to stackless coroutines, stackful coroutines allow invoking the
suspend operation out of arbitrary sub-stackframes, enabling escape-and-reenter
recursive operations.
[heading move-only]
A coroutine is moveable-only.
If it were copyable, then its stack with all the objects allocated on it
would be copied too. That would force undefined behaviour if some of these
objects were RAII-classes (manage a resource via RAII pattern). When the first
of the coroutine copies terminates (unwinds its stack), the RAII class
destructors will release their managed resources. When the second copy
terminates, the same destructors will try to doubly-release the same resources,
leading to undefined behaviour.
[heading clean-up]
On coroutine destruction the associated stack will be unwound.
The constructor of coroutine allows you to pass a customized ['stack-allocator].
['stack-allocator] is free to deallocate the stack or cache it for future usage
(for coroutines created later).
[heading segmented stack]
__call_coro__, __push_coro__ and __pull_coro__ support segmented stacks
(growing on demand).
It is not always possible to accurately estimate the required stack size - in
most cases too much memory is allocated (waste of virtual address-space).
At construction a coroutine starts with a default (minimal) stack size. This
minimal stack size is the maximum of page size and the canonical size for signal
stack (macro SIGSTKSZ on POSIX).
At this time of writing only GCC (4.7)
[footnote [@http://gcc.gnu.org/wiki/SplitStacks Ian Lance Taylor, Split Stacks in GCC]]
is known to support segmented stacks. With version 1.54 __boost_coroutine__
provides support for segmented stacks.
The destructor releases the associated stack. The implementer is free to
deallocate the stack or to cache it for later usage.
[heading context switch]
A coroutine saves and restores registers according to the underlying ABI on
each context switch (using __boost_context__).
Some applications do not use floating-point registers and can disable preserving
FPU registers for performance reasons.
[note According to the calling convention the FPU registers are preserved by
default.]
On POSIX systems, the coroutine context switch does not preserve signal masks
for performance reasons.
A context switch is done via __call_coro_op__, __push_coro_op__ and
__pull_coro_op__.
[warning Calling __call_coro_op__, __push_coro_op__ and __pull_coro_op__ from
inside the [_same] coroutine results in undefined behaviour.]
As an example, the code below will result in undefined behaviour:
boost::coroutines::symmetric_coroutine<void>::call_type coro(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield){
yield(coro); // yield to same symmetric_coroutine
});
coro();
[include asymmetric.qbk]
[include symmetric.qbk]
[endsect]

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1,107 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:intro Introduction]
[heading Definition]
In computer science routines are defined as a sequence of operations. The
execution of routines forms a parent-child relationship and the child terminates
always before the parent. Coroutines (the term was introduced by Melvin
Conway [footnote Conway, Melvin E.. "Design of a Separable Transition-Diagram Compiler".
Commun. ACM, Volume 6 Issue 7, July 1963, Article No. 7]),
are a generalization of routines (Donald Knuth [footnote Knuth, Donald Ervin (1997).
"Fundamental Algorithms. The Art of Computer Programming 1", (3rd ed.)].
The principal difference between coroutines and routines
is that a coroutine enables explicit suspend and resume of its progress via
additional operations by preserving execution state and thus provides an
[*enhanced control flow] (maintaining the execution context).
[heading How it works]
Functions foo() and bar() are supposed to alternate their execution (leave and
enter function body).
[$../../../../libs/coroutine/doc/images/foo_bar.png [align center]]
If coroutines were called exactly like routines, the stack would grow with
every call and would never be popped. A jump into the middle of a coroutine
would not be possible, because the return address would be on top of
stack entries.
The solution is that each coroutine has its own stack and control-block
(__fcontext__ from __boost_context__).
Before the coroutine gets suspended, the non-volatile registers (including stack
and instruction/program pointer) of the currently active coroutine are stored in
the coroutine's control-block.
The registers of the newly activated coroutine must be restored from its
associated control-block before it is resumed.
The context switch requires no system privileges and provides cooperative
multitasking convenient to C++. Coroutines provide quasi parallelism.
When a program is supposed to do several things at the same time, coroutines
help to do this much more simply and elegantly than with only a single flow of
control.
The advantages can be seen particularly clearly with the use of a recursive
function, such as traversal of binary trees (see example 'same fringe').
[heading characteristics]
Characteristics [footnote Moura, Ana Lucia De and Ierusalimschy, Roberto.
"Revisiting coroutines". ACM Trans. Program. Lang. Syst., Volume 31 Issue 2,
February 2009, Article No. 6] of a coroutine are:
* values of local data persist between successive calls (context switches)
* execution is suspended as control leaves coroutine and is resumed at certain time later
* symmetric or asymmetric control-transfer mechanism; see below
* first-class object (can be passed as argument, returned by procedures,
stored in a data structure to be used later or freely manipulated by
the developer)
* stackful or stackless
Coroutines are useful in simulation, artificial intelligence, concurrent
programming, text processing and data manipulation, supporting
the implementation of components such as cooperative tasks (fibers), iterators,
generators, infinite lists, pipes etc.
[heading execution-transfer mechanism]
Two categories of coroutines exist: symmetric and asymmetric coroutines.
An asymmetric coroutine knows its invoker, using a special operation to
implicitly yield control specifically to its invoker. By contrast, all symmetric
coroutines are equivalent; one symmetric coroutine may pass control to any
other symmetric coroutine. Because of this, a symmetric coroutine ['must]
specify the coroutine to which it intends to yield control.
[$../../../../libs/coroutine/doc/images/foo_bar_seq.png [align center]]
Both concepts are equivalent and a fully-general coroutine library can provide
either symmetric or asymmetric coroutines. For convenience, Boost.Coroutine
provides both.
[heading stackfulness]
In contrast to a stackless coroutine a stackful coroutine can be suspended
from within a nested stackframe. Execution resumes at exactly the same point
in the code where it was suspended before.
With a stackless coroutine, only the top-level routine may be suspended. Any
routine called by that top-level routine may not itself suspend. This prohibits
providing suspend/resume operations in routines within a general-purpose library.
[heading first-class continuation]
A first-class continuation can be passed as an argument, returned by a
function and stored in a data structure to be used later.
In some implementations (for instance C# ['yield]) the continuation can
not be directly accessed or directly manipulated.
Without stackfulness and first-class semantics, some useful execution control
flows cannot be supported (for instance cooperative multitasking or
checkpointing).
[endsect]

View File

@@ -0,0 +1,691 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:motivation Motivation]
In order to support a broad range of execution control behaviour the coroutine
types of __scoro__ and __acoro__ can be used to ['escape-and-reenter] loops, to
['escape-and-reenter] recursive computations and for ['cooperative] multitasking
helping to solve problems in a much simpler and more elegant way than with only
a single flow of control.
[heading event-driven model]
The event-driven model is a programming paradigm where the flow of a program is
determined by events. The events are generated by multiple independent sources
and an event-dispatcher, waiting on all external sources, triggers callback
functions (event-handlers) whenever one of those events is detected (event-loop).
The application is divided into event selection (detection) and event handling.
[$../../../../libs/coroutine/doc/images/event_model.png [align center]]
The resulting applications are highly scalable, flexible, have high
responsiveness and the components are loosely coupled. This makes the event-driven
model suitable for user interface applications, rule-based productions systems
or applications dealing with asynchronous I/O (for instance network servers).
[heading event-based asynchronous paradigm]
A classic synchronous console program issues an I/O request (e.g. for user
input or filesystem data) and blocks until the request is complete.
In contrast, an asynchronous I/O function initiates the physical operation but
immediately returns to its caller, even though the operation is not yet
complete. A program written to leverage this functionality does not block: it
can proceed with other work (including other I/O requests in parallel) while
the original operation is still pending. When the operation completes, the
program is notified. Because asynchronous applications spend less overall time
waiting for operations, they can outperform synchronous programs.
Events are one of the paradigms for asynchronous execution, but
not all asynchronous systems use events.
Although asynchronous programming can be done using threads, they come with
their own costs:
* hard to program (traps for the unwary)
* memory requirements are high
* large overhead with creation and maintenance of thread state
* expensive context switching between threads
The event-based asynchronous model avoids those issues:
* simpler because of the single stream of instructions
* much less expensive context switches
The downside of this paradigm consists in a sub-optimal program
structure. An event-driven program is required to split its code into
multiple small callback functions, i.e. the code is organized in a sequence of
small steps that execute intermittently. An algorithm that would usually be expressed
as a hierarchy of functions and loops must be transformed into callbacks. The
complete state has to be stored into a data structure while the control flow
returns to the event-loop.
As a consequence, event-driven applications are often tedious and confusing to
write. Each callback introduces a new scope, error callback etc. The
sequential nature of the algorithm is split into multiple callstacks,
making the application hard to debug. Exception handlers are restricted to
local handlers: it is impossible to wrap a sequence of events into a single
try-catch block.
The use of local variables, while/for loops, recursions etc. together with the
event-loop is not possible. The code becomes less expressive.
In the past, code using asio's ['asynchronous operations] was convoluted by
callback functions.
class session
{
public:
session(boost::asio::io_service& io_service) :
socket_(io_service) // construct a TCP-socket from io_service
{}
tcp::socket& socket(){
return socket_;
}
void start(){
// initiate asynchronous read; handle_read() is callback-function
socket_.async_read_some(boost::asio::buffer(data_,max_length),
boost::bind(&session::handle_read,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
private:
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred){
if (!error)
// initiate asynchronous write; handle_write() is callback-function
boost::asio::async_write(socket_,
boost::asio::buffer(data_,bytes_transferred),
boost::bind(&session::handle_write,this,
boost::asio::placeholders::error));
else
delete this;
}
void handle_write(const boost::system::error_code& error){
if (!error)
// initiate asynchronous read; handle_read() is callback-function
socket_.async_read_some(boost::asio::buffer(data_,max_length),
boost::bind(&session::handle_read,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
else
delete this;
}
boost::asio::ip::tcp::socket socket_;
enum { max_length=1024 };
char data_[max_length];
};
In this example, a simple echo server, the logic is split into three member
functions - local state (such as data buffer) is moved to member variables.
__boost_asio__ provides with its new ['asynchronous result] feature a new
framework combining event-driven model and coroutines, hiding the complexity
of event-driven programming and permitting the style of classic sequential code.
The application is not required to pass callback functions to asynchronous
operations and local state is kept as local variables. Therefore the code
is much easier to read and understand.
[footnote Christopher Kohlhoff,
[@ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3964.pdf
N3964 - Library Foundations for Asynchronous Operations, Revision 1]].
__yield_context__ internally uses __boost_coroutine__:
void session(boost::asio::io_service& io_service){
// construct TCP-socket from io_service
boost::asio::ip::tcp::socket socket(io_service);
try{
for(;;){
// local data-buffer
char data[max_length];
boost::system::error_code ec;
// read asynchronous data from socket
// execution context will be suspended until
// some bytes are read from socket
std::size_t length=socket.async_read_some(
boost::asio::buffer(data),
boost::asio::yield[ec]);
if (ec==boost::asio::error::eof)
break; //connection closed cleanly by peer
else if(ec)
throw boost::system::system_error(ec); //some other error
// write some bytes asynchronously
boost::asio::async_write(
socket,
boost::asio::buffer(data,length),
boost::asio::yield[ec]);
if (ec==boost::asio::error::eof)
break; //connection closed cleanly by peer
else if(ec)
throw boost::system::system_error(ec); //some other error
}
} catch(std::exception const& e){
std::cerr<<"Exception: "<<e.what()<<"\n";
}
}
In contrast to the previous example this one gives the impression of sequential
code and local data (['data]) while using asynchronous operations
(['async_read()], ['async_write()]). The algorithm is implemented in one
function and error handling is done by one try-catch block.
[heading recursive SAX parsing]
To someone who knows SAX, the phrase "recursive SAX parsing" might sound
nonsensical. You get callbacks from SAX; you have to manage the element stack
yourself. If you want recursive XML processing, you must first read the entire
DOM into memory, then walk the tree.
But coroutines let you invert the flow of control so you can ask for SAX
events. Once you can do that, you can process them recursively.
// Represent a subset of interesting SAX events
struct BaseEvent{
BaseEvent(const BaseEvent&)=delete;
BaseEvent& operator=(const BaseEvent&)=delete;
};
// End of document or element
struct CloseEvent: public BaseEvent{
// CloseEvent binds (without copying) the TagType reference.
CloseEvent(const xml::sax::Parser::TagType& name):
mName(name)
{}
const xml::sax::Parser::TagType& mName;
};
// Start of document or element
struct OpenEvent: public CloseEvent{
// In addition to CloseEvent's TagType, OpenEvent binds AttributeIterator.
OpenEvent(const xml::sax::Parser::TagType& name,
xml::sax::AttributeIterator& attrs):
CloseEvent(name),
mAttrs(attrs)
{}
xml::sax::AttributeIterator& mAttrs;
};
// text within an element
struct TextEvent: public BaseEvent{
// TextEvent binds the CharIterator.
TextEvent(xml::sax::CharIterator& text):
mText(text)
{}
xml::sax::CharIterator& mText;
};
// The parsing coroutine instantiates BaseEvent subclass instances and
// successively shows them to the main program. It passes a reference so we
// don't slice the BaseEvent subclass.
typedef boost::coroutines::asymmetric_coroutine<const BaseEvent&> coro_t;
void parser(coro_t::push_type& sink,std::istream& in){
xml::sax::Parser xparser;
// startDocument() will send OpenEvent
xparser.startDocument([&sink](const xml::sax::Parser::TagType& name,
xml::sax::AttributeIterator& attrs)
{
sink(OpenEvent(name,attrs));
});
// startTag() will likewise send OpenEvent
xparser.startTag([&sink](const xml::sax::Parser::TagType& name,
xml::sax::AttributeIterator& attrs)
{
sink(OpenEvent(name,attrs));
});
// endTag() will send CloseEvent
xparser.endTag([&sink](const xml::sax::Parser::TagType& name)
{
sink(CloseEvent(name));
});
// endDocument() will likewise send CloseEvent
xparser.endDocument([&sink](const xml::sax::Parser::TagType& name)
{
sink(CloseEvent(name));
});
// characters() will send TextEvent
xparser.characters([&sink](xml::sax::CharIterator& text)
{
sink(TextEvent(text));
});
try
{
// parse the document, firing all the above
xparser.parse(in);
}
catch (xml::Exception e)
{
// xml::sax::Parser throws xml::Exception. Helpfully translate the
// name and provide it as the what() string.
throw std::runtime_error(exception_name(e));
}
}
// Recursively traverse the incoming XML document on the fly, pulling
// BaseEvent& references from 'events'.
// 'indent' illustrates the level of recursion.
// Each time we're called, we've just retrieved an OpenEvent from 'events';
// accept that as a param.
// Return the CloseEvent that ends this element.
const CloseEvent& process(coro_t::pull_type& events,const OpenEvent& context,
const std::string& indent=""){
// Capture OpenEvent's tag name: as soon as we advance the parser, the
// TagType& reference bound in this OpenEvent will be invalidated.
xml::sax::Parser::TagType tagName = context.mName;
// Since the OpenEvent is still the current value from 'events', pass
// control back to 'events' until the next event. Of course, each time we
// come back we must check for the end of the results stream.
while(events()){
// Another event is pending; retrieve it.
const BaseEvent& event=events.get();
const OpenEvent* oe;
const CloseEvent* ce;
const TextEvent* te;
if((oe=dynamic_cast<const OpenEvent*>(&event))){
// When we see OpenEvent, recursively process it.
process(events,*oe,indent+" ");
}
else if((ce=dynamic_cast<const CloseEvent*>(&event))){
// When we see CloseEvent, validate its tag name and then return
// it. (This assert is really a check on xml::sax::Parser, since
// it already validates matching open/close tags.)
assert(ce->mName == tagName);
return *ce;
}
else if((te=dynamic_cast<const TextEvent*>(&event))){
// When we see TextEvent, just report its text, along with
// indentation indicating recursion level.
std::cout<<indent<<"text: '"<<te->mText.getText()<<"'\n";
}
}
}
// pretend we have an XML file of arbitrary size
std::istringstream in(doc);
try
{
coro_t::pull_type events(std::bind(parser,_1,std::ref(in)));
// We fully expect at least ONE event.
assert(events);
// This dynamic_cast<&> is itself an assertion that the first event is an
// OpenEvent.
const OpenEvent& context=dynamic_cast<const OpenEvent&>(events.get());
process(events, context);
}
catch (std::exception& e)
{
std::cout << "Parsing error: " << e.what() << '\n';
}
This problem does not map at all well to communicating between independent
threads. It makes no sense for either side to proceed independently of the
other. You want them to pass control back and forth.
The solution involves a small polymorphic class event hierarchy, to which
we're passing references. The actual instances are temporaries on the
coroutine's stack; the coroutine passes each reference in turn to the main
logic. Copying them as base-class values would slice them.
If we were trying to let the SAX parser proceed independently of the consuming
logic, one could imagine allocating event-subclass instances on the heap,
passing them along on a thread-safe queue of pointers. But that doesn't work
either, because these event classes bind references passed by the SAX parser.
The moment the parser moves on, those references become invalid.
Instead of binding a ['TagType&] reference, we could store a copy of
the ['TagType] in ['CloseEvent]. But that doesn't solve the whole
problem. For attributes, we get an ['AttributeIterator&]; for text we get
a ['CharIterator&]. Storing a copy of those iterators is pointless: once
the parser moves on, those iterators are invalidated. You must process the
attribute iterator (or character iterator) during the SAX callback for that
event.
Naturally we could retrieve and store a copy of every attribute and its value;
we could store a copy of every chunk of text. That would effectively be all
the text in the document -- a heavy price to pay, if the reason we're using
SAX is concern about fitting the entire DOM into memory.
There's yet another advantage to using coroutines. This SAX parser throws an
exception when parsing fails. With a coroutine implementation, you need only
wrap the calling code in try/catch.
With communicating threads, you would have to arrange to catch the exception
and pass along the exception pointer on the same queue you're using to deliver
the other events. You would then have to rethrow the exception to unwind the
recursive document processing.
The coroutine solution maps very naturally to the problem space.
[heading 'same fringe' problem]
The advantages of suspending at an arbitrary call depth can be seen
particularly clearly with the use of a recursive function, such as traversal
of trees.
If traversing two different trees in the same deterministic order produces the
same list of leaf nodes, then both trees have the same fringe.
[$../../../../libs/coroutine/doc/images/same_fringe.png [align center]]
Both trees in the picture have the same fringe even though the structure of the
trees is different.
The same fringe problem could be solved using coroutines by iterating over the
leaf nodes and comparing this sequence via ['std::equal()]. The range of data
values is generated by function ['traverse()] which recursively traverses the
tree and passes each node's data value to its __push_coro__.
__push_coro__ suspends the recursive computation and transfers the data value to
the main execution context.
__pull_coro_it__, created from __pull_coro__, steps over those data values and
delivers them to ['std::equal()] for comparison. Each increment of
__pull_coro_it__ resumes ['traverse()]. Upon return from
['iterator::operator++()], either a new data value is available, or tree
traversal is finished (iterator is invalidated).
In effect, the coroutine iterator presents a flattened view of the recursive
data structure.
struct node{
typedef boost::shared_ptr<node> ptr_t;
// Each tree node has an optional left subtree,
// an optional right subtree and a value of its own.
// The value is considered to be between the left
// subtree and the right.
ptr_t left,right;
std::string value;
// construct leaf
node(const std::string& v):
left(),right(),value(v)
{}
// construct nonleaf
node(ptr_t l,const std::string& v,ptr_t r):
left(l),right(r),value(v)
{}
static ptr_t create(const std::string& v){
return ptr_t(new node(v));
}
static ptr_t create(ptr_t l,const std::string& v,ptr_t r){
return ptr_t(new node(l,v,r));
}
};
node::ptr_t create_left_tree_from(const std::string& root){
/* --------
root
/ \
b e
/ \
a c
-------- */
return node::create(
node::create(
node::create("a"),
"b",
node::create("c")),
root,
node::create("e"));
}
node::ptr_t create_right_tree_from(const std::string& root){
/* --------
root
/ \
a d
/ \
c e
-------- */
return node::create(
node::create("a"),
root,
node::create(
node::create("c"),
"d",
node::create("e")));
}
// recursively walk the tree, delivering values in order
void traverse(node::ptr_t n,
boost::coroutines::asymmetric_coroutine<std::string>::push_type& out){
if(n->left) traverse(n->left,out);
out(n->value);
if(n->right) traverse(n->right,out);
}
// evaluation
{
node::ptr_t left_d(create_left_tree_from("d"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type left_d_reader(
[&]( boost::coroutines::asymmetric_coroutine<std::string>::push_type & out){
traverse(left_d,out);
});
node::ptr_t right_b(create_right_tree_from("b"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_b_reader(
[&]( boost::coroutines::asymmetric_coroutine<std::string>::push_type & out){
traverse(right_b,out);
});
std::cout << "left tree from d == right tree from b? "
<< std::boolalpha
<< std::equal(boost::begin(left_d_reader),
boost::end(left_d_reader),
boost::begin(right_b_reader))
<< std::endl;
}
{
node::ptr_t left_d(create_left_tree_from("d"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type left_d_reader(
[&]( boost::coroutines::asymmetric_coroutine<std::string>::push_type & out){
traverse(left_d,out);
});
node::ptr_t right_x(create_right_tree_from("x"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_x_reader(
[&]( boost::coroutines::asymmetric_coroutine<std::string>::push_type & out){
traverse(right_x,out);
});
std::cout << "left tree from d == right tree from x? "
<< std::boolalpha
<< std::equal(boost::begin(left_d_reader),
boost::end(left_d_reader),
boost::begin(right_x_reader))
<< std::endl;
}
std::cout << "Done" << std::endl;
output:
left tree from d == right tree from b? true
left tree from d == right tree from x? false
Done
[heading merging two sorted arrays]
This example demonstrates how symmetric coroutines merge two sorted arrays.
std::vector<int> merge(const std::vector<int>& a,const std::vector<int>& b){
std::vector<int> c;
std::size_t idx_a=0,idx_b=0;
boost::coroutines::symmetric_coroutine<void>::call_type *other_a=0,*other_b=0;
boost::coroutines::symmetric_coroutine<void>::call_type coro_a(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield){
while(idx_a<a.size()){
if(b[idx_b]<a[idx_a]) // test if element in array b is less than in array a
yield(*other_b); // yield to coroutine coro_b
c.push_back(a[idx_a++]); // add element to final array
}
// add remaining elements of array b
while(idx_b<b.size())
c.push_back(b[idx_b++]);
});
boost::coroutines::symmetric_coroutine<void>::call_type coro_b(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield){
while(idx_b<b.size()){
if(a[idx_a]<b[idx_b]) // test if element in array a is less than in array b
yield(*other_a); // yield to coroutine coro_a
c.push_back(b[idx_b++]); // add element to final array
}
// add remaining elements of array a
while(idx_a<a.size())
c.push_back(a[idx_a++]);
});
other_a=&coro_a;
other_b=&coro_b;
coro_a(); // enter coroutine-fn of coro_a
return c;
}
[heading chaining coroutines]
This code shows how coroutines could be chained.
typedef boost::coroutines::asymmetric_coroutine<std::string> coro_t;
// deliver each line of input stream to sink as a separate string
void readlines(coro_t::push_type& sink,std::istream& in){
std::string line;
while(std::getline(in,line))
sink(line);
}
void tokenize(coro_t::push_type& sink, coro_t::pull_type& source){
// This tokenizer doesn't happen to be stateful: you could reasonably
// implement it with a single call to push each new token downstream. But
// I've worked with stateful tokenizers, in which the meaning of input
// characters depends in part on their position within the input line.
BOOST_FOREACH(std::string line,source){
std::string::size_type pos=0;
while(pos<line.length()){
if(line[pos]=='"'){
std::string token;
++pos; // skip open quote
while(pos<line.length()&&line[pos]!='"')
token+=line[pos++];
++pos; // skip close quote
sink(token); // pass token downstream
} else if (std::isspace(line[pos])){
++pos; // outside quotes, ignore whitespace
} else if (std::isalpha(line[pos])){
std::string token;
while (pos < line.length() && std::isalpha(line[pos]))
token += line[pos++];
sink(token); // pass token downstream
} else { // punctuation
sink(std::string(1,line[pos++]));
}
}
}
}
void only_words(coro_t::push_type& sink,coro_t::pull_type& source){
BOOST_FOREACH(std::string token,source){
if (!token.empty() && std::isalpha(token[0]))
sink(token);
}
}
void trace(coro_t::push_type& sink, coro_t::pull_type& source){
BOOST_FOREACH(std::string token,source){
std::cout << "trace: '" << token << "'\n";
sink(token);
}
}
struct FinalEOL{
~FinalEOL(){
std::cout << std::endl;
}
};
void layout(coro_t::pull_type& source,int num,int width){
// Finish the last line when we leave by whatever means
FinalEOL eol;
// Pull values from upstream, lay them out 'num' to a line
for (;;){
for (int i = 0; i < num; ++i){
// when we exhaust the input, stop
if (!source) return;
std::cout << std::setw(width) << source.get();
// now that we've handled this item, advance to next
source();
}
// after 'num' items, line break
std::cout << std::endl;
}
}
// For example purposes, instead of having a separate text file in the
// local filesystem, construct an istringstream to read.
std::string data(
"This is the first line.\n"
"This, the second.\n"
"The third has \"a phrase\"!\n"
);
{
std::cout << "\nfilter:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type filter(boost::bind(only_words, _1, boost::ref(tokenizer)));
coro_t::pull_type tracer(boost::bind(trace, _1, boost::ref(filter)));
BOOST_FOREACH(std::string token,tracer){
// just iterate, we're already pulling through tracer
}
}
{
std::cout << "\nlayout() as coroutine::push_type:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type filter(boost::bind(only_words, _1, boost::ref(tokenizer)));
coro_t::push_type writer(boost::bind(layout, _1, 5, 15));
BOOST_FOREACH(std::string token,filter){
writer(token);
}
}
{
std::cout << "\nfiltering output:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines,_1,boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize,_1,boost::ref(reader)));
coro_t::push_type writer(boost::bind(layout,_1,5,15));
// Because of the symmetry of the API, we can use any of these
// chaining functions in a push_type coroutine chain as well.
coro_t::push_type filter(boost::bind(only_words,boost::ref(writer),_1));
BOOST_FOREACH(std::string token,tokenizer){
filter(token);
}
}
[endsect]

View File

@@ -0,0 +1,37 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:overview Overview]
__boost_coroutine__ provides templates for generalized subroutines which allow
suspending and resuming execution at certain locations.
It preserves the local state of execution and allows re-entering subroutines more
than once (useful if state must be kept across function calls).
Coroutines can be viewed as a language-level construct providing a special kind
of control flow.
In contrast to threads, which are pre-emptive, __coro__ switches are
cooperative (programmer controls when a switch will happen). The kernel is not
involved in the coroutine switches.
The implementation uses __boost_context__ for context switching.
In order to use the classes and functions described here, you can either include
the specific headers specified by the descriptions of each class or function, or
include the master library header:
#include <boost/coroutine/all.hpp>
which includes all the other headers in turn.
All functions and classes are contained in the namespace __coro_ns__.
[warning BoostCoroutine is now deprecated. Please use
[@http://www.boost.org/doc/libs/release/libs/coroutine2/index.html Boost.Coroutine2].]
[endsect]

View File

@@ -0,0 +1,65 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:performance Performance]
Performance of __boost_coroutine__ was measured on the platforms shown in the
following table. Performance measurements were taken using `rdtsc` and
`boost::chrono::high_resolution_clock`, with overhead corrections, on x86
platforms. In each case, cache warm-up was accounted for, and the one
running thread was pinned to a single CPU.
[table Performance of asymmetric coroutines
[
[Platform]
[switch]
[construction (protected stack-allocator)]
[construction (preallocated stack-allocator)]
[construction (standard stack-allocator)]
]
[
[i386 (AMD Athlon 64 DualCore 4400+, Linux 32bit)]
[49 ns / 50 cycles]
[51 \u00b5s / 51407 cycles]
[14 \u00b5s / 15231 cycles]
[14 \u00b5s / 15216 cycles]
]
[
[x86_64 (Intel Core2 Q6700, Linux 64bit)]
[12 ns / 39 cycles]
[16 \u00b5s / 41802 cycles]
[6 \u00b5s / 10350 cycles]
[6 \u00b5s / 18817 cycles]
]
]
[table Performance of symmetric coroutines
[
[Platform]
[switch]
[construction (protected stack-allocator)]
[construction (preallocated stack-allocator)]
[construction (standard stack-allocator)]
]
[
[i386 (AMD Athlon 64 DualCore 4400+, Linux 32bit)]
[47 ns / 49 cycles]
[27 \u00b5s / 28002 cycles]
[98 ns / 116 cycles]
[319 ns / 328 cycles]
]
[
[x86_64 (Intel Core2 Q6700, Linux 64bit)]
[10 ns / 33 cycles]
[10 \u00b5s / 22828 cycles]
[42 ns / 710 cycles]
[135 ns / 362 cycles]
]
]
[endsect]

View File

@@ -0,0 +1,295 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:stack Stack allocation]
A __coro__ uses internally a __ctx__ which manages a set of registers and a stack.
The memory used by the stack is allocated/deallocated via a __stack_allocator__
which is required to model a __stack_allocator_concept__.
[heading __stack_allocator_concept__]
A __stack_allocator__ must satisfy the __stack_allocator_concept__ requirements
shown in the following table, in which `a` is an object of a
__stack_allocator__ type, `sctx` is a `stack_context`, and `size` is a `std::size_t`:
[table
[[expression][return type][notes]]
[
[`a.allocate( sctx, size)`]
[`void`]
[creates a stack of at least `size` bytes and stores its pointer and
length in `sctx`]
]
[
[`a.deallocate( sctx)`]
[`void`]
[deallocates the stack created by `a.allocate()`]
]
]
[important The implementation of `allocate()` might include logic to protect
against exceeding the context's available stack size rather than leaving it as
undefined behaviour.]
[important Calling `deallocate()` with a `stack_context` not set by `allocate()`
results in undefined behaviour.]
[note The stack is not required to be aligned; alignment takes place inside
__coro__.]
[note Depending on the architecture `allocate()` stores an address from the
top of the stack (growing downwards) or the bottom of the stack (growing
upwards).]
class __coro_allocator__ is a typedef of __standard_allocator__.
[section:protected_stack_allocator Class ['protected_stack_allocator]]
__boost_coroutine__ provides the class __protected_allocator__ which models
the __stack_allocator_concept__.
It appends a guard page at the end of each stack to protect against exceeding
the stack. If the guard page is accessed (read or write operation) a
segmentation fault/access violation is generated by the operating system.
[important Using __protected_allocator__ is expensive. That is, launching a
new coroutine with a new stack is expensive; the allocated stack is just as
efficient to use as any other stack.]
[note The appended `guard page` is [*not] mapped to physical memory, only
virtual addresses are used.]
#include <boost/coroutine/protected_stack_allocator.hpp>
template< typename traitsT >
struct basic_protected_stack_allocator
{
typedef traitT traits_type;
void allocate( stack_context &, std::size_t size);
void deallocate( stack_context &);
}
typedef basic_protected_stack_allocator< stack_traits > protected_stack_allocator
[heading `void allocate( stack_context & sctx, std::size_t size)`]
[variablelist
[[Preconditions:] [`traits_type::minimum_size() <= size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= size)`.]]
[[Effects:] [Allocates memory of at least `size` bytes and stores a pointer
to the stack and its actual size in `sctx`. Depending
on the architecture (the stack grows downwards/upwards) the stored address is
the highest/lowest address of the stack.]]
]
[heading `void deallocate( stack_context & sctx)`]
[variablelist
[[Preconditions:] [`sctx.sp` is valid, `traits_type::minimum_size() <= sctx.size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= sctx.size)`.]]
[[Effects:] [Deallocates the stack space.]]
]
[endsect]
[section:standard_stack_allocator Class ['standard_stack_allocator]]
__boost_coroutine__ provides the class __standard_allocator__ which models
the __stack_allocator_concept__.
In contrast to __protected_allocator__ it does not append a guard page at the
end of each stack. The memory is simply managed by `std::malloc()` and
`std::free()`.
[note The __standard_allocator__ is the default stack allocator.]
#include <boost/coroutine/standard_stack_allocator.hpp>
template< typename traitsT >
struct standard_stack_allocator
{
typedef traitT traits_type;
void allocate( stack_context &, std::size_t size);
void deallocate( stack_context &);
}
typedef basic_standard_stack_allocator< stack_traits > standard_stack_allocator
[heading `void allocate( stack_context & sctx, std::size_t size)`]
[variablelist
[[Preconditions:] [`traits_type::minimum_size() <= size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= size)`.]]
[[Effects:] [Allocates memory of at least `size` bytes and stores a pointer to
the stack and its actual size in `sctx`. Depending on the architecture (the
stack grows downwards/upwards) the stored address is the highest/lowest
address of the stack.]]
]
[heading `void deallocate( stack_context & sctx)`]
[variablelist
[[Preconditions:] [`sctx.sp` is valid, `traits_type::minimum_size() <= sctx.size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= sctx.size)`.]]
[[Effects:] [Deallocates the stack space.]]
]
[endsect]
[section:segmented_stack_allocator Class ['segmented_stack_allocator]]
__boost_coroutine__ supports usage of a __segmented_stack__, e. g. the size of
the stack grows on demand. The coroutine is created with a minimal stack size
and will be increased as required.
Class __segmented_allocator__ models the __stack_allocator_concept__.
In contrast to __protected_allocator__ and __standard_allocator__ it creates a
stack which grows on demand.
[note Segmented stacks are currently only supported by [*gcc] from version
[*4.7] and [*clang] from version [*3.4] onwards. In order to use a
__segmented_stack__ __boost_coroutine__ must be built with
[*toolset=gcc segmented-stacks=on] at b2/bjam command-line. Applications
must be compiled with compiler-flags
[*-fsplit-stack -DBOOST_USE_SEGMENTED_STACKS].]
#include <boost/coroutine/segmented_stack_allocator.hpp>
template< typename traitsT >
struct basic_segmented_stack_allocator
{
typedef traitT traits_type;
void allocate( stack_context &, std::size_t size);
void deallocate( stack_context &);
}
typedef basic_segmented_stack_allocator< stack_traits > segmented_stack_allocator;
[heading `void allocate( stack_context & sctx, std::size_t size)`]
[variablelist
[[Preconditions:] [`traits_type::minimum_size() <= size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= size)`.]]
[[Effects:] [Allocates memory of at least `size` bytes and stores a pointer to
the stack and its actual size in `sctx`. Depending on the architecture (the
stack grows downwards/upwards) the stored address is the highest/lowest
address of the stack.]]
]
[heading `void deallocate( stack_context & sctx)`]
[variablelist
[[Preconditions:] [`sctx.sp` is valid, `traits_type::minimum_size() <= sctx.size` and
`! traits_type::is_unbounded() && ( traits_type::maximum_size() >= sctx.size)`.]]
[[Effects:] [Deallocates the stack space.]]
]
[endsect]
[section:stack_traits Class ['stack_traits]]
['stack_traits] models a __stack_traits__ providing a way to access certain
properites defined by the enironment. Stack allocators use __stack_traits__ to
allocate stacks.
#include <boost/coroutine/stack_traits.hpp>
struct stack_traits
{
static bool is_unbounded() noexcept;
static std::size_t page_size() noexcept;
static std::size_t default_size() noexcept;
static std::size_t minimum_size() noexcept;
static std::size_t maximum_size() noexcept;
}
[heading `static bool is_unbounded()`]
[variablelist
[[Returns:] [Returns `true` if the environment defines no limit for the size of
a stack.]]
[[Throws:] [Nothing.]]
]
[heading `static std::size_t page_size()`]
[variablelist
[[Returns:] [Returns the page size in bytes.]]
[[Throws:] [Nothing.]]
]
[heading `static std::size_t default_size()`]
[variablelist
[[Returns:] [Returns a default stack size, which may be platform specific.
If the stack is unbounded then the present implementation returns the maximum of
`64 kB` and `minimum_size()`.]]
[[Throws:] [Nothing.]]
]
[heading `static std::size_t minimum_size()`]
[variablelist
[[Returns:] [Returns the minimum size in bytes of stack defined by the
environment (Win32 4kB/Win64 8kB, defined by rlimit on POSIX).]]
[[Throws:] [Nothing.]]
]
[heading `static std::size_t maximum_size()`]
[variablelist
[[Preconditions:] [`is_unbounded()` returns `false`.]]
[[Returns:] [Returns the maximum size in bytes of stack defined by the
environment.]]
[[Throws:] [Nothing.]]
]
[endsect]
[section:stack_context Class ['stack_context]]
__boost_coroutine__ provides the class __stack_context__ which will contain
the stack pointer and the size of the stack.
In case of a __segmented_stack__, __stack_context__ contains some extra control
structures.
struct stack_context
{
void * sp;
std::size_t size;
// might contain additional control structures
// for instance for segmented stacks
}
[heading `void * sp`]
[variablelist
[[Value:] [Pointer to the beginning of the stack.]]
]
[heading `std::size_t size`]
[variablelist
[[Value:] [Actual size of the stack.]]
]
[endsect]
[section:valgrind Support for valgrind]
Running programs that switch stacks under valgrind causes problems.
Property (b2 command-line) `valgrind=on` let valgrind treat the memory regions
as stack space which suppresses the errors.
[endsect]
[endsect]

View File

@@ -0,0 +1,439 @@
[/
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section:symmetric Symmetric coroutine]
In contrast to asymmetric coroutines, where the relationship between caller and
callee is fixed, symmetric coroutines are able to transfer execution control
to any other (symmetric) coroutine. E.g. a symmetric coroutine is not required
to return to its direct caller.
[heading __call_coro__]
__call_coro__ starts a symmetric coroutine and transfers its parameter to its
__coro_fn__.
The template parameter defines the transferred parameter type.
The constructor of __call_coro__ takes a function (__coro_fn__) accepting a
reference to a __yield_coro__ as argument. Instantiating a __call_coro__ does
not pass the control of execution to __coro_fn__ - instead the first call of
__call_coro_op__ synthesizes a __yield_coro__ and passes it as reference to
__coro_fn__.
The __call_coro__ interface does not contain a ['get()]-function: you can not
retrieve values from another execution context with this kind of coroutine
object.
[heading __yield_coro__]
__yield_coro_op__ is used to transfer data and execution control to another
context by calling __yield_coro_op__ with another __call_coro__ as first argument.
Alternatively, you may transfer control back to the code that called
__call_coro_op__ by calling __yield_coro_op__ without a __call_coro__ argument.
The class has only one template parameter defining the transferred parameter
type.
Data transferred to the coroutine are accessed through __yield_coro_get__.
[important __yield_coro__ can only be created by the framework.]
std::vector<int> merge(const std::vector<int>& a,const std::vector<int>& b)
{
std::vector<int> c;
std::size_t idx_a=0,idx_b=0;
boost::coroutines::symmetric_coroutine<void>::call_type* other_a=0,* other_b=0;
boost::coroutines::symmetric_coroutine<void>::call_type coro_a(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield) {
while(idx_a<a.size())
{
if(b[idx_b]<a[idx_a]) // test if element in array b is less than in array a
yield(*other_b); // yield to coroutine coro_b
c.push_back(a[idx_a++]); // add element to final array
}
// add remaining elements of array b
while ( idx_b < b.size())
c.push_back( b[idx_b++]);
});
boost::coroutines::symmetric_coroutine<void>::call_type coro_b(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield) {
while(idx_b<b.size())
{
if (a[idx_a]<b[idx_b]) // test if element in array a is less than in array b
yield(*other_a); // yield to coroutine coro_a
c.push_back(b[idx_b++]); // add element to final array
}
// add remaining elements of array a
while ( idx_a < a.size())
c.push_back( a[idx_a++]);
});
other_a = & coro_a;
other_b = & coro_b;
coro_a(); // enter coroutine-fn of coro_a
return c;
}
std::vector< int > a = {1,5,6,10};
std::vector< int > b = {2,4,7,8,9,13};
std::vector< int > c = merge(a,b);
print(a);
print(b);
print(c);
output:
a : 1 5 6 10
b : 2 4 7 8 9 13
c : 1 2 4 5 6 7 8 9 10 13
In this example two __call_coro__ are created in the main execution context
accepting a lambda function (== __coro_fn__) which merges elements of two
sorted arrays into a third array.
`coro_a()` enters the __coro_fn__ of `coro_a` cycling through the array and
testing if the actual element in the other array is less than the element in
the local one. If so, the coroutine yields to the other coroutine `coro_b`
using `yield(*other_b)`. If the current element of the local array is less
than the element of the other array, it is put to the third array.
Because the coroutine jumps back to `coro_a()` (returning from this method)
after leaving the __coro_fn__, the elements of the other array will appended
at the end of the third array if all element of the local array are processed.
[heading coroutine-function]
The __coro_fn__ returns ['void] and takes __yield_coro__, providing
coroutine functionality inside the __coro_fn__, as argument. Using this
instance is the only way to transfer data and execution control.
__call_coro__ does not enter the __coro_fn__ at __call_coro__ construction but
at the first invocation of __call_coro_op__.
Unless the template parameter is `void`, the __coro_fn__ of a
__call_coro__ can assume that (a) upon initial entry and (b) after every
__yield_coro_op__ call, its __yield_coro_get__ has a new value available.
However, if the template parameter is a move-only type,
__yield_coro_get__ may only be called once before the next __yield_coro_op__
call.
[heading passing data from main-context to a symmetric-coroutine]
In order to transfer data to a __call_coro__ from the main-context the
framework synthesizes a __yield_coro__ associated with the __call_coro__
instance. The synthesized __yield_coro__ is passed as argument to __coro_fn__.
The main-context must call __call_coro_op__ in order to transfer each data value
into the __coro_fn__.
Access to the transferred data value is given by __yield_coro_get__.
boost::coroutines::symmetric_coroutine<int>::call_type coro( // constructor does NOT enter coroutine-function
[&](boost::coroutines::symmetric_coroutine<int>::yield_type& yield){
for (;;) {
std::cout << yield.get() << " ";
yield(); // jump back to starting context
}
});
coro(1); // transfer {1} to coroutine-function
coro(2); // transfer {2} to coroutine-function
coro(3); // transfer {3} to coroutine-function
coro(4); // transfer {4} to coroutine-function
coro(5); // transfer {5} to coroutine-function
[heading exceptions]
An uncaught exception inside a __call_coro__'s __coro_fn__ will call
__terminate__.
[important Code executed by coroutine must not prevent the propagation of the
__forced_unwind__ exception. Absorbing that exception will cause stack
unwinding to fail. Thus, any code that catches all exceptions must re-throw any
pending __forced_unwind__ exception.]
try {
// code that might throw
} catch(const boost::coroutines::detail::forced_unwind&) {
throw;
} catch(...) {
// possibly not re-throw pending exception
}
[important Do not jump from inside a catch block and then re-throw the
exception in another execution context.]
[heading Stack unwinding]
Sometimes it is necessary to unwind the stack of an unfinished coroutine to
destroy local stack variables so they can release allocated resources (RAII
pattern). The `attributes` argument of the coroutine constructor indicates
whether the destructor should unwind the stack (stack is unwound by default).
Stack unwinding assumes the following preconditions:
* The coroutine is not __not_a_coro__
* The coroutine is not complete
* The coroutine is not running
* The coroutine owns a stack
After unwinding, a __coro__ is complete.
struct X {
X(){
std::cout<<"X()"<<std::endl;
}
~X(){
std::cout<<"~X()"<<std::endl;
}
};
boost::coroutines::symmetric_coroutine<int>::call_type other_coro(...);
{
boost::coroutines::symmetric_coroutine<void>::call_type coro(
[&](boost::coroutines::symmetric_coroutine<void>::yield_type& yield){
X x;
std::cout<<"fn()"<<std::endl;
// transfer execution control to other coroutine
yield( other_coro, 7);
});
coro();
std::cout<<"coro is complete: "<<std::boolalpha<<!coro<<"\n";
}
output:
X()
fn()
coro is complete: false
~X()
[heading Exit a __coro_fn__]
__coro_fn__ is exited with a simple return statement. This jumps back to the
calling __call_coro_op__ at the start of symmetric coroutine chain. That is,
symmetric coroutines do not have a strong, fixed relationship to the caller as
do asymmetric coroutines. The __call_coro__ becomes complete, e.g.
__call_coro_bool__ will return `false`.
[important After returning from __coro_fn__ the __coro__ is complete (can not be
resumed with __call_coro_op__).]
[section:symmetric_coro Class `symmetric_coroutine<>::call_type`]
#include <boost/coroutine/symmetric_coroutine.hpp>
template< typename Arg >
class symmetric_coroutine<>::call_type
{
public:
call_type() noexcept;
template< typename Fn >
call_type( Fn && fn, attributes const& attr = attributes() );
template< typename Fn, typename StackAllocator >
call_type( Fn && fn, attributes const& attr, StackAllocator stack_alloc);
~call_type();
call_type( call_type const& other)=delete;
call_type & operator=( call_type const& other)=delete;
call_type( call_type && other) noexcept;
call_type & operator=( call_type && other) noexcept;
operator unspecified-bool-type() const;
bool operator!() const noexcept;
void swap( call_type & other) noexcept;
call_type & operator()( Arg arg) noexcept;
};
template< typename Arg >
void swap( symmetric_coroutine< Arg >::call_type & l, symmetric_coroutine< Arg >::call_type & r);
[heading `call_type()`]
[variablelist
[[Effects:] [Creates a coroutine representing __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `template< typename Fn >
call_type( Fn fn, attributes const& attr)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`. Argument `attr`
determines stack clean-up.
For allocating/deallocating the stack `stack_alloc` is used.]]
]
[heading `template< typename Fn, typename StackAllocator >
call_type( Fn && fn, attributes const& attr, StackAllocator const& stack_alloc)`]
[variablelist
[[Preconditions:] [`size` >= minimum_stacksize(), `size` <= maximum_stacksize()
when ! is_stack_unbounded().]]
[[Effects:] [Creates a coroutine which will execute `fn`. Argument `attr`
determines stack clean-up.
For allocating/deallocating the stack `stack_alloc` is used.]]
]
[heading `~call_type()`]
[variablelist
[[Effects:] [Destroys the context and deallocates the stack.]]
]
[heading `call_type( call_type && other)`]
[variablelist
[[Effects:] [Moves the internal data of `other` to `*this`.
`other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `call_type & operator=( call_type && other)`]
[variablelist
[[Effects:] [Destroys the internal data of `*this` and moves the
internal data of `other` to `*this`. `other` becomes __not_a_coro__.]]
[[Throws:] [Nothing.]]
]
[heading `operator unspecified-bool-type() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `false`. Otherwise `true`.]]
[[Throws:] [Nothing.]]
]
[heading `bool operator!() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__ or the coroutine-function
has returned (completed), the function returns `true`. Otherwise `false`.]]
[[Throws:] [Nothing.]]
]
[heading `void swap( call_type & other)`]
[variablelist
[[Effects:] [Swaps the internal data from `*this` with the values
of `other`.]]
[[Throws:] [Nothing.]]
]
[heading `call_type & operator()(Arg arg)`]
symmetric_coroutine::call_type& coroutine<Arg,StackAllocator>::call_type::operator()(Arg);
symmetric_coroutine::call_type& coroutine<Arg&,StackAllocator>::call_type::operator()(Arg&);
symmetric_coroutine::call_type& coroutine<void,StackAllocator>::call_type::operator()();
[variablelist
[[Preconditions:] [operator unspecified-bool-type() returns `true` for `*this`.]]
[[Effects:] [Execution control is transferred to __coro_fn__ and the argument
`arg` is passed to the coroutine-function.]]
[[Throws:] [Nothing.]]
]
[heading Non-member function `swap()`]
template< typename Arg >
void swap( symmetric_coroutine< Arg >::call_type & l, symmetric_coroutine< Arg >::call_type & r);
[variablelist
[[Effects:] [As if 'l.swap( r)'.]]
]
[endsect]
[section:yield_coro Class `symmetric_coroutine<>::yield_type`]
#include <boost/coroutine/symmetric_coroutine.hpp>
template< typename R >
class symmetric_coroutine<>::yield_type
{
public:
yield_type() noexcept;
yield_type( yield_type const& other)=delete;
yield_type & operator=( yield_type const& other)=delete;
yield_type( yield_type && other) noexcept;
yield_type & operator=( yield_type && other) noexcept;
void swap( yield_type & other) noexcept;
operator unspecified-bool-type() const;
bool operator!() const noexcept;
yield_type & operator()();
template< typename X >
yield_type & operator()( symmetric_coroutine< X >::call_type & other, X & x);
template< typename X >
yield_type & operator()( symmetric_coroutine< X >::call_type & other);
R get() const;
};
[heading `operator unspecified-bool-type() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__, the function returns `false`.
Otherwise `true`.]]
[[Throws:] [Nothing.]]
]
[heading `bool operator!() const`]
[variablelist
[[Returns:] [If `*this` refers to __not_a_coro__, the function returns `true`.
Otherwise `false`.]]
[[Throws:] [Nothing.]]
]
[heading `yield_type & operator()()`]
yield_type & operator()();
template< typename X >
yield_type & operator()( symmetric_coroutine< X >::call_type & other, X & x);
template<>
yield_type & operator()( symmetric_coroutine< void >::call_type & other);
[variablelist
[[Preconditions:] [`*this` is not a __not_a_coro__.]]
[[Effects:] [The first function transfers execution control back to the starting point,
e.g. invocation of __call_coro_op__. The last two functions transfer the execution control
to another symmetric coroutine. Parameter `x` is passed as value into `other`'s context.]]
[[Throws:] [__forced_unwind__]]
]
[heading `R get()`]
R symmetric_coroutine<R>::yield_type::get();
R& symmetric_coroutine<R&>::yield_type::get();
void symmetric_coroutine<void>yield_type::get()=delete;
[variablelist
[[Preconditions:] [`*this` is not a __not_a_coro__.]]
[[Returns:] [Returns data transferred from coroutine-function via
__call_coro_op__.]]
[[Throws:] [`invalid_result`]]
]
[endsect]
[endsect]

View File

@@ -0,0 +1,63 @@
# Boost.Coroutine Library Examples Jamfile
# Copyright Oliver Kowalke 2009.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# For more information, see http://www.boost.org/
import common ;
import feature ;
import indirect ;
import modules ;
import os ;
import toolset ;
project boost/coroutine/example/asymmetric
: requirements
<library>/boost/context//boost_context
<library>/boost/coroutine//boost_coroutine
<library>/boost/program_options//boost_program_options
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack
<toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<link>shared
<threading>multi
;
exe chaining
: chaining.cpp
;
exe echo
: echo.cpp
;
exe exception
: exception.cpp
;
exe fibonacci
: fibonacci.cpp
;
exe layout
: layout.cpp
;
exe parallel
: parallel.cpp
;
exe power
: power.cpp
;
exe same_fringe
: same_fringe.cpp
;
exe segmented_stack
: segmented_stack.cpp
;
exe simple
: simple.cpp
test.cpp
;
exe unwind
: unwind.cpp
;

View File

@@ -0,0 +1,13 @@
#ifndef X_H
#define X_H
struct X
{
int i;
X( int i_) :
i( i_)
{}
};
#endif // X_H

View File

@@ -0,0 +1,206 @@
// Copyright Nat Goodspeed 2013.
// 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)
#include <boost/coroutine/all.hpp>
#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>
#include <sstream>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
typedef boost::coroutines::asymmetric_coroutine<std::string> coro_t;
// deliver each line of input stream to sink as a separate string
void readlines(coro_t::push_type& sink, std::istream& in)
{
std::string line;
while (std::getline(in, line))
sink(line);
}
void tokenize(coro_t::push_type& sink, coro_t::pull_type& source)
{
// This tokenizer doesn't happen to be stateful: you could reasonably
// implement it with a single call to push each new token downstream. But
// I've worked with stateful tokenizers, in which the meaning of input
// characters depends in part on their position within the input line. At
// the time, I wished for a way to resume at the suspend point!
BOOST_FOREACH(std::string line, source)
{
std::string::size_type pos = 0;
while (pos < line.length())
{
if (line[pos] == '"')
{
std::string token;
++pos; // skip open quote
while (pos < line.length() && line[pos] != '"')
token += line[pos++];
++pos; // skip close quote
sink(token); // pass token downstream
}
else if (std::isspace(line[pos]))
{
++pos; // outside quotes, ignore whitespace
}
else if (std::isalpha(line[pos]))
{
std::string token;
while (pos < line.length() && std::isalpha(line[pos]))
token += line[pos++];
sink(token); // pass token downstream
}
else // punctuation
{
sink(std::string(1, line[pos++]));
}
}
}
}
void only_words(coro_t::push_type& sink, coro_t::pull_type& source)
{
BOOST_FOREACH(std::string token, source)
{
if (! token.empty() && std::isalpha(token[0]))
sink(token);
}
}
void trace(coro_t::push_type& sink, coro_t::pull_type& source)
{
BOOST_FOREACH(std::string token, source)
{
std::cout << "trace: '" << token << "'\n";
sink(token);
}
}
struct FinalEOL
{
~FinalEOL() { std::cout << std::endl; }
};
void layout(coro_t::pull_type& source, int num, int width)
{
// Finish the last line when we leave by whatever means
FinalEOL eol;
// Pull values from upstream, lay them out 'num' to a line
for (;;)
{
for (int i = 0; i < num; ++i)
{
// when we exhaust the input, stop
if (! source)
return;
std::cout << std::setw(width) << source.get();
// now that we've handled this item, advance to next
source();
}
// after 'num' items, line break
std::cout << std::endl;
}
}
int main(int argc, char *argv[])
{
// For example purposes, instead of having a separate text file in the
// local filesystem, construct an istringstream to read.
std::string data(
"This is the first line.\n"
"This, the second.\n"
"The third has \"a phrase\"!\n"
);
{
std::cout << "\nreadlines:\n";
std::istringstream infile(data);
// Each coroutine-function has a small, specific job to do. Instead of
// adding conditional logic to a large, complex input function, the
// caller composes smaller functions into the desired processing
// chain.
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tracer(boost::bind(trace, _1, boost::ref(reader)));
BOOST_FOREACH(std::string line, tracer)
{
std::cout << "got: " << line << "\n";
}
}
{
std::cout << "\ncompose a chain:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type tracer(boost::bind(trace, _1, boost::ref(tokenizer)));
BOOST_FOREACH(std::string token, tracer)
{
// just iterate, we're already pulling through tracer
}
}
{
std::cout << "\nfilter:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type filter(boost::bind(only_words, _1, boost::ref(tokenizer)));
coro_t::pull_type tracer(boost::bind(trace, _1, boost::ref(filter)));
BOOST_FOREACH(std::string token, tracer)
{
// just iterate, we're already pulling through tracer
}
}
{
std::cout << "\nlayout() as coroutine::push_type:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type filter(boost::bind(only_words, _1, boost::ref(tokenizer)));
coro_t::push_type writer(boost::bind(layout, _1, 5, 15));
BOOST_FOREACH(std::string token, filter)
{
writer(token);
}
}
{
std::cout << "\ncalling layout() directly:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::pull_type filter(boost::bind(only_words, _1, boost::ref(tokenizer)));
// Because of the symmetry of the API, we can directly call layout()
// instead of using it as a coroutine-function.
layout(filter, 5, 15);
}
{
std::cout << "\nfiltering output:\n";
std::istringstream infile(data);
coro_t::pull_type reader(boost::bind(readlines, _1, boost::ref(infile)));
coro_t::pull_type tokenizer(boost::bind(tokenize, _1, boost::ref(reader)));
coro_t::push_type writer(boost::bind(layout, _1, 5, 15));
// Because of the symmetry of the API, we can use any of these
// chaining functions in a push_type coroutine chain as well.
coro_t::push_type filter(boost::bind(only_words, boost::ref(writer), _1));
BOOST_FOREACH(std::string token, tokenizer)
{
filter(token);
}
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,48 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
typedef boost::coroutines::asymmetric_coroutine< void >::pull_type pull_coro_t;
typedef boost::coroutines::asymmetric_coroutine< void >::push_type push_coro_t;
void echo( pull_coro_t & source, int i)
{
std::cout << i;
source();
}
void runit( push_coro_t & sink1)
{
std::cout << "started! ";
for ( int i = 0; i < 10; ++i)
{
push_coro_t sink2( boost::bind( echo, _1, i) );
while ( sink2)
sink2();
sink1();
}
}
int main( int argc, char * argv[])
{
{
pull_coro_t source( runit);
while ( source) {
std::cout << "-";
source();
}
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,53 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <string>
#include <boost/bind.hpp>
#include <boost/throw_exception.hpp>
typedef boost::coroutines::asymmetric_coroutine< int >::pull_type pull_coro_t;
typedef boost::coroutines::asymmetric_coroutine< int >::push_type push_coro_t;
struct my_exception : public std::runtime_error
{
my_exception( std::string const& str) :
std::runtime_error( str)
{}
};
void echo( push_coro_t & sink, int j)
{
for ( int i = 0; i < j; ++i)
{
if ( i == 5) boost::throw_exception( my_exception("abc") );
sink( i);
}
}
int main( int argc, char * argv[])
{
pull_coro_t source( boost::bind( echo, _1, 10) );
try
{
while ( source)
{
std::cout << source.get() << std::endl;
source();
}
}
catch ( my_exception const& ex)
{ std::cout << "exception: " << ex.what() << std::endl; }
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,43 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/range.hpp>
void fibonacci( boost::coroutines::asymmetric_coroutine< int >::push_type & sink)
{
int first = 1, second = 1;
sink( first);
sink( second);
while ( true)
{
int third = first + second;
first = second;
second = third;
sink( third);
}
}
int main()
{
boost::coroutines::asymmetric_coroutine< int >::pull_type source( fibonacci);
boost::range_iterator<
boost::coroutines::asymmetric_coroutine< int >::pull_type
>::type it( boost::begin( source) );
for ( int i = 0; i < 10; ++i)
{
std::cout << * it << " ";
++it;
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,74 @@
// Copyright Nat Goodspeed 2013.
// 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)
#include <boost/coroutine/all.hpp>
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <utility>
#include <boost/assign/list_of.hpp>
#include <boost/bind.hpp>
#include <boost/range.hpp>
struct FinalEOL
{
~FinalEOL() { std::cout << std::endl; }
};
void layout(boost::coroutines::asymmetric_coroutine<std::string>::pull_type& in, int num, int width)
{
// Finish the last line when we leave by whatever means
FinalEOL eol;
// Pull values from upstream, lay them out 'num' to a line
for (;;)
{
for (int i = 0; i < num; ++i)
{
// when we exhaust the input, stop
if (! in)
return;
std::cout << std::setw(width) << in.get();
// now that we've handled this item, advance to next
in();
}
// after 'num' items, line break
std::cout << std::endl;
}
}
int main(int argc, char *argv[])
{
std::vector<std::string> words = boost::assign::list_of
("peas")
("porridge")
("hot")
("peas")
("porridge")
("cold")
("peas")
("porridge")
("in")
("the")
("pot")
("nine")
("days")
("old")
;
boost::coroutines::asymmetric_coroutine<std::string>::push_type writer(
boost::bind(layout, _1, 5, 15));
std::copy(boost::begin(words), boost::end(words), boost::begin(writer));
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,50 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
void first( boost::coroutines::asymmetric_coroutine< void >::push_type & sink)
{
std::cout << "started first! ";
for ( int i = 0; i < 10; ++i)
{
sink();
std::cout << "a" << i;
}
}
void second( boost::coroutines::asymmetric_coroutine< void >::push_type & sink)
{
std::cout << "started second! ";
for ( int i = 0; i < 10; ++i)
{
sink();
std::cout << "b" << i;
}
}
int main( int argc, char * argv[])
{
{
boost::coroutines::asymmetric_coroutine< void >::pull_type source1( boost::bind( first, _1) );
boost::coroutines::asymmetric_coroutine< void >::pull_type source2( boost::bind( second, _1) );
while ( source1 && source2) {
source1();
std::cout << " ";
source2();
std::cout << " ";
}
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,48 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <boost/range.hpp>
void power( boost::coroutines::asymmetric_coroutine< int >::push_type & sink, int number, int exponent)
{
int counter = 0;
int result = 1;
while ( counter++ < exponent)
{
result = result * number;
sink( result);
}
}
int main()
{
{
std::cout << "using range functions" << std::endl;
boost::coroutines::asymmetric_coroutine< int >::pull_type source( boost::bind( power, _1, 2, 8) );
boost::coroutines::asymmetric_coroutine< int >::pull_type::iterator e( boost::end( source) );
for ( boost::coroutines::asymmetric_coroutine< int >::pull_type::iterator i( boost::begin( source) );
i != e; ++i)
std::cout << * i << " ";
}
{
std::cout << "\nusing BOOST_FOREACH" << std::endl;
boost::coroutines::asymmetric_coroutine< int >::pull_type source( boost::bind( power, _1, 2, 8) );
BOOST_FOREACH( int i, source)
{ std::cout << i << " "; }
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,162 @@
// Copyright Nat Goodspeed 2013.
// 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)
#include <boost/coroutine/all.hpp>
#include <cstddef>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <string>
#include <utility>
#include <boost/bind.hpp>
#include <boost/range.hpp>
#include <boost/shared_ptr.hpp>
struct node
{
typedef boost::shared_ptr< node > ptr_t;
// Each tree node has an optional left subtree, an optional right subtree
// and a value of its own. The value is considered to be between the left
// subtree and the right.
ptr_t left, right;
std::string value;
// construct leaf
node(const std::string& v):
left(), right(), value(v)
{}
// construct nonleaf
node(ptr_t l, const std::string& v, ptr_t r):
left(l), right(r), value(v)
{}
static ptr_t create(const std::string& v)
{
return ptr_t(new node(v));
}
static ptr_t create(ptr_t l, const std::string& v, ptr_t r)
{
return ptr_t(new node(l, v, r));
}
};
node::ptr_t create_left_tree_from(const std::string& root)
{
/* --------
root
/ \
b e
/ \
a c
-------- */
return node::create(
node::create(
node::create("a"),
"b",
node::create("c")),
root,
node::create("e"));
}
node::ptr_t create_right_tree_from(const std::string& root)
{
/* --------
root
/ \
a d
/ \
c e
-------- */
return node::create(
node::create("a"),
root,
node::create(
node::create("c"),
"d",
node::create("e")));
}
// recursively walk the tree, delivering values in order
void traverse(node::ptr_t n,boost::coroutines::asymmetric_coroutine<std::string>::push_type& out)
{
if (n->left) traverse(n->left,out);
out(n->value);
if (n->right) traverse(n->right,out);
}
int main()
{
{
node::ptr_t left_d(create_left_tree_from("d"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type left_d_reader(
boost::bind(traverse, left_d, _1));
std::cout << "left tree from d:\n";
std::copy(boost::begin(left_d_reader),
boost::end(left_d_reader),
std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
node::ptr_t right_b(create_right_tree_from("b"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_b_reader(
boost::bind(traverse, right_b, _1));
std::cout << "right tree from b:\n";
std::copy(boost::begin(right_b_reader),
boost::end(right_b_reader),
std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
node::ptr_t right_x(create_right_tree_from("x"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_x_reader(
boost::bind(traverse, right_x, _1));
std::cout << "right tree from x:\n";
std::copy(boost::begin(right_x_reader),
boost::end(right_x_reader),
std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
}
{
node::ptr_t left_d(create_left_tree_from("d"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type left_d_reader(
boost::bind(traverse, left_d, _1));
node::ptr_t right_b(create_right_tree_from("b"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_b_reader(
boost::bind(traverse, right_b, _1));
std::cout << "left tree from d == right tree from b? "
<< std::boolalpha
<< std::equal(boost::begin(left_d_reader),
boost::end(left_d_reader),
boost::begin(right_b_reader))
<< std::endl;
}
{
node::ptr_t left_d(create_left_tree_from("d"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type left_d_reader(
boost::bind(traverse, left_d, _1));
node::ptr_t right_x(create_right_tree_from("x"));
boost::coroutines::asymmetric_coroutine<std::string>::pull_type right_x_reader(
boost::bind(traverse, right_x, _1));
std::cout << "left tree from d == right tree from x? "
<< std::boolalpha
<< std::equal(boost::begin(left_d_reader),
boost::end(left_d_reader),
boost::begin(right_x_reader))
<< std::endl;
}
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,63 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <iostream>
#include <boost/assert.hpp>
#include <boost/config.hpp>
int count = 384;
#ifdef BOOST_MSVC //MS VisualStudio
__declspec(noinline) void access( char *buf);
#else // GCC
void access( char *buf) __attribute__ ((noinline));
#endif
void access( char *buf)
{
buf[0] = '\0';
}
void bar( int i)
{
char buf[4 * 1024];
if ( i > 0)
{
access( buf);
std::cout << i << ". iteration" << std::endl;
bar( i - 1);
}
}
void foo( boost::coroutines::asymmetric_coroutine< void >::pull_type & source)
{
bar( count);
source();
}
int main( int argc, char * argv[])
{
#if defined(BOOST_USE_SEGMENTED_STACKS)
std::cout << "using segmented stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << boost::coroutines::stack_allocator::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application should not fail" << std::endl;
#else
std::cout << "using standard stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << boost::coroutines::stack_allocator::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application might fail" << std::endl;
#endif
boost::coroutines::asymmetric_coroutine< void >::push_type sink( foo);
sink();
std::cout << "Done" << std::endl;
return 0;
}

View File

@@ -0,0 +1,53 @@
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include "X.h"
typedef boost::coroutines::asymmetric_coroutine< X& >::pull_type pull_coro_t;
typedef boost::coroutines::asymmetric_coroutine< X& >::push_type push_coro_t;
void fn1( push_coro_t & sink)
{
for ( int i = 0; i < 10; ++i)
{
X x( i);
sink( x);
}
}
void fn2( pull_coro_t & source)
{
while ( source) {
X & x = source.get();
std::cout << "i = " << x.i << std::endl;
source();
}
}
int main( int argc, char * argv[])
{
{
pull_coro_t source( fn1);
while ( source) {
X & x = source.get();
std::cout << "i = " << x.i << std::endl;
source();
}
}
{
push_coro_t sink( fn2);
for ( int i = 0; i < 10; ++i)
{
X x( i);
sink( x);
}
}
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,45 @@
#include <boost/coroutine/all.hpp>
#include <boost/bind.hpp>
#include "X.h"
typedef boost::coroutines::asymmetric_coroutine< X& >::pull_type pull_coro_t;
typedef boost::coroutines::asymmetric_coroutine< X& >::push_type push_coro_t;
void foo1( push_coro_t & sink)
{
for ( int i = 0; i < 10; ++i)
{
X x( i);
sink( x);
}
}
void foo2( pull_coro_t & source)
{
while ( source) {
X & x = source.get();
source();
}
}
void bar()
{
{
pull_coro_t source( foo1);
while ( source) {
X & x = source.get();
source();
}
}
{
push_coro_t sink( foo2);
for ( int i = 0; i < 10; ++i)
{
X x( i);
sink( x);
}
}
}

View File

@@ -0,0 +1,125 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef TREE_H
#define TREE_H
#include <boost/coroutine/all.hpp>
#include <cstddef>
#include <string>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/intrusive_ptr.hpp>
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable:4355)
#endif
struct branch;
struct leaf;
struct visitor
{
virtual ~visitor() {};
virtual void visit( branch & b) = 0;
virtual void visit( leaf & l) = 0;
};
struct node
{
typedef boost::intrusive_ptr< node > ptr_t;
std::size_t use_count;
node() :
use_count( 0)
{}
virtual ~node() {}
virtual void accept( visitor & v) = 0;
friend inline void intrusive_ptr_add_ref( node * p)
{ ++p->use_count; }
friend inline void intrusive_ptr_release( node * p)
{ if ( 0 == --p->use_count) delete p; }
};
struct branch : public node
{
node::ptr_t left;
node::ptr_t right;
static ptr_t create( node::ptr_t left_, node::ptr_t right_)
{ return ptr_t( new branch( left_, right_) ); }
branch( node::ptr_t left_, node::ptr_t right_) :
left( left_), right( right_)
{}
void accept( visitor & v)
{ v.visit( * this); }
};
struct leaf : public node
{
std::string value;
static ptr_t create( std::string const& value_)
{ return ptr_t( new leaf( value_) ); }
leaf( std::string const& value_) :
value( value_)
{}
void accept( visitor & v)
{ v.visit( * this); }
};
inline
bool operator==( leaf const& l, leaf const& r)
{ return l.value == r.value; }
inline
bool operator!=( leaf const& l, leaf const& r)
{ return l.value != r.value; }
class tree_visitor : public visitor
{
private:
boost::coroutines::asymmetric_coroutine< leaf & >::push_type & c_;
public:
tree_visitor( boost::coroutines::asymmetric_coroutine< leaf & >::push_type & c) :
c_( c)
{}
void visit( branch & b)
{
if ( b.left) b.left->accept( * this);
if ( b.right) b.right->accept( * this);
}
void visit( leaf & l)
{ c_( l); }
};
void enumerate_leafs( boost::coroutines::asymmetric_coroutine< leaf & >::push_type & c, node::ptr_t root)
{
tree_visitor v( c);
root->accept( v);
}
#if defined(_MSC_VER)
# pragma warning(pop)
#endif
#endif // TREE_H

View File

@@ -0,0 +1,45 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
struct X : private boost::noncopyable
{
X() { std::cout << "X()" << std::endl; }
~X() { std::cout << "~X()" << std::endl; }
};
void fn( boost::coroutines::asymmetric_coroutine< void >::push_type & sink)
{
X x;
int i = 0;
while ( true)
{
std::cout << "fn() : " << ++i << std::endl;
sink();
}
}
int main( int argc, char * argv[])
{
{
boost::coroutines::asymmetric_coroutine< void >::pull_type source( fn);
for ( int k = 0; k < 3; ++k)
{
source();
}
std::cout << "destroying coroutine and unwinding stack" << std::endl;
}
std::cout << "\nDone" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,49 @@
# Boost.Coroutine Library Examples Jamfile
# Copyright Oliver Kowalke 2009.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# For more information, see http://www.boost.org/
import common ;
import feature ;
import indirect ;
import modules ;
import os ;
import toolset ;
project boost/coroutine/example/symmetric
: requirements
<library>/boost/context//boost_context
<library>/boost/coroutine//boost_coroutine
<library>/boost/program_options//boost_program_options
<library>/boost/random//boost_random
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack
<toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<link>static
<threading>multi
;
exe simple
: simple.cpp
;
exe dice_game
: dice_game.cpp
;
exe merge_arrays
: merge_arrays.cpp
;
exe unwind
: unwind.cpp
;
exe segmented_stack
: segmented_stack.cpp
;

View File

@@ -0,0 +1,70 @@
// Copyright Keld Helsgaun 2000, Oliver Kowalke 2014.
// 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)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/move/move.hpp>
#include <boost/random/random_device.hpp>
#include <boost/random/uniform_int_distribution.hpp>
typedef boost::coroutines::symmetric_coroutine< void > coro_t;
class player
{
private:
int die()
{
boost::random::uniform_int_distribution<> dist( 1, 6);
return dist( gen);
}
void run_( coro_t::yield_type & yield)
{
int sum = 0;
while ( ( sum += die() ) < 100)
yield( nxt->coro);
std::cout << "player " << id << " winns" << std::endl;
}
player( player const&);
player & operator=( player const&);
public:
int id;
player * nxt;
coro_t::call_type coro;
boost::random::random_device gen;
player( int id_) :
id( id_), nxt( 0),
coro( boost::bind( & player::run_, this, _1) ),
gen()
{}
void run()
{ coro(); }
};
int main( int argc, char * argv[])
{
player * first = new player( 1);
player * p = first;
for ( int i = 2; i <= 4; ++i)
{
p->nxt = new player( i);
p = p->nxt;
}
p->nxt = first;
first->run();
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,105 @@
// Copyright Keld Helsgaun 2000, Oliver Kowalke 2014.
// 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)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <cstddef>
#include <iostream>
#include <vector>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
typedef boost::coroutines::symmetric_coroutine< void > coro_t;
class merger
{
private:
std::size_t max_;
std::vector< int > & to_;
void run_( coro_t::yield_type & yield)
{
while ( idx < from.size() )
{
if ( other->from[other->idx] < from[idx])
yield( other->coro);
to_.push_back(from[idx++]);
}
while ( to_.size() < max_)
to_.push_back( other->from[other->idx++]);
}
merger( merger const&);
merger & operator=( merger const&);
public:
std::vector< int > const& from;
std::size_t idx;
merger * other;
coro_t::call_type coro;
merger( std::vector< int > const& from_, std::vector< int > & to, std::size_t max) :
max_( max),
to_( to),
from( from_),
idx( 0),
other( 0),
coro( boost::bind( & merger::run_, this, _1) )
{}
void run()
{ coro(); }
};
std::vector< int > merge( std::vector< int > const& a, std::vector< int > const& b)
{
std::vector< int > c;
merger ma( a, c, a.size() + b. size() );
merger mb( b, c, a.size() + b. size() );
ma.other = & mb;
mb.other = & ma;
ma.run();
return c;
}
void print( std::string const& name, std::vector< int > const& v)
{
std::cout << name << " : ";
BOOST_FOREACH( int itm, v)
{ std::cout << itm << " "; }
std::cout << "\n";
}
int main( int argc, char * argv[])
{
std::vector< int > a;
a.push_back( 1);
a.push_back( 5);
a.push_back( 6);
a.push_back( 10);
print( "a", a);
std::vector< int > b;
b.push_back( 2);
b.push_back( 4);
b.push_back( 7);
b.push_back( 8);
b.push_back( 9);
b.push_back( 13);
print( "b", b);
std::vector< int > c = merge( a, b);
print( "c", c);
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,67 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <iostream>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/thread.hpp>
int count = 384;
#ifdef BOOST_MSVC //MS VisualStudio
__declspec(noinline) void access( char *buf);
#else // GCC
void access( char *buf) __attribute__ ((noinline));
#endif
void access( char *buf)
{
buf[0] = '\0';
}
void bar( int i)
{
char buf[4 * 1024];
if ( i > 0)
{
access( buf);
std::cout << i << ". iteration" << std::endl;
bar( i - 1);
}
}
void foo( boost::coroutines::symmetric_coroutine< void >::yield_type &)
{
bar( count);
}
void thread_fn()
{
{
boost::coroutines::symmetric_coroutine< void >::call_type coro( foo);
coro();
}
}
int main( int argc, char * argv[])
{
#if defined(BOOST_USE_SEGMENTED_STACKS)
std::cout << "using segmented stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << boost::coroutines::stack_allocator::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application should not fail" << std::endl;
#else
std::cout << "using standard stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << boost::coroutines::stack_allocator::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application might fail" << std::endl;
#endif
boost::thread( thread_fn).join();
return 0;
}

View File

@@ -0,0 +1,47 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
typedef boost::coroutines::symmetric_coroutine< void > coro_t;
coro_t::call_type * c1 = 0;
coro_t::call_type * c2 = 0;
void foo( coro_t::yield_type & yield)
{
std::cout << "foo1" << std::endl;
yield( * c2);
std::cout << "foo2" << std::endl;
yield( * c2);
std::cout << "foo3" << std::endl;
}
void bar( coro_t::yield_type & yield)
{
std::cout << "bar1" << std::endl;
yield( * c1);
std::cout << "bar2" << std::endl;
yield( * c1);
std::cout << "bar3" << std::endl;
}
int main( int argc, char * argv[])
{
coro_t::call_type coro1( foo);
coro_t::call_type coro2( bar);
c1 = & coro1;
c2 = & coro2;
coro1();
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,51 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/coroutine/all.hpp>
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
struct X : private boost::noncopyable
{
X() { std::cout << "X()" << std::endl; }
~X() { std::cout << "~X()" << std::endl; }
};
typedef boost::coroutines::symmetric_coroutine< void > coro_t;
coro_t::call_type * c1 = 0;
coro_t::call_type * c2 = 0;
void foo( coro_t::yield_type & yield)
{
X x;
std::cout << "foo() entered" << std::endl;
yield( * c2);
yield( * c2);
std::cout << "foo() finished" << std::endl;
}
void bar( coro_t::yield_type & yield)
{
std::cout << "bar() entered" << std::endl;
yield( * c1);
std::cout << "bar() finished" << std::endl;
}
int main( int argc, char * argv[])
{
coro_t::call_type coro1( foo);
coro_t::call_type coro2( bar);
c1 = & coro1;
c2 = & coro2;
coro1();
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,21 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_ALL_H
#define BOOST_COROUTINES_ALL_H
#include <boost/coroutine/attributes.hpp>
#include <boost/coroutine/coroutine.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/flags.hpp>
#include <boost/coroutine/protected_stack_allocator.hpp>
#include <boost/coroutine/segmented_stack_allocator.hpp>
#include <boost/coroutine/stack_allocator.hpp>
#include <boost/coroutine/stack_context.hpp>
#include <boost/coroutine/stack_traits.hpp>
#include <boost/coroutine/standard_stack_allocator.hpp>
#endif // BOOST_COROUTINES_ALL_H

View File

@@ -0,0 +1,58 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_ATTRIBUTES_H
#define BOOST_COROUTINES_ATTRIBUTES_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/coroutine/flags.hpp>
#include <boost/coroutine/stack_allocator.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct attributes
{
std::size_t size;
flag_unwind_t do_unwind;
attributes() BOOST_NOEXCEPT :
size( stack_allocator::traits_type::default_size() ),
do_unwind( stack_unwind)
{}
explicit attributes( std::size_t size_) BOOST_NOEXCEPT :
size( size_),
do_unwind( stack_unwind)
{}
explicit attributes( flag_unwind_t do_unwind_) BOOST_NOEXCEPT :
size( stack_allocator::traits_type::default_size() ),
do_unwind( do_unwind_)
{}
explicit attributes(
std::size_t size_,
flag_unwind_t do_unwind_) BOOST_NOEXCEPT :
size( size_),
do_unwind( do_unwind_)
{}
};
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_ATTRIBUTES_H

View File

@@ -0,0 +1,13 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_COROUTINE_H
#define BOOST_COROUTINES_COROUTINE_H
#include <boost/coroutine/asymmetric_coroutine.hpp>
#include <boost/coroutine/symmetric_coroutine.hpp>
#endif // BOOST_COROUTINES_COROUTINE_H

View File

@@ -0,0 +1,46 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_CONFIG_H
#define BOOST_COROUTINES_DETAIL_CONFIG_H
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#ifdef BOOST_COROUTINES_DECL
# undef BOOST_COROUTINES_DECL
#endif
#if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_COROUTINES_DYN_LINK) ) && ! defined(BOOST_COROUTINES_STATIC_LINK)
# if defined(BOOST_COROUTINES_SOURCE)
# define BOOST_COROUTINES_DECL BOOST_SYMBOL_EXPORT
# define BOOST_COROUTINES_BUILD_DLL
# else
# define BOOST_COROUTINES_DECL BOOST_SYMBOL_IMPORT
# endif
#endif
#if ! defined(BOOST_COROUTINES_DECL)
# define BOOST_COROUTINES_DECL
#endif
#if ! defined(BOOST_COROUTINES_SOURCE) && ! defined(BOOST_ALL_NO_LIB) && ! defined(BOOST_COROUTINES_NO_LIB)
# define BOOST_LIB_NAME boost_coroutine
# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_COROUTINES_DYN_LINK)
# define BOOST_DYN_LINK
# endif
# include <boost/config/auto_link.hpp>
#endif
#define BOOST_COROUTINES_UNIDIRECT
#define BOOST_COROUTINES_SYMMETRIC
#if defined(__OpenBSD__)
// stacks need mmap(2) with MAP_STACK
# define BOOST_COROUTINES_USE_MAP_STACK
#endif
#endif // BOOST_COROUTINES_DETAIL_CONFIG_H

View File

@@ -0,0 +1,73 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H
#define BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H
#include <cstddef>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/fcontext.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
// class hold stack-context and coroutines execution-context
class BOOST_COROUTINES_DECL coroutine_context
{
private:
template< typename Coro >
friend void trampoline( context::detail::transfer_t);
template< typename Coro >
friend void trampoline_void( context::detail::transfer_t);
template< typename Coro >
friend void trampoline_pull( context::detail::transfer_t);
template< typename Coro >
friend void trampoline_push( context::detail::transfer_t);
template< typename Coro >
friend void trampoline_push_void( context::detail::transfer_t);
preallocated palloc_;
context::detail::fcontext_t ctx_;
public:
typedef void( * ctx_fn)( context::detail::transfer_t);
// default ctor represents the current execution-context
coroutine_context();
// ctor creates a new execution-context running coroutine-fn `fn`
// `ctx_` will be allocated on top of the stack managed by parameter
// `stack_ctx`
coroutine_context( ctx_fn fn, preallocated const& palloc);
coroutine_context( coroutine_context const&);
coroutine_context& operator=( coroutine_context const&);
void * jump( coroutine_context &, void * = 0);
stack_context & stack_ctx()
{ return palloc_.sctx; }
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H

View File

@@ -0,0 +1,34 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_DATA_H
#define BOOST_COROUTINES_DETAIL_DATA_H
#include <boost/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
struct data_t
{
coroutine_context * from;
void * data;
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_DATA_H

View File

@@ -0,0 +1,47 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_FLAGS_H
#define BOOST_COROUTINES_DETAIL_FLAGS_H
#include <boost/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
enum flag_t
{
flag_started = 1 << 1,
flag_running = 1 << 2,
flag_complete = 1 << 3,
flag_unwind_stack = 1 << 4,
flag_force_unwind = 1 << 5
};
struct unwind_t
{
enum flag_t
{ force_unwind = 1 };
};
struct synthesized_t
{
enum flag_t
{ syntesized = 1 };
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_FLAGS_H

View File

@@ -0,0 +1,102 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PARAMETERS_H
#define BOOST_COROUTINES_DETAIL_PARAMETERS_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/coroutine/detail/flags.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Data >
struct parameters
{
Data * data;
bool do_unwind;
void * coro;
parameters() :
data( 0), do_unwind( false), coro( 0)
{}
explicit parameters( void * coro_) :
data( 0), do_unwind( false), coro( coro_)
{ BOOST_ASSERT( 0 != coro); }
explicit parameters( Data * data_, void * coro_) :
data( data_), do_unwind( false), coro( coro_)
{
BOOST_ASSERT( 0 != data);
BOOST_ASSERT( 0 != coro);
}
explicit parameters( unwind_t::flag_t) :
data( 0), do_unwind( true)
{}
};
template< typename Data >
struct parameters< Data & >
{
Data * data;
bool do_unwind;
void * coro;
parameters() :
data( 0), do_unwind( false), coro( 0)
{}
explicit parameters( void * coro_) :
data( 0), do_unwind( false), coro( coro_)
{ BOOST_ASSERT( 0 != coro); }
explicit parameters( Data * data_, void * coro_) :
data( data_), do_unwind( false), coro( coro_)
{
BOOST_ASSERT( 0 != data);
BOOST_ASSERT( 0 != coro);
}
explicit parameters( unwind_t::flag_t) :
data( 0), do_unwind( true), coro( 0)
{}
};
template<>
struct parameters< void >
{
bool do_unwind;
void * coro;
parameters() :
do_unwind( false), coro(0)
{}
parameters( void * coro_) :
do_unwind( false), coro( coro_)
{ BOOST_ASSERT( 0 != coro); }
explicit parameters( unwind_t::flag_t) :
do_unwind( true), coro( 0)
{}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PARAMETERS_H

View File

@@ -0,0 +1,45 @@
// Copyright Oliver Kowalke 2015.
// 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)
#ifndef BOOST_COROUTINES_DETAIL_PREALLOCATED_H
#define BOOST_COROUTINES_DETAIL_PREALLOCATED_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
struct BOOST_COROUTINES_DECL preallocated {
void * sp;
std::size_t size;
stack_context sctx;
preallocated() BOOST_NOEXCEPT :
sp( 0), size( 0), sctx() {
}
preallocated( void * sp_, std::size_t size_, stack_context sctx_) BOOST_NOEXCEPT :
sp( sp_), size( size_), sctx( sctx_) {
}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PREALLOCATED_H

View File

@@ -0,0 +1,335 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H
#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/throw_exception.hpp>
#include <boost/utility.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/parameters.hpp>
#include <boost/coroutine/detail/trampoline_pull.hpp>
#include <boost/coroutine/exceptions.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct stack_context;
namespace detail {
template< typename R >
class pull_coroutine_impl : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
R * result_;
public:
typedef parameters< R > param_type;
pull_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee),
result_( 0)
{
if ( unwind) flags_ |= flag_force_unwind;
}
pull_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind,
R * result) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee),
result_( result)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~pull_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void pull()
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
result_ = from->data;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
bool has_result() const
{ return 0 != result_; }
R get() const
{
if ( ! has_result() )
boost::throw_exception(
invalid_result() );
return * result_;
}
R * get_pointer() const
{
if ( ! has_result() )
boost::throw_exception(
invalid_result() );
return result_;
}
virtual void destroy() = 0;
};
template< typename R >
class pull_coroutine_impl< R & > : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
R * result_;
public:
typedef parameters< R & > param_type;
pull_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee),
result_( 0)
{
if ( unwind) flags_ |= flag_force_unwind;
}
pull_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind,
R * result) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee),
result_( result)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~pull_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void pull()
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
result_ = from->data;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
bool has_result() const
{ return 0 != result_; }
R & get() const
{
if ( ! has_result() )
boost::throw_exception(
invalid_result() );
return * result_;
}
R * get_pointer() const
{
if ( ! has_result() )
boost::throw_exception(
invalid_result() );
return result_;
}
virtual void destroy() = 0;
};
template<>
class pull_coroutine_impl< void > : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
public:
typedef parameters< void > param_type;
pull_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~pull_coroutine_impl() {}
inline bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
inline bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
inline bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
inline bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
inline bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
inline void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
inline void pull()
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
virtual void destroy() = 0;
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_IMPL_H

View File

@@ -0,0 +1,323 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H
#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#include <boost/cstdint.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/move/move.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/detail/pull_coroutine_impl.hpp>
#include <boost/coroutine/detail/trampoline_pull.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/flags.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
#if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable:4355)
#endif
namespace boost {
namespace coroutines {
namespace detail {
struct pull_coroutine_context
{
coroutine_context caller;
coroutine_context callee;
template< typename Coro >
pull_coroutine_context( preallocated const& palloc, Coro *) :
caller(),
callee( trampoline_pull< Coro >, palloc)
{}
};
template< typename PushCoro, typename R, typename Fn, typename StackAllocator >
class pull_coroutine_object : private pull_coroutine_context,
public pull_coroutine_impl< R >
{
private:
typedef pull_coroutine_context ctx_t;
typedef pull_coroutine_impl< R > base_t;
typedef pull_coroutine_object< PushCoro, R, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
pull_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run()
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PushCoro::synth_type b( & this->callee, & this->caller, false);
PushCoro push_coro( synthesized_t::syntesized, b);
try
{ fn_( push_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename PushCoro, typename R, typename Fn, typename StackAllocator >
class pull_coroutine_object< PushCoro, R &, Fn, StackAllocator > : private pull_coroutine_context,
public pull_coroutine_impl< R & >
{
private:
typedef pull_coroutine_context ctx_t;
typedef pull_coroutine_impl< R & > base_t;
typedef pull_coroutine_object< PushCoro, R &, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
pull_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run()
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PushCoro::synth_type b( & this->callee, & this->caller, false);
PushCoro push_coro( synthesized_t::syntesized, b);
try
{ fn_( push_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename PushCoro, typename Fn, typename StackAllocator >
class pull_coroutine_object< PushCoro, void, Fn, StackAllocator > : private pull_coroutine_context,
public pull_coroutine_impl< void >
{
private:
typedef pull_coroutine_context ctx_t;
typedef pull_coroutine_impl< void > base_t;
typedef pull_coroutine_object< PushCoro, void, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
pull_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
pull_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run()
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PushCoro::synth_type b( & this->callee, & this->caller, false);
PushCoro push_coro( synthesized_t::syntesized, b);
try
{ fn_( push_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
}}}
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_OBJECT_H

View File

@@ -0,0 +1,80 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H
#define BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/pull_coroutine_impl.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename R >
class pull_coroutine_synthesized : public pull_coroutine_impl< R >
{
private:
typedef pull_coroutine_impl< R > impl_t;
public:
pull_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind,
R * result) :
impl_t( caller, callee, unwind, result)
{}
void destroy() {}
};
template< typename R >
class pull_coroutine_synthesized< R & > : public pull_coroutine_impl< R & >
{
private:
typedef pull_coroutine_impl< R & > impl_t;
public:
pull_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind,
R * result) :
impl_t( caller, callee, unwind, result)
{}
void destroy() {}
};
template<>
class pull_coroutine_synthesized< void > : public pull_coroutine_impl< void >
{
private:
typedef pull_coroutine_impl< void > impl_t;
public:
pull_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
impl_t( caller, callee, unwind)
{}
inline void destroy() {}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PULL_COROUTINE_SYNTHESIZED_H

View File

@@ -0,0 +1,282 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H
#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/throw_exception.hpp>
#include <boost/utility.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/parameters.hpp>
#include <boost/coroutine/detail/trampoline_push.hpp>
#include <boost/coroutine/exceptions.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct stack_context;
namespace detail {
template< typename Arg >
class push_coroutine_impl : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
public:
typedef parameters< Arg > param_type;
push_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~push_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void push( Arg const& arg)
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( const_cast< Arg * >( & arg), this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
void push( BOOST_RV_REF( Arg) arg)
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( const_cast< Arg * >( & arg), this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
virtual void destroy() = 0;
};
template< typename Arg >
class push_coroutine_impl< Arg & > : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
public:
typedef parameters< Arg & > param_type;
push_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~push_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void push( Arg & arg)
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( & arg, this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
virtual void destroy() = 0;
};
template<>
class push_coroutine_impl< void > : private noncopyable
{
protected:
int flags_;
exception_ptr except_;
coroutine_context * caller_;
coroutine_context * callee_;
public:
typedef parameters< void > param_type;
push_coroutine_impl( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
flags_( 0),
except_(),
caller_( caller),
callee_( callee)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~push_coroutine_impl() {}
inline bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
inline bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
inline bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
inline bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
inline bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
inline void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
param_type to( unwind_t::force_unwind);
caller_->jump(
* callee_,
& to);
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
inline void push()
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
param_type to( this);
param_type * from(
static_cast< param_type * >(
caller_->jump(
* callee_,
& to) ) );
flags_ &= ~flag_running;
if ( from->do_unwind) throw forced_unwind();
if ( except_) rethrow_exception( except_);
}
virtual void destroy() = 0;
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_IMPL_H

View File

@@ -0,0 +1,335 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H
#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#include <boost/cstdint.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/move/move.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/detail/push_coroutine_impl.hpp>
#include <boost/coroutine/detail/trampoline_push.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/flags.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
#if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable:4355)
#endif
namespace boost {
namespace coroutines {
namespace detail {
struct push_coroutine_context
{
coroutine_context caller;
coroutine_context callee;
template< typename Coro >
push_coroutine_context( preallocated const& palloc, Coro *) :
caller(),
callee( trampoline_push< Coro >, palloc)
{}
};
struct push_coroutine_context_void
{
coroutine_context caller;
coroutine_context callee;
template< typename Coro >
push_coroutine_context_void( preallocated const& palloc, Coro *) :
caller(),
callee( trampoline_push_void< Coro >, palloc)
{}
};
template< typename PullCoro, typename R, typename Fn, typename StackAllocator >
class push_coroutine_object : private push_coroutine_context,
public push_coroutine_impl< R >
{
private:
typedef push_coroutine_context ctx_t;
typedef push_coroutine_impl< R > base_t;
typedef push_coroutine_object< PullCoro, R, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
push_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run( R * result)
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PullCoro::synth_type b( & this->callee, & this->caller, false, result);
PullCoro pull_coro( synthesized_t::syntesized, b);
try
{ fn_( pull_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename PullCoro, typename R, typename Fn, typename StackAllocator >
class push_coroutine_object< PullCoro, R &, Fn, StackAllocator > : private push_coroutine_context,
public push_coroutine_impl< R & >
{
private:
typedef push_coroutine_context ctx_t;
typedef push_coroutine_impl< R & > base_t;
typedef push_coroutine_object< PullCoro, R &, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
push_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run( R * result)
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PullCoro::synth_type b( & this->callee, & this->caller, false, result);
PullCoro push_coro( synthesized_t::syntesized, b);
try
{ fn_( push_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename PullCoro, typename Fn, typename StackAllocator >
class push_coroutine_object< PullCoro, void, Fn, StackAllocator > : private push_coroutine_context_void,
public push_coroutine_impl< void >
{
private:
typedef push_coroutine_context_void ctx_t;
typedef push_coroutine_impl< void > base_t;
typedef push_coroutine_object< PullCoro, void, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
push_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
push_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
ctx_t( palloc, this),
base_t( & this->caller,
& this->callee,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run()
{
BOOST_ASSERT( ! base_t::unwind_requested() );
base_t::flags_ |= flag_started;
base_t::flags_ |= flag_running;
// create push_coroutine
typename PullCoro::synth_type b( & this->callee, & this->caller, false);
PullCoro push_coro( synthesized_t::syntesized, b);
try
{ fn_( push_coro); }
catch ( forced_unwind const&)
{}
#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
catch ( abi::__forced_unwind const&)
{ throw; }
#endif
catch (...)
{ base_t::except_ = current_exception(); }
base_t::flags_ |= flag_complete;
base_t::flags_ &= ~flag_running;
typename base_t::param_type to;
this->callee.jump(
this->caller,
& to);
BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
}}}
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_OBJECT_H

View File

@@ -0,0 +1,78 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H
#define BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/push_coroutine_impl.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename R >
class push_coroutine_synthesized : public push_coroutine_impl< R >
{
private:
typedef push_coroutine_impl< R > impl_t;
public:
push_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
impl_t( caller, callee, unwind)
{}
void destroy() {}
};
template< typename R >
class push_coroutine_synthesized< R & > : public push_coroutine_impl< R & >
{
private:
typedef push_coroutine_impl< R & > impl_t;
public:
push_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
impl_t( caller, callee, unwind)
{}
void destroy() {}
};
template<>
class push_coroutine_synthesized< void > : public push_coroutine_impl< void >
{
private:
typedef push_coroutine_impl< void > impl_t;
public:
push_coroutine_synthesized( coroutine_context * caller,
coroutine_context * callee,
bool unwind) :
impl_t( caller, callee, unwind)
{}
inline void destroy() {}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_PUSH_COROUTINE_SYNTHESIZED_H

View File

@@ -0,0 +1,75 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_SETUP_H
#define BOOST_COROUTINES_DETAIL_SETUP_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/move/move.hpp>
#include <boost/type_traits/decay.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/coroutine/attributes.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Fn >
struct setup
{
struct dummy {};
Fn fn;
coroutine_context * caller;
coroutine_context * callee;
attributes attr;
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
setup( Fn fn_,
coroutine_context * caller_,
coroutine_context * callee_,
attributes const& attr_) :
fn( boost::forward< Fn >( fn_) ),
caller( caller_),
callee( callee_),
attr( attr_)
{}
#endif
setup( BOOST_RV_REF( Fn) fn_,
coroutine_context * caller_,
coroutine_context * callee_,
attributes const& attr_,
typename disable_if<
is_same< typename decay< Fn >::type, setup >,
dummy*
>::type = 0) :
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn( fn_),
#else
fn( boost::forward< Fn >( fn_) ),
#endif
caller( caller_),
callee( callee_),
attr( attr_)
{}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_SETUP_H

View File

@@ -0,0 +1,811 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H
#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/move/move.hpp>
#include <boost/utility/explicit_operator_bool.hpp>
#include <boost/coroutine/attributes.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_impl.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_object.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
#include <boost/coroutine/stack_allocator.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Arg >
class symmetric_coroutine_call
{
private:
template< typename X >
friend class symmetric_coroutine_yield;
typedef symmetric_coroutine_impl< Arg > impl_type;
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
struct dummy {};
impl_type * impl_;
public:
typedef Arg value_type;
typedef symmetric_coroutine_yield< Arg > yield_type;
symmetric_coroutine_call() BOOST_NOEXCEPT :
impl_( 0)
{}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
# ifdef BOOST_MSVC
typedef void ( * coroutine_fn)( yield_type &);
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename StackAllocator >
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
# endif
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#else
template< typename Fn >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#endif
~symmetric_coroutine_call()
{
if ( 0 != impl_)
{
impl_->destroy();
impl_ = 0;
}
}
symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
impl_( 0)
{ swap( other); }
symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
{
symmetric_coroutine_call tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
{ std::swap( impl_, other.impl_); }
symmetric_coroutine_call & operator()( Arg arg) BOOST_NOEXCEPT
{
BOOST_ASSERT( * this);
impl_->resume( arg);
return * this;
}
};
template< typename Arg >
class symmetric_coroutine_call< Arg & >
{
private:
template< typename X >
friend class symmetric_coroutine_yield;
typedef symmetric_coroutine_impl< Arg & > impl_type;
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
struct dummy {};
impl_type * impl_;
public:
typedef Arg value_type;
typedef symmetric_coroutine_yield< Arg & > yield_type;
symmetric_coroutine_call() BOOST_NOEXCEPT :
impl_( 0)
{}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
# ifdef BOOST_MSVC
typedef void ( * coroutine_fn)( yield_type &);
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename StackAllocator >
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
# endif
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#else
template< typename Fn >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#endif
~symmetric_coroutine_call()
{
if ( 0 != impl_)
{
impl_->destroy();
impl_ = 0;
}
}
symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
impl_( 0)
{ swap( other); }
symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
{
symmetric_coroutine_call tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
{ std::swap( impl_, other.impl_); }
symmetric_coroutine_call & operator()( Arg & arg) BOOST_NOEXCEPT
{
BOOST_ASSERT( * this);
impl_->resume( arg);
return * this;
}
};
template<>
class symmetric_coroutine_call< void >
{
private:
template< typename X >
friend class symmetric_coroutine_yield;
typedef symmetric_coroutine_impl< void > impl_type;
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_call)
struct dummy {};
impl_type * impl_;
public:
typedef void value_type;
typedef symmetric_coroutine_yield< void > yield_type;
symmetric_coroutine_call() BOOST_NOEXCEPT :
impl_( 0)
{}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
# ifdef BOOST_MSVC
typedef void ( * coroutine_fn)( yield_type &);
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename StackAllocator >
explicit symmetric_coroutine_call( coroutine_fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
# endif
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#else
template< typename Fn >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( Fn fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs = attributes(),
stack_allocator stack_alloc = stack_allocator() ) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
template< typename Fn, typename StackAllocator >
explicit symmetric_coroutine_call( BOOST_RV_REF( Fn) fn,
attributes const& attrs,
StackAllocator stack_alloc) :
impl_( 0)
{
// create a stack-context
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
BOOST_ASSERT( impl_);
}
#endif
~symmetric_coroutine_call()
{
if ( 0 != impl_)
{
impl_->destroy();
impl_ = 0;
}
}
inline symmetric_coroutine_call( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT :
impl_( 0)
{ swap( other); }
inline symmetric_coroutine_call & operator=( BOOST_RV_REF( symmetric_coroutine_call) other) BOOST_NOEXCEPT
{
symmetric_coroutine_call tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
inline bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_ || impl_->is_complete() || impl_->is_running(); }
inline void swap( symmetric_coroutine_call & other) BOOST_NOEXCEPT
{ std::swap( impl_, other.impl_); }
inline symmetric_coroutine_call & operator()() BOOST_NOEXCEPT
{
BOOST_ASSERT( * this);
impl_->resume();
return * this;
}
};
template< typename Arg >
void swap( symmetric_coroutine_call< Arg > & l,
symmetric_coroutine_call< Arg > & r)
{ l.swap( r); }
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_CALL_H

View File

@@ -0,0 +1,449 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H
#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
#include <boost/utility.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/coroutine_context.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/parameters.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/detail/trampoline.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename R >
class symmetric_coroutine_impl : private noncopyable
{
public:
typedef parameters< R > param_type;
symmetric_coroutine_impl( preallocated const& palloc,
bool unwind) BOOST_NOEXCEPT :
flags_( 0),
caller_(),
callee_( trampoline< symmetric_coroutine_impl< R > >, palloc)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~symmetric_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
flags_ |= flag_running;
param_type to( unwind_t::force_unwind);
caller_.jump(
callee_,
& to);
flags_ &= ~flag_running;
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void resume( R r) BOOST_NOEXCEPT
{
param_type to( const_cast< R * >( & r), this);
resume_( & to);
}
R * yield()
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ &= ~flag_running;
param_type to;
param_type * from(
static_cast< param_type * >(
callee_.jump(
caller_,
& to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
BOOST_ASSERT( from->data);
return from->data;
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X > * other, X x)
{
typename symmetric_coroutine_impl< X >::param_type to( & x, other);
return yield_to_( other, & to);
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X & > * other, X & x)
{
typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
return yield_to_( other, & to);
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X > * other)
{
typename symmetric_coroutine_impl< X >::param_type to( other);
return yield_to_( other, & to);
}
virtual void run( R *) BOOST_NOEXCEPT = 0;
virtual void destroy() = 0;
protected:
template< typename X >
friend class symmetric_coroutine_impl;
int flags_;
coroutine_context caller_;
coroutine_context callee_;
void resume_( param_type * to) BOOST_NOEXCEPT
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
caller_.jump(
callee_,
to);
flags_ &= ~flag_running;
}
template< typename Other >
R * yield_to_( Other * other, typename Other::param_type * to)
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
BOOST_ASSERT( ! other->is_running() );
BOOST_ASSERT( ! other->is_complete() );
other->caller_ = caller_;
flags_ &= ~flag_running;
param_type * from(
static_cast< param_type * >(
callee_.jump(
other->callee_,
to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
BOOST_ASSERT( from->data);
return from->data;
}
};
template< typename R >
class symmetric_coroutine_impl< R & > : private noncopyable
{
public:
typedef parameters< R & > param_type;
symmetric_coroutine_impl( preallocated const& palloc,
bool unwind) BOOST_NOEXCEPT :
flags_( 0),
caller_(),
callee_( trampoline< symmetric_coroutine_impl< R > >, palloc)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~symmetric_coroutine_impl() {}
bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
flags_ |= flag_running;
param_type to( unwind_t::force_unwind);
caller_.jump(
callee_,
& to);
flags_ &= ~flag_running;
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
void resume( R & arg) BOOST_NOEXCEPT
{
param_type to( & arg, this);
resume_( & to);
}
R * yield()
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ &= ~flag_running;
param_type to;
param_type * from(
static_cast< param_type * >(
callee_.jump(
caller_,
& to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
BOOST_ASSERT( from->data);
return from->data;
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X > * other, X x)
{
typename symmetric_coroutine_impl< X >::param_type to( & x, other);
return yield_to_( other, & to);
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X & > * other, X & x)
{
typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
return yield_to_( other, & to);
}
template< typename X >
R * yield_to( symmetric_coroutine_impl< X > * other)
{
typename symmetric_coroutine_impl< X >::param_type to( other);
return yield_to_( other, & to);
}
virtual void run( R *) BOOST_NOEXCEPT = 0;
virtual void destroy() = 0;
protected:
template< typename X >
friend class symmetric_coroutine_impl;
int flags_;
coroutine_context caller_;
coroutine_context callee_;
void resume_( param_type * to) BOOST_NOEXCEPT
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ |= flag_running;
caller_.jump(
callee_,
to);
flags_ &= ~flag_running;
}
template< typename Other >
R * yield_to_( Other * other, typename Other::param_type * to)
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
BOOST_ASSERT( ! other->is_running() );
BOOST_ASSERT( ! other->is_complete() );
other->caller_ = caller_;
flags_ &= ~flag_running;
param_type * from(
static_cast< param_type * >(
callee_.jump(
other->callee_,
to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
BOOST_ASSERT( from->data);
return from->data;
}
};
template<>
class symmetric_coroutine_impl< void > : private noncopyable
{
public:
typedef parameters< void > param_type;
symmetric_coroutine_impl( preallocated const& palloc,
bool unwind) BOOST_NOEXCEPT :
flags_( 0),
caller_(),
callee_( trampoline_void< symmetric_coroutine_impl< void > >, palloc)
{
if ( unwind) flags_ |= flag_force_unwind;
}
virtual ~symmetric_coroutine_impl() {}
inline bool force_unwind() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_force_unwind); }
inline bool unwind_requested() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_unwind_stack); }
inline bool is_started() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_started); }
inline bool is_running() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_running); }
inline bool is_complete() const BOOST_NOEXCEPT
{ return 0 != ( flags_ & flag_complete); }
inline void unwind_stack() BOOST_NOEXCEPT
{
if ( is_started() && ! is_complete() && force_unwind() )
{
flags_ |= flag_unwind_stack;
flags_ |= flag_running;
param_type to( unwind_t::force_unwind);
caller_.jump(
callee_,
& to);
flags_ &= ~flag_running;
flags_ &= ~flag_unwind_stack;
BOOST_ASSERT( is_complete() );
}
}
inline void resume() BOOST_NOEXCEPT
{
BOOST_ASSERT( ! is_running() );
BOOST_ASSERT( ! is_complete() );
param_type to( this);
flags_ |= flag_running;
caller_.jump(
callee_,
& to);
flags_ &= ~flag_running;
}
inline void yield()
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
flags_ &= ~flag_running;
param_type to;
param_type * from(
static_cast< param_type * >(
callee_.jump(
caller_,
& to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
}
template< typename X >
void yield_to( symmetric_coroutine_impl< X > * other, X x)
{
typename symmetric_coroutine_impl< X >::param_type to( & x, other);
yield_to_( other, & to);
}
template< typename X >
void yield_to( symmetric_coroutine_impl< X & > * other, X & x)
{
typename symmetric_coroutine_impl< X & >::param_type to( & x, other);
yield_to_( other, & to);
}
template< typename X >
void yield_to( symmetric_coroutine_impl< X > * other)
{
typename symmetric_coroutine_impl< X >::param_type to( other);
yield_to_( other, & to);
}
virtual void run() BOOST_NOEXCEPT = 0;
virtual void destroy() = 0;
protected:
template< typename X >
friend class symmetric_coroutine_impl;
int flags_;
coroutine_context caller_;
coroutine_context callee_;
template< typename Other >
void yield_to_( Other * other, typename Other::param_type * to)
{
BOOST_ASSERT( is_running() );
BOOST_ASSERT( ! is_complete() );
BOOST_ASSERT( ! other->is_running() );
BOOST_ASSERT( ! other->is_complete() );
other->caller_ = caller_;
flags_ &= ~flag_running;
param_type * from(
static_cast< param_type * >(
callee_.jump(
other->callee_,
to) ) );
flags_ |= flag_running;
if ( from->do_unwind) throw forced_unwind();
}
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_IMPL_H

View File

@@ -0,0 +1,267 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H
#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/move/move.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/preallocated.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_impl.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct stack_context;
namespace detail {
template< typename R, typename Fn, typename StackAllocator >
class symmetric_coroutine_object : public symmetric_coroutine_impl< R >
{
private:
typedef symmetric_coroutine_impl< R > impl_t;
typedef symmetric_coroutine_object< R, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
symmetric_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run( R * r) BOOST_NOEXCEPT
{
BOOST_ASSERT( ! impl_t::unwind_requested() );
impl_t::flags_ |= flag_started;
impl_t::flags_ |= flag_running;
try
{
symmetric_coroutine_yield< R > yc( this, r);
fn_( yc);
}
catch ( forced_unwind const&)
{}
catch (...)
{ std::terminate(); }
impl_t::flags_ |= flag_complete;
impl_t::flags_ &= ~flag_running;
typename impl_t::param_type to;
impl_t::callee_.jump(
impl_t::caller_,
& to);
BOOST_ASSERT_MSG( false, "coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename R, typename Fn, typename StackAllocator >
class symmetric_coroutine_object< R &, Fn, StackAllocator > : public symmetric_coroutine_impl< R & >
{
private:
typedef symmetric_coroutine_impl< R & > impl_t;
typedef symmetric_coroutine_object< R &, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
symmetric_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run( R * r) BOOST_NOEXCEPT
{
BOOST_ASSERT( ! impl_t::unwind_requested() );
impl_t::flags_ |= flag_started;
impl_t::flags_ |= flag_running;
try
{
symmetric_coroutine_yield< R & > yc( this, r);
fn_( yc);
}
catch ( forced_unwind const&)
{}
catch (...)
{ std::terminate(); }
impl_t::flags_ |= flag_complete;
impl_t::flags_ &= ~flag_running;
typename impl_t::param_type to;
impl_t::callee_.jump(
impl_t::caller_,
& to);
BOOST_ASSERT_MSG( false, "coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
template< typename Fn, typename StackAllocator >
class symmetric_coroutine_object< void, Fn, StackAllocator > : public symmetric_coroutine_impl< void >
{
private:
typedef symmetric_coroutine_impl< void > impl_t;
typedef symmetric_coroutine_object< void, Fn, StackAllocator > obj_t;
Fn fn_;
stack_context stack_ctx_;
StackAllocator stack_alloc_;
static void deallocate_( obj_t * obj)
{
stack_context stack_ctx( obj->stack_ctx_);
StackAllocator stack_alloc( obj->stack_alloc_);
obj->unwind_stack();
obj->~obj_t();
stack_alloc.deallocate( stack_ctx);
}
public:
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
symmetric_coroutine_object( Fn fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
fn_( fn),
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
#endif
symmetric_coroutine_object( BOOST_RV_REF( Fn) fn, attributes const& attrs,
preallocated const& palloc,
StackAllocator const& stack_alloc) BOOST_NOEXCEPT :
impl_t( palloc,
stack_unwind == attrs.do_unwind),
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
fn_( fn),
#else
fn_( boost::forward< Fn >( fn) ),
#endif
stack_ctx_( palloc.sctx),
stack_alloc_( stack_alloc)
{}
void run() BOOST_NOEXCEPT
{
BOOST_ASSERT( ! impl_t::unwind_requested() );
impl_t::flags_ |= flag_started;
impl_t::flags_ |= flag_running;
try
{
symmetric_coroutine_yield< void > yc( this);
fn_( yc);
}
catch ( forced_unwind const&)
{}
catch (...)
{ std::terminate(); }
impl_t::flags_ |= flag_complete;
impl_t::flags_ &= ~flag_running;
typename impl_t::param_type to;
impl_t::callee_.jump(
impl_t::caller_,
& to);
BOOST_ASSERT_MSG( false, "coroutine is complete");
}
void destroy()
{ deallocate_( this); }
};
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_OBJECT_H

View File

@@ -0,0 +1,307 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H
#define BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H
#include <algorithm>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/move/move.hpp>
#include <boost/throw_exception.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/utility/explicit_operator_bool.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/exceptions.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename R >
class symmetric_coroutine_yield
{
private:
template< typename X, typename Y, typename Z >
friend class symmetric_coroutine_object;
typedef symmetric_coroutine_impl< R > impl_type;
struct dummy {};
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
impl_type * impl_;
R * result_;
symmetric_coroutine_yield( impl_type * impl, R * result) BOOST_NOEXCEPT :
impl_( impl),
result_( result)
{
BOOST_ASSERT( 0 != impl_);
BOOST_ASSERT( 0 != result_);
}
public:
symmetric_coroutine_yield() BOOST_NOEXCEPT :
impl_( 0),
result_( 0)
{}
symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
impl_( 0),
result_( 0)
{ swap( other); }
symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
{
symmetric_coroutine_yield tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_; }
void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
{
std::swap( impl_, other.impl_);
std::swap( result_, other.result_);
}
symmetric_coroutine_yield & operator()()
{
result_ = impl_->yield();
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type x,
typename disable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
result_ = impl_->yield_to( other.impl_, x);
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other,
typename enable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
result_ = impl_->yield_to( other.impl_);
return * this;
}
R get() const
{
if ( 0 == result_)
boost::throw_exception(
invalid_result() );
return * result_;
}
};
template< typename R >
class symmetric_coroutine_yield< R & >
{
private:
template< typename X, typename Y, typename Z >
friend class symmetric_coroutine_object;
typedef symmetric_coroutine_impl< R & > impl_type;
struct dummy {};
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
impl_type * impl_;
R * result_;
symmetric_coroutine_yield( impl_type * impl, R * result) BOOST_NOEXCEPT :
impl_( impl),
result_( result)
{
BOOST_ASSERT( 0 != impl_);
BOOST_ASSERT( 0 != result_);
}
public:
symmetric_coroutine_yield() BOOST_NOEXCEPT :
impl_( 0),
result_( 0)
{}
symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
impl_( 0),
result_( 0)
{ swap( other); }
symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
{
symmetric_coroutine_yield tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_; }
void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
{
std::swap( impl_, other.impl_);
std::swap( result_, other.result_);
}
symmetric_coroutine_yield & operator()()
{
result_ = impl_->yield();
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type & x,
typename disable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
result_ = impl_->yield_to( other.impl_, x);
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other,
typename enable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
result_ = impl_->yield_to( other.impl_);
return * this;
}
R & get() const
{
if ( 0 == result_)
boost::throw_exception(
invalid_result() );
return * result_;
}
};
template<>
class symmetric_coroutine_yield< void >
{
private:
template< typename X, typename Y, typename Z >
friend class symmetric_coroutine_object;
typedef symmetric_coroutine_impl< void > impl_type;
struct dummy {};
BOOST_MOVABLE_BUT_NOT_COPYABLE( symmetric_coroutine_yield)
impl_type * impl_;
symmetric_coroutine_yield( impl_type * impl) BOOST_NOEXCEPT :
impl_( impl)
{ BOOST_ASSERT( 0 != impl_); }
public:
symmetric_coroutine_yield() BOOST_NOEXCEPT :
impl_( 0)
{}
symmetric_coroutine_yield( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT :
impl_( 0)
{ swap( other); }
symmetric_coroutine_yield & operator=( BOOST_RV_REF( symmetric_coroutine_yield) other) BOOST_NOEXCEPT
{
symmetric_coroutine_yield tmp( boost::move( other) );
swap( tmp);
return * this;
}
BOOST_EXPLICIT_OPERATOR_BOOL();
inline bool operator!() const BOOST_NOEXCEPT
{ return 0 == impl_; }
inline void swap( symmetric_coroutine_yield & other) BOOST_NOEXCEPT
{ std::swap( impl_, other.impl_); }
inline symmetric_coroutine_yield & operator()()
{
impl_->yield();
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other, typename Coro::value_type & x,
typename disable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
impl_->yield_to( other.impl_, x);
return * this;
}
template< typename Coro >
symmetric_coroutine_yield & operator()( Coro & other,
typename enable_if<
is_same< typename Coro::value_type, void >,
dummy*
>::type = 0)
{
BOOST_ASSERT( other);
impl_->yield_to( other.impl_);
return * this;
}
};
template< typename R >
void swap( symmetric_coroutine_yield< R > & l, symmetric_coroutine_yield< R > & r)
{ l.swap( r); }
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_SYMMETRIC_COROUTINE_YIELD_H

View File

@@ -0,0 +1,69 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_TRAMPOLINE_H
#define BOOST_COROUTINES_DETAIL_TRAMPOLINE_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/fcontext.hpp>
#include <boost/cstdint.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/data.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Coro >
void trampoline( context::detail::transfer_t t)
{
typedef typename Coro::param_type param_type;
data_t * data = static_cast< data_t * >( t.data);
data->from->ctx_ = t.fctx;
param_type * param(
static_cast< param_type * >( data->data) );
BOOST_ASSERT( 0 != param);
BOOST_ASSERT( 0 != param->data);
Coro * coro(
static_cast< Coro * >( param->coro) );
BOOST_ASSERT( 0 != coro);
coro->run( param->data);
}
template< typename Coro >
void trampoline_void( context::detail::transfer_t t)
{
typedef typename Coro::param_type param_type;
data_t * data = static_cast< data_t * >( t.data);
data->from->ctx_ = t.fctx;
param_type * param(
static_cast< param_type * >( data->data) );
BOOST_ASSERT( 0 != param);
Coro * coro(
static_cast< Coro * >( param->coro) );
BOOST_ASSERT( 0 != coro);
coro->run();
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_H

View File

@@ -0,0 +1,50 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H
#define BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/fcontext.hpp>
#include <boost/cstdint.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/data.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Coro >
void trampoline_pull( context::detail::transfer_t t)
{
typedef typename Coro::param_type param_type;
data_t * data = static_cast< data_t * >( t.data);
data->from->ctx_ = t.fctx;
param_type * param(
static_cast< param_type * >( data->data) );
BOOST_ASSERT( 0 != param);
Coro * coro(
static_cast< Coro * >( param->coro) );
BOOST_ASSERT( 0 != coro);
coro->run();
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_PULL_H

View File

@@ -0,0 +1,79 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H
#define BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H
#include <cstddef>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/fcontext.hpp>
#include <boost/cstdint.hpp>
#include <boost/exception_ptr.hpp>
#include <boost/move/move.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/detail/data.hpp>
#include <boost/coroutine/detail/flags.hpp>
#include <boost/coroutine/detail/parameters.hpp>
#include <boost/coroutine/detail/setup.hpp>
#include <boost/coroutine/detail/setup.hpp>
#include <boost/coroutine/exceptions.hpp>
#include <boost/coroutine/flags.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
template< typename Coro >
void trampoline_push( context::detail::transfer_t t)
{
typedef typename Coro::param_type param_type;
data_t * data = static_cast< data_t * >( t.data);
data->from->ctx_ = t.fctx;
param_type * param(
static_cast< param_type * >( data->data) );
BOOST_ASSERT( 0 != param);
BOOST_ASSERT( 0 != param->data);
Coro * coro(
static_cast< Coro * >( param->coro) );
BOOST_ASSERT( 0 != coro);
coro->run( param->data);
}
template< typename Coro >
void trampoline_push_void( context::detail::transfer_t t)
{
typedef typename Coro::param_type param_type;
data_t * data = static_cast< data_t * >( t.data);
data->from->ctx_ = t.fctx;
param_type * param(
static_cast< param_type * >( data->data) );
BOOST_ASSERT( 0 != param);
Coro * coro(
static_cast< Coro * >( param->coro) );
BOOST_ASSERT( 0 != coro);
coro->run();
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H

View File

@@ -0,0 +1,103 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_EXCEPTIONS_H
#define BOOST_COROUTINES_EXCEPTIONS_H
#include <stdexcept>
#include <string>
#include <boost/config.hpp>
#include <boost/core/scoped_enum.hpp>
#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/coroutine/detail/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
namespace detail {
struct forced_unwind {};
}
BOOST_SCOPED_ENUM_DECLARE_BEGIN(coroutine_errc)
{
no_data = 1
}
BOOST_SCOPED_ENUM_DECLARE_END(coroutine_errc)
BOOST_COROUTINES_DECL
system::error_category const& coroutine_category() BOOST_NOEXCEPT;
}
namespace system {
template<>
struct is_error_code_enum< coroutines::coroutine_errc > : public true_type
{};
#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
template<>
struct is_error_code_enum< coroutines::coroutine_errc::enum_type > : public true_type
{};
#endif
inline
error_code make_error_code( coroutines::coroutine_errc e) //BOOST_NOEXCEPT
{
return error_code( underlying_cast< int >( e), coroutines::coroutine_category() );
}
inline
error_condition make_error_condition( coroutines::coroutine_errc e) //BOOST_NOEXCEPT
{
return error_condition( underlying_cast< int >( e), coroutines::coroutine_category() );
}
}
namespace coroutines {
class coroutine_error : public std::logic_error
{
private:
system::error_code ec_;
public:
coroutine_error( system::error_code ec) :
logic_error( ec.message() ),
ec_( ec)
{}
system::error_code const& code() const BOOST_NOEXCEPT
{ return ec_; }
};
class invalid_result : public coroutine_error
{
public:
invalid_result() :
coroutine_error(
system::make_error_code(
coroutine_errc::no_data) )
{}
};
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_EXCEPTIONS_H

View File

@@ -0,0 +1,21 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_FLAGS_H
#define BOOST_COROUTINES_FLAGS_H
namespace boost {
namespace coroutines {
enum flag_unwind_t
{
stack_unwind = 0,
no_stack_unwind
};
}}
#endif // BOOST_COROUTINES_FLAGS_H

View File

@@ -0,0 +1,105 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
#define BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
extern "C" {
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
}
#if defined(BOOST_USE_VALGRIND)
#include <valgrind/valgrind.h>
#endif
#include <cmath>
#include <cstddef>
#include <new>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/stack_context.hpp>
#include <boost/coroutine/stack_traits.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
template< typename traitsT >
struct basic_protected_stack_allocator
{
typedef traitsT traits_type;
void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
{
BOOST_ASSERT( traits_type::minimum_size() <= size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
// page at bottom will be used as guard-page
const std::size_t pages(
static_cast< std::size_t >(
std::floor(
static_cast< float >( size) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size_( pages * traits_type::page_size() );
BOOST_ASSERT( 0 != size && 0 != size_);
BOOST_ASSERT( size_ <= size);
// conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
#if defined(MAP_ANON)
void * limit = ::mmap( 0, size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
#else
void * limit = ::mmap( 0, size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
#endif
if ( MAP_FAILED == limit) throw std::bad_alloc();
// conforming to POSIX.1-2001
#if defined(BOOST_DISABLE_ASSERTS)
::mprotect( limit, traits_type::page_size(), PROT_NONE);
#else
const int result( ::mprotect( limit, traits_type::page_size(), PROT_NONE) );
BOOST_ASSERT( 0 == result);
#endif
ctx.size = size_;
ctx.sp = static_cast< char * >( limit) + ctx.size;
#if defined(BOOST_USE_VALGRIND)
ctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( ctx.sp, limit);
#endif
}
void deallocate( stack_context & ctx)
{
BOOST_ASSERT( ctx.sp);
BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
#if defined(BOOST_USE_VALGRIND)
VALGRIND_STACK_DEREGISTER( ctx.valgrind_stack_id);
#endif
void * limit = static_cast< char * >( ctx.sp) - ctx.size;
// conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
::munmap( limit, ctx.size);
}
};
typedef basic_protected_stack_allocator< stack_traits > protected_stack_allocator;
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H

View File

@@ -0,0 +1,69 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H
#define BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H
#include <cstddef>
#include <new>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/stack_context.hpp>
#include <boost/coroutine/stack_traits.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
// forward declaration for splitstack-functions defined in libgcc
extern "C" {
void *__splitstack_makecontext( std::size_t,
void * [BOOST_CONTEXT_SEGMENTS],
std::size_t *);
void __splitstack_releasecontext( void * [BOOST_CONTEXT_SEGMENTS]);
void __splitstack_resetcontext( void * [BOOST_CONTEXT_SEGMENTS]);
void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS],
int * new_value, int * old_value);
}
namespace boost {
namespace coroutines {
template< typename traitsT >
struct basic_segmented_stack_allocator
{
typedef traitsT traits_type;
void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
{
void * limit = __splitstack_makecontext( size, ctx.segments_ctx, & ctx.size);
if ( ! limit) throw std::bad_alloc();
// ctx.size is already filled by __splitstack_makecontext
ctx.sp = static_cast< char * >( limit) + ctx.size;
int off = 0;
__splitstack_block_signals_context( ctx.segments_ctx, & off, 0);
}
void deallocate( stack_context & ctx)
{ __splitstack_releasecontext( ctx.segments_ctx); }
};
typedef basic_segmented_stack_allocator< stack_traits > segmented_stack_allocator;
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_SEGMENTED_STACK_ALLOCATOR_H

View File

@@ -0,0 +1,13 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/config.hpp>
#if defined(BOOST_WINDOWS)
# include <boost/coroutine/windows/protected_stack_allocator.hpp>
#else
# include <boost/coroutine/posix/protected_stack_allocator.hpp>
#endif

View File

@@ -0,0 +1,15 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/config.hpp>
#if defined(BOOST_USE_SEGMENTED_STACKS)
# if defined(BOOST_WINDOWS)
# error "segmented stacks are not supported by Windows"
# else
# include <boost/coroutine/posix/segmented_stack_allocator.hpp>
# endif
#endif

View File

@@ -0,0 +1,37 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_STACK_ALLOCATOR_H
#define BOOST_COROUTINES_STACK_ALLOCATOR_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#include <boost/coroutine/segmented_stack_allocator.hpp>
#include <boost/coroutine/standard_stack_allocator.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
#if defined(BOOST_USE_SEGMENTED_STACKS)
typedef segmented_stack_allocator stack_allocator;
#else
typedef standard_stack_allocator stack_allocator;
#endif
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_STACK_ALLOCATOR_H

View File

@@ -0,0 +1,66 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_STACK_CONTEXT_H
#define BOOST_COROUTINES_STACK_CONTEXT_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
#if defined(BOOST_USE_SEGMENTED_STACKS)
struct BOOST_COROUTINES_DECL stack_context
{
typedef void * segments_context[BOOST_CONTEXT_SEGMENTS];
std::size_t size;
void * sp;
segments_context segments_ctx;
#if defined(BOOST_USE_VALGRIND)
unsigned valgrind_stack_id;
#endif
stack_context() :
size( 0), sp( 0), segments_ctx()
#if defined(BOOST_USE_VALGRIND)
, valgrind_stack_id( 0)
#endif
{}
};
#else
struct BOOST_COROUTINES_DECL stack_context
{
std::size_t size;
void * sp;
#if defined(BOOST_USE_VALGRIND)
unsigned valgrind_stack_id;
#endif
stack_context() :
size( 0), sp( 0)
#if defined(BOOST_USE_VALGRIND)
, valgrind_stack_id( 0)
#endif
{}
};
#endif
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_STACK_CONTEXT_H

View File

@@ -0,0 +1,42 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_STACK_TRAITS_H
#define BOOST_COROUTINES_STACK_TRAITS_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct BOOST_COROUTINES_DECL stack_traits
{
static bool is_unbounded() BOOST_NOEXCEPT;
static std::size_t page_size() BOOST_NOEXCEPT;
static std::size_t default_size() BOOST_NOEXCEPT;
static std::size_t minimum_size() BOOST_NOEXCEPT;
static std::size_t maximum_size() BOOST_NOEXCEPT;
};
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_STACK_TRAITS_H

View File

@@ -0,0 +1,90 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H
#define BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H
#if defined(BOOST_USE_VALGRIND)
#include <valgrind/valgrind.h>
#endif
#include <cstddef>
#include <cstdlib>
#include <new>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/stack_context.hpp>
#include <boost/coroutine/stack_traits.hpp>
#if defined(BOOST_COROUTINES_USE_MAP_STACK)
extern "C" {
#include <sys/mman.h>
}
#endif
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
template< typename traitsT >
struct basic_standard_stack_allocator
{
typedef traitsT traits_type;
void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() )
{
BOOST_ASSERT( traits_type::minimum_size() <= size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
#if defined(BOOST_COROUTINES_USE_MAP_STACK)
void * limit = ::mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_STACK, -1, 0);
if ( limit == MAP_FAILED ) throw std::bad_alloc();
#else
void * limit = std::malloc( size);
if ( ! limit) throw std::bad_alloc();
#endif
ctx.size = size;
ctx.sp = static_cast< char * >( limit) + ctx.size;
#if defined(BOOST_USE_VALGRIND)
ctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( ctx.sp, limit);
#endif
}
void deallocate( stack_context & ctx)
{
BOOST_ASSERT( ctx.sp);
BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
#if defined(BOOST_USE_VALGRIND)
VALGRIND_STACK_DEREGISTER( ctx.valgrind_stack_id);
#endif
void * limit = static_cast< char * >( ctx.sp) - ctx.size;
#if defined(BOOST_COROUTINES_USE_MAP_STACK)
munmap(limit, ctx.size);
#else
std::free( limit);
#endif
}
};
typedef basic_standard_stack_allocator< stack_traits > standard_stack_allocator;
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H

View File

@@ -0,0 +1,35 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_SYMMETRIC_COROUTINE_H
#define BOOST_COROUTINES_SYMMETRIC_COROUTINE_H
#include <boost/config.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_call.hpp>
#include <boost/coroutine/detail/symmetric_coroutine_yield.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
template< typename T >
struct symmetric_coroutine
{
typedef detail::symmetric_coroutine_call< T > call_type;
typedef detail::symmetric_coroutine_yield< T > yield_type;
};
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_SYMMETRIC_COROUTINE_H

View File

@@ -0,0 +1,87 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
#define BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H
extern "C" {
#include <windows.h>
}
#include <cmath>
#include <cstddef>
#include <new>
#include <boost/config.hpp>
#include <boost/coroutine/detail/config.hpp>
#include <boost/coroutine/stack_traits.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace coroutines {
struct stack_context;
template< typename traitsT >
struct basic_protected_stack_allocator
{
typedef traitsT traits_type;
void allocate( stack_context & ctx, std::size_t size)
{
BOOST_ASSERT( traits_type::minimum_size() <= size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) );
// page at bottom will be used as guard-page
const std::size_t pages(
static_cast< std::size_t >(
std::floor(
static_cast< float >( size) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size_ = pages * traits_type::page_size();
BOOST_ASSERT( 0 != size && 0 != size_);
void * limit = ::VirtualAlloc( 0, size_, MEM_COMMIT, PAGE_READWRITE);
if ( ! limit) throw std::bad_alloc();
DWORD old_options;
#if defined(BOOST_DISABLE_ASSERTS)
::VirtualProtect(
limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
#else
const BOOL result = ::VirtualProtect(
limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
BOOST_ASSERT( FALSE != result);
#endif
ctx.size = size_;
ctx.sp = static_cast< char * >( limit) + ctx.size;
}
void deallocate( stack_context & ctx)
{
BOOST_ASSERT( ctx.sp);
BOOST_ASSERT( traits_type::minimum_size() <= ctx.size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) );
void * limit = static_cast< char * >( ctx.sp) - ctx.size;
::VirtualFree( limit, 0, MEM_RELEASE);
}
};
typedef basic_protected_stack_allocator< stack_traits > protected_stack_allocator;
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_COROUTINES_PROTECTED_STACK_ALLOCATOR_H

View File

@@ -0,0 +1,14 @@
<html>
<head>
<meta http-equiv="refresh" content="0; URL=doc/html/index.html">
</head>
<body>
Automatic redirection failed, please go to
<a href="doc/html/index.html">doc/html/index.html</a>
<hr>
<p>&copy; Copyright Beman Dawes, 2001</p>
<p> Distributed under the Boost Software
License, Version 1.0. (See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
www.boost.org/LICENSE_1_0.txt</a>)</p>
</body>
</html>

View File

@@ -0,0 +1,15 @@
{
"key": "coroutine",
"status": "deprecated",
"name": "Coroutine",
"authors": [
"Oliver Kowalke"
],
"description": "Coroutine library.",
"category": [
"Concurrent"
],
"maintainers": [
"Oliver Kowalke <oliver.kowalke -at- gmail.com>"
]
}

View File

@@ -0,0 +1,83 @@
# Copyright Oliver Kowalke 2009.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# For more information, see http://www.boost.org/
import common ;
import feature ;
import indirect ;
import modules ;
import os ;
import toolset ;
project boost/coroutine/performance/asymmetric
: requirements
<library>/boost/chrono//boost_chrono
<library>/boost/context//boost_context
<library>/boost/coroutine//boost_coroutine
<library>/boost/program_options//boost_program_options
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack
<target-os>linux,<toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack
<toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
<link>static
<threading>multi
<cxxflags>-DBOOST_DISABLE_ASSERTS
<optimization>speed
<variant>release
;
alias sources
: ../bind_processor_aix.cpp
: <target-os>aix
;
alias sources
: ../bind_processor_freebsd.cpp
: <target-os>freebsd
;
alias sources
: ../bind_processor_hpux.cpp
: <target-os>hpux
;
alias sources
: ../bind_processor_linux.cpp
: <target-os>linux
;
alias sources
: ../bind_processor_solaris.cpp
: <target-os>solaris
;
alias sources
: ../bind_processor_windows.cpp
: <target-os>windows
;
explicit sources ;
exe performance_create_protected
: sources
performance_create_protected.cpp
;
exe performance_create_standard
: sources
performance_create_standard.cpp
;
exe performance_create_prealloc
: sources
performance_create_prealloc.cpp
;
exe performance_switch
: sources
performance_switch.cpp
;

View File

@@ -0,0 +1,116 @@
// Copyright Oliver Kowalke 2009.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <boost/chrono.hpp>
#include <boost/coroutine/all.hpp>
#include <boost/cstdint.hpp>
#include <boost/program_options.hpp>
#include "../bind_processor.hpp"
#include "../clock.hpp"
#include "../cycle.hpp"
#include "../preallocated_stack_allocator.hpp"
typedef preallocated_stack_allocator stack_allocator;
typedef boost::coroutines::asymmetric_coroutine< void > coro_type;
boost::coroutines::flag_fpu_t preserve_fpu = boost::coroutines::fpu_not_preserved;
boost::coroutines::flag_unwind_t unwind_stack = boost::coroutines::stack_unwind;
boost::uint64_t jobs = 1000;
void fn( coro_type::push_type & c)
{ while ( true) c(); }
duration_type measure_time( duration_type overhead)
{
stack_allocator stack_alloc;
time_point_type start( clock_type::now() );
for ( std::size_t i = 0; i < jobs; ++i) {
coro_type::pull_type c( fn,
boost::coroutines::attributes( unwind_stack, preserve_fpu),
stack_alloc);
}
duration_type total = clock_type::now() - start;
total -= overhead_clock(); // overhead of measurement
total /= jobs; // loops
return total;
}
# ifdef BOOST_CONTEXT_CYCLE
cycle_type measure_cycles( cycle_type overhead)
{
stack_allocator stack_alloc;
cycle_type start( cycles() );
for ( std::size_t i = 0; i < jobs; ++i) {
coro_type::pull_type c( fn,
boost::coroutines::attributes( unwind_stack, preserve_fpu),
stack_alloc);
}
cycle_type total = cycles() - start;
total -= overhead; // overhead of measurement
total /= jobs; // loops
return total;
}
# endif
int main( int argc, char * argv[])
{
try
{
bool preserve = false, unwind = true, bind = false;
boost::program_options::options_description desc("allowed options");
desc.add_options()
("help", "help message")
("bind,b", boost::program_options::value< bool >( & bind), "bind thread to CPU")
("fpu,f", boost::program_options::value< bool >( & preserve), "preserve FPU registers")
("unwind,u", boost::program_options::value< bool >( & unwind), "unwind coroutine-stack")
("jobs,j", boost::program_options::value< boost::uint64_t >( & jobs), "jobs to run");
boost::program_options::variables_map vm;
boost::program_options::store(
boost::program_options::parse_command_line(
argc,
argv,
desc),
vm);
boost::program_options::notify( vm);
if ( vm.count("help") ) {
std::cout << desc << std::endl;
return EXIT_SUCCESS;
}
if ( preserve) preserve_fpu = boost::coroutines::fpu_preserved;
if ( ! unwind) unwind_stack = boost::coroutines::no_stack_unwind;
if ( bind) bind_to_processor( 0);
duration_type overhead_c = overhead_clock();
std::cout << "overhead " << overhead_c.count() << " nano seconds" << std::endl;
boost::uint64_t res = measure_time( overhead_c).count();
std::cout << "average of " << res << " nano seconds" << std::endl;
#ifdef BOOST_CONTEXT_CYCLE
cycle_type overhead_y = overhead_cycle();
std::cout << "overhead " << overhead_y << " cpu cycles" << std::endl;
res = measure_cycles( overhead_y);
std::cout << "average of " << res << " cpu cycles" << std::endl;
#endif
return EXIT_SUCCESS;
}
catch ( std::exception const& e)
{ std::cerr << "exception: " << e.what() << std::endl; }
catch (...)
{ std::cerr << "unhandled exception" << std::endl; }
return EXIT_FAILURE;
}

Some files were not shown because too many files have changed in this diff Show More