Giter Club home page Giter Club logo

quantum's Introduction

Quantum Library : A scalable C++ coroutine framework

Build status

Quantum is a full-featured and powerful C++ framework build on top of the Boost coroutine library. The framework allows users to dispatch units of work (a.k.a. tasks) as coroutines and execute them concurrently using the 'reactor' pattern.

Features

  • NEW Added support for simpler V2 coroutine API which returns computed values directly.
  • Header-only library and interface-based design.
  • Full integration with Boost asymmetric coroutine library.
  • Highly parallelized coroutine framework for CPU-bound workloads.
  • Support for long-running or blocking IO tasks.
  • Allows explicit and implicit cooperative yielding between coroutines.
  • Task continuations and coroutine chaining for serializing work execution.
  • Synchronous and asynchronous dispatching using futures and promises similar to STL.
  • Support for streaming futures which allows faster processing of large data sets.
  • Support for future references.
  • Cascading execution output during task continuations (a.k.a. past futures).
  • Task prioritization.
  • Internal error handling and exception forwarding.
  • Ability to write lock-free code by synchronizing coroutines on dedicated queues.
  • Coroutine-friendly mutexes and condition variables for locking critical code paths or synchronizing access to external objects.
  • Fast pre-allocated memory pools for internal objects and coroutines.
  • Parallel forEach and mapReduce functions.
  • Various stats API.
  • Sequencer class allowing strict FIFO ordering of tasks based on sequence ids.

Sample code

Quantum is very simple and easy to use:

using namespace Bloomberg::quantum;

// Define a coroutine
int getDummyValue(CoroContextPtr<int> ctx)
{
    int value;
    ...           //do some work
    ctx->yield(); //be nice and let other coroutines run (optional cooperation)
    ...           //do more work and calculate 'value'
    return ctx->set(value);
}

// Create a dispatcher
Dispatcher dispatcher;

// Dispatch a work item to do some work and return a value
int result = dispatcher.post(getDummyValue)->get();

Chaining tasks can also be straightforward. In this example we produce various types in a sequence.

using namespace Bloomberg::quantum;

// Create a dispatcher
Dispatcher dispatcher;

auto ctx = dispatcher.postFirst([](CoroContextPtr<int> ctx)->int {
    return ctx->set(55); //Set the 1st value
})->then([](CoroContextPtr<double> ctx)->int {
    // Get the first value and add something to it
    return ctx->set(ctx->getPrev<int>() + 22.33); //Set the 2nd value
})->then([](CoroContextPtr<std::string> ctx)->int {
    return ctx->set("Hello world!"); //Set the 3rd value
})->finally([](CoroContextPtr<std::list<int>> ctx)->int {
    return ctx->set(std::list<int>{1,2,3}); //Set 4th value
})->end();

int i = ctx->getAt<int>(0); //This will throw 'FutureAlreadyRetrievedException'
                            //since future was already read in the 2nd coroutine
double d = ctx->getAt<double>(1); //returns 77.33
std::string s = ctx->getAt<std::string>(2); //returns "Hello world!";
std::list<int>& listRef = ctx->getRefAt<std::list<int>>(3); //get list reference
std::list<int>& listRef2 = ctx->getRef(); //get another list reference.
                                          //The 'At' overload is optional for last chain future
std::list<int> listValue = ctx->get(); //get list value

Chaining with the new V2 api:

using namespace Bloomberg::quantum;

// Create a dispatcher
Dispatcher dispatcher;

auto ctx = dispatcher.postFirst([](VoidContextPtr ctx)->int {
    return 55; //Set the 1st value
})->then([](VoidContextPtr ctx)->double {
    // Get the first value and add something to it
    return ctx->getPrev<int>() + 22.33; //Set the 2nd value
})->then([](VoidContextPtr ctx)->std::string {
    return "Hello world!"; //Set the 3rd value
})->finally([](VoidContextPtr ctx)->std::list<int> {
    return {1,2,3}; //Set 4th value
})->end();

Building and installing

Quantum is a header-only library and as such no targets need to be built. To install simply run:

> cmake -Bbuild <options> .
> cd build
> make install

CMake options

Various CMake options can be used to configure the output:

  • QUANTUM_BUILD_DOC : Build Doxygen documentation. Default OFF.
  • QUANTUM_ENABLE_DOT : Enable generation of DOT viewer files. Default OFF.
  • QUANTUM_VERBOSE_MAKEFILE : Enable verbose cmake output. Default ON.
  • QUANTUM_ENABLE_TESTS : Builds the tests target. Default OFF.
  • QUANTUM_BOOST_STATIC_LIBS: Link with Boost static libraries. Default ON.
  • QUANTUM_BOOST_USE_MULTITHREADED : Use Boost multi-threaded libraries. Default ON.
  • QUANTUM_USE_DEFAULT_ALLOCATOR : Use default system supplied allocator instead of Quantum's. Default OFF.
  • QUANTUM_ALLOCATE_POOL_FROM_HEAP : Pre-allocates object pools from heap instead of the application stack. Default OFF.
  • QUANTUM_BOOST_USE_SEGMENTED_STACKS : Use Boost segmented stacks for coroutines. Default OFF.
  • QUANTUM_BOOST_USE_PROTECTED_STACKS : Use Boost protected stacks for coroutines (slow!). Default OFF.
  • QUANTUM_BOOST_USE_FIXEDSIZE_STACKS : Use Boost fixed size stacks for coroutines. Default OFF.
  • QUANTUM_INSTALL_ROOT : Specify custom install path. Default is /usr/local/include for Linux or c:/Program Files for Windows.
  • QUANTUM_PKGCONFIG_DIR : Specify custom install path for the quantum.pc file. Default is ${QUANTUM_INSTALL_ROOT}/share/pkgconfig. To specify a relative path from QUANTUM_INSTALL_ROOT, omit leading /.
  • QUANTUM_EXPORT_PKGCONFIG : Generate quantum.pc file. Default ON.
  • QUANTUM_CMAKE_CONFIG_DIR : Specify a different install directory for the project's config, target and version files. Default is ${QUANTUM_INSTALL_ROOT}/share/cmake.
  • QUANTUM_EXPORT_CMAKE_CONFIG : Generate CMake config, target and version files. Default ON.
  • BOOST_ROOT : Specify a different Boost install directory.
  • GTEST_ROOT : Specify a different GTest install directory.

Note: options must be preceded with -D when passed as arguments to CMake.

Running tests

Run the following from the top directory:

> cmake -Bbuild -DQUANTUM_ENABLE_TESTS=ON <options> .
> cd build
> make quantum_test && ctest

Using

To use the library simply include <quantum/quantum.h> in your application. Also, the following libraries must be included in the link:

  • boost_context
  • pthread

Quantum library is fully is compatible with C++11, C++14 and C++17 language features. See compiler options below for more details.

Compiler options

The following compiler options can be set when building your application:

  • __QUANTUM_PRINT_DEBUG : Prints debug and error information to stdout and stderr respectively.
  • __QUANTUM_USE_DEFAULT_ALLOCATOR : Disable pool allocation for internal objects (other than coroutine stacks) and use default system allocators instead.
  • __QUANTUM_ALLOCATE_POOL_FROM_HEAP : Pre-allocates object pools from heap instead of the application stack (default). This affects internal object allocations other than coroutines. Coroutine pools are always heap-allocated due to their size.
  • __QUANTUM_BOOST_USE_SEGMENTED_STACKS : Uses boost segmented stack for on-demand coroutine stack growth. Note that Boost.Context library must be built with property segmented-stacks=on and applying BOOST_USE_UCONTEXT and BOOST_USE_SEGMENTED_STACKS at b2/bjam command line.
  • __QUANTUM_BOOST_USE_PROTECTED_STACKS : Uses boost protected stack for runtime bound-checking. When using this option, coroutine creation (but not runtime efficiency) becomes more expensive.
  • __QUANTUM_BOOST_USE_FIXEDSIZE_STACKS : Uses boost fixed size stack. This defaults to system default allocator.

Application-wide settings

Various application-wide settings can be configured via ThreadTraits, AllocatorTraits and StackTraits.

Documentation

Please see the wiki page for a detailed overview of this library, use-case scenarios and examples.

For class description visit the API reference page.

quantum's People

Contributors

accelerated avatar albertdang2 avatar arosenzweig3 avatar demin80 avatar safaruqi avatar shahzadlone avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quantum's Issues

c++20 coroutine

have you considered building on top of the c++20 coroutine?

Inefficient SpinLock implementation

Describe the bug
SpinLock as it is implemented in Quantum kills neighbor HyperThread performance and consumes excessive power.

Proposal
Use PAUSE instruction (_mm_pause(); intrinsic) for short-duration lock. Use a back-off algorithm to gradually reduce bus traffic used for the atomic checks. Insert co-op yield point if it takes too long to acquire the lock.

Additional context

GCC 12 warning: Invalid memory model

Describe the bug

Compiler warning invalid-memory-model triggered on atomic_base.h.

To Reproduce

Compile with GCC 12.

Expected behavior

No warnings

Environment (please complete the following information):

  • Operating System and Version: macOS 12.4, amd64, Bazel, Homebrew GCC 12.1.0_1, C++17 mode

Logs

In member function 'void std::__atomic_base<_IntTp>::store(__int_type, std::memory_order) [with _ITp = int]',
    inlined from 'void Bloomberg::quantum::Task::SuspensionGuard::set(int)' at external/com_bloomberg_quantum/quantum/quantum_task.h:131:34:
/usr/local/Cellar/gcc@12/12.1.0_1/bin/../lib/gcc/12/gcc/x86_64-apple-darwin21/12/../../../../../../include/c++/12/bits/atomic_base.h:464:25: warning: invalid memory model 'memory_order_acq_rel' for 'void __atomic_store_4(volatile void*, unsigned int, int)' [-Winvalid-memory-model]
  464 |         __atomic_store_n(&_M_i, __i, int(__m));
      |         ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/usr/local/Cellar/gcc@12/12.1.0_1/bin/../lib/gcc/12/gcc/x86_64-apple-darwin21/12/../../../../../../include/c++/12/bits/atomic_base.h:464:25: note: valid models are 'memory_order_relaxed', 'memory_order_seq_cst', 'memory_order_release'

Tests fail: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'

Describe the bug

In file included from /disk-samsung/freebsd-ports/devel/quantum/work/quantum-2.2/quantum/quantum_dispatcher_core.h:20:
/disk-samsung/freebsd-ports/devel/quantum/work/quantum-2.2/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/include/c++/v1/memory:1809:31: note: in defaulted move constructor for 'Bloomberg::quantum::TaskQueue' first required here
            ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
                              ^
/usr/include/c++/v1/memory:1687:21: note: in instantiation of function template specialization 'std::__1::allocator<Bloomberg::quantum::TaskQueue>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
                __a.construct(__p, _VSTD::forward<_Args>(__args)...);
                    ^
/usr/include/c++/v1/memory:1538:14: note: in instantiation of function template specialization 'std::__1::allocator_traits<std::__1::allocator<Bloomberg::quantum::TaskQueue>>::__construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
            {__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
             ^
/usr/include/c++/v1/memory:1638:15: note: in instantiation of function template specialization 'std::__1::allocator_traits<std::__1::allocator<Bloomberg::quantum::TaskQueue>>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
              construct(__a, _VSTD::__to_address(__end2 - 1),
              ^
/usr/include/c++/v1/vector:954:21: note: in instantiation of function template specialization 'std::__1::allocator_traits<std::__1::allocator<Bloomberg::quantum::TaskQueue>>::__construct_backward_with_exception_guarantees<Bloomberg::quantum::TaskQueue *>' requested here
    __alloc_traits::__construct_backward_with_exception_guarantees(
                    ^
/usr/include/c++/v1/vector:1591:9: note: in instantiation of member function 'std::__1::vector<Bloomberg::quantum::TaskQueue, std::__1::allocator<Bloomberg::quantum::TaskQueue>>::__swap_out_circular_buffer' requested here
        __swap_out_circular_buffer(__v);
        ^
/disk-samsung/freebsd-ports/devel/quantum/work/quantum-2.2/quantum/impl/quantum_dispatcher_core_impl.h:57:17: note: in instantiation of member function 'std::__1::vector<Bloomberg::quantum::TaskQueue, std::__1::allocator<Bloomberg::quantum::TaskQueue>>::reserve' requested here
    _coroQueues.reserve(coroCount);
                ^
/disk-samsung/freebsd-ports/devel/quantum/work/quantum-2.2/quantum/quantum_spinlock.h:39:5: note: 'SpinLock' has been explicitly marked deleted here
    SpinLock(const SpinLock&) = delete;
    ^

Version 2.2
clang-11
OS: FreeBSD 13

Fix GTEST CoreTest.CheckCoroutineQueuing which fails intermittently

Describe the bug
CoreTest.CheckCoroutineQueuing test fails intermittently. Needs to be further investigated if it's related to a timing issue of the fixture or a bug stemming from the recent shared coroutine queue changes.

To Reproduce
Run the test multiple times. Eventually it fails.

wiki images broken

Hi. Thank you for creating a nice coroutine library!

I found that the images in the wiki were broken.

I think the images such as overall architecture are quite informative so it should be back!

the commit made the images broken.

Can not compile the tests, on Mac Big Sur, clang v12, CMake 3.19.1, boost v1.74.0

Can not compile on Mac Big Sur, clang v12, CMake 3.19.1
I tried to fix it, but i failed.
The document should update:

 cmake -Bbuild -DQUANTUM_ENABLE_TESTS=ON   .
-- CMAKE_CXX_FLAGS = -Wall -Wextra -O0 -m64 -std=c++17 -ftemplate-backtrace-limit=0 -faligned-new
-- Doxygen configuration files have not been generated. Use QUANTUM_BUILD_DOC=ON to generate them.
-- Boost include dir: /usr/local/include
-- Boost library dir: /usr/local/lib
-- Boost use static libs: ON
-- Boost is multi-threaded: ON
-- Boost libraries: Boost::context
-- Adding target 'quantum_tests' to build output
-- SOURCE_FILES = /Users/kyle/projects/quantum/tests/quantum_coro_ranges_tests.cpp;/Users/kyle/projects/quantum/tests/quantum_id_tests.cpp;/Users/kyle/projects/quantum/tests/quantum_locks_tests.cpp;/Users/kyle/projects/quantum/tests/quantum_sequencer_tests.cpp;/Users/kyle/projects/quantum/tests/quantum_tests.cpp
-- INCLUDE_DIRECTORIES = /usr/local/include;/Users/kyle/projects/quantum;/Users/kyle/projects/quantum/tests;/usr/local/include
-- LINK_DIRECTORIES = /usr/local/lib;/usr/local/lib
-- PROJECT_SOURCE_DIR = /Users/kyle/projects/quantum/
-- CMAKE_INSTALL_PREFIX = /usr/local
-- QUANTUM_PKGCONFIG_DIR = share/pkgconfig
-- BOOST_ROOT =
-- REQUIRED BOOST_VERSION = 1.61
-- GTEST_ROOT =
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/kyle/projects/quantum/build

and I use the "fixed" make test command here :

make QuantumTests && ctest 

and I got those errors:

[ 16%] Building CXX object tests/CMakeFiles/QuantumTests.dir/quantum_coro_ranges_tests.cpp.o
In file included from /Users/kyle/projects/quantum/tests/quantum_coro_ranges_tests.cpp:17:
...
In file included from /Users/kyle/projects/quantum/quantum/quantum_contiguous_pool_manager.h:142:
/Users/kyle/projects/quantum/quantum/impl/quantum_contiguous_pool_manager_impl.h:44:19: error: no member named 'reinterpret_pointer_cast' in
      namespace 'std'
    _control(std::reinterpret_pointer_cast<Control>(other._control))

maybe the wrong cxx flags ?
but i confirmed that CMAKE_CXX_FLAGS has -std=c++17

quantum won't compile due to usage of non-standard and non-portable C++ extensions

I was trying to include quantum simply as a subproject, but I can even get it to work in a very reduced example.

First approach (what should work for a properly written header only library based on CMake):

add_executable(TestExec main.cpp)
add_subdirectory(quantum)
target_link_libraries(TestExec PUBLIC quantum)

Does not work, because:

[1/2] Building CXX object CMakeFiles/TestExec.dir/main.cpp.o
FAILED: CMakeFiles/TestExec.dir/main.cpp.o 
/usr/bin/c++ -DBOOST_ALL_NO_LIB -DBOOST_CONTEXT_DYN_LINK  -fPIE -fno-math-errno -ferror-limit=0 -std=c++17 -MD -MT CMakeFiles/TestExec.dir/main.cpp.o -MF CMakeFiles/TestExec.dir/main.cpp.o.d -o CMakeFiles/TestExec.dir/main.cpp.o -c ../main.cpp
../main.cpp:1:10: fatal error: 'quantum/quantum.h' file not found
#include <quantum/quantum.h>
         ^~~~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.

Not surprising, because:

add_library(${PROJECT_TARGET_NAME} INTERFACE)
set(QUANTUM_DEPENDENCIES Boost::context pthread)
set_target_properties(${PROJECT_TARGET_NAME} PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:include>
        INTERFACE_LINK_LIBRARIES "${QUANTUM_DEPENDENCIES}"
        INTERFACE_POSITION_INDEPENDENT_CODE ON
        #INTERFACE_SOURCES "$<INSTALL_INTERFACE:include>/${PROJECT_TARGET_NAME}/quantum.h"
)

It seems like the quantum CMake file was never meant to be used without installing...

Okay, no problem: It's a header only library, right? Let's just include the directory.

find_package(Boost 1.72 REQUIRED COMPONENTS context)

add_executable(TestExec main.cpp)
add_subdirectory(quantum)
target_include_directories(TestExec PUBLIC quantum)

target_link_libraries(TestExec PUBLIC Boost::headers Boost::context)

Well, that doesn't work:

[1/2] Building CXX object CMakeFiles/TestExec.dir/main.cpp.o
FAILED: CMakeFiles/TestExec.dir/main.cpp.o 
/usr/bin/c++ -DBOOST_ALL_NO_LIB -DBOOST_CONTEXT_DYN_LINK -I../quantum -fno-math-errno -ferror-limit=0 -std=c++17 -MD -MT CMakeFiles/TestExec.dir/main.cpp.o -MF CMakeFiles/TestExec.dir/main.cpp.o.d -o CMakeFiles/TestExec.dir/main.cpp.o -c ../main.cpp
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:20:
In file included from ../quantum/quantum/interface/quantum_icontext.h:20:
In file included from ../quantum/quantum/interface/quantum_ithread_context.h:19:
In file included from ../quantum/quantum/quantum_traits.h:19:
In file included from ../quantum/quantum/quantum_allocator.h:22:
In file included from ../quantum/quantum/quantum_stack_allocator.h:19:
In file included from ../quantum/quantum/quantum_contiguous_pool_manager.h:20:
../quantum/quantum/quantum_spinlock.h:42:5: warning: explicitly defaulted move constructor is implicitly deleted [-Wdefaulted-function-deleted]
    SpinLock(SpinLock&&) = default;
    ^
../quantum/quantum/quantum_spinlock.h:146:39: note: move constructor of 'SpinLock' is implicitly deleted because field '_flag' has a deleted move constructor
    alignas(128) std::atomic_uint32_t _flag{0};
                                      ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:778:7: note: 'atomic' has been explicitly marked deleted here
      atomic(const atomic&) = delete;
      ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:20:
In file included from ../quantum/quantum/interface/quantum_icontext.h:20:
In file included from ../quantum/quantum/interface/quantum_ithread_context.h:19:
In file included from ../quantum/quantum/quantum_traits.h:19:
In file included from ../quantum/quantum/quantum_allocator.h:22:
In file included from ../quantum/quantum/quantum_stack_allocator.h:19:
In file included from ../quantum/quantum/quantum_contiguous_pool_manager.h:20:
../quantum/quantum/quantum_spinlock.h:48:15: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]
    SpinLock& operator=(SpinLock&&) = default;
              ^
../quantum/quantum/quantum_spinlock.h:146:39: note: move assignment operator of 'SpinLock' is implicitly deleted because field '_flag' has a deleted move assignment operator
    alignas(128) std::atomic_uint32_t _flag{0};
                                      ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:779:15: note: 'operator=' has been explicitly marked deleted here
      atomic& operator=(const atomic&) = delete;
              ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:20:
../quantum/quantum/quantum_task.h:68:5: warning: explicitly defaulted move constructor is implicitly deleted [-Wdefaulted-function-deleted]
    Task(Task&& task) = default;
    ^
../quantum/quantum/quantum_task.h:152:33: note: move constructor of 'Task' is implicitly deleted because field '_terminated' has a deleted move constructor
    std::atomic_bool            _terminated;
                                ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:20:
../quantum/quantum/quantum_task.h:70:11: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]
    Task& operator=(Task&& task) = default;
          ^
../quantum/quantum/quantum_task.h:152:33: note: move assignment operator of 'Task' is implicitly deleted because field '_terminated' has a deleted move assignment operator
    std::atomic_bool            _terminated;
                                ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:74:13: note: 'operator=' has been explicitly marked deleted here
    atomic& operator=(const atomic&) = delete;
            ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:21:
../quantum/quantum/quantum_io_task.h:57:5: warning: explicitly defaulted move constructor is implicitly deleted [-Wdefaulted-function-deleted]
    IoTask(IoTask&& task) = default;
    ^
../quantum/quantum/quantum_io_task.h:87:29: note: move constructor of 'IoTask' is implicitly deleted because field '_terminated' has a deleted move constructor
    std::atomic_bool        _terminated;
                            ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:21:
../quantum/quantum/quantum_io_task.h:59:13: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]
    IoTask& operator=(IoTask&& task) = default;
            ^
../quantum/quantum/quantum_io_task.h:87:29: note: move assignment operator of 'IoTask' is implicitly deleted because field '_terminated' has a deleted move assignment operator
    std::atomic_bool        _terminated;
                            ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:74:13: note: 'operator=' has been explicitly marked deleted here
    atomic& operator=(const atomic&) = delete;
            ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:20:
In file included from ../quantum/quantum/interface/quantum_icontext.h:19:
In file included from ../quantum/quantum/interface/quantum_icontext_base.h:19:
In file included from ../quantum/quantum/quantum_task_id.h:89:
In file included from ../quantum/quantum/impl/quantum_task_id_impl.h:21:
In file included from /usr/local/include/boost/functional/hash.hpp:6:
In file included from /usr/local/include/boost/container_hash/hash.hpp:761:
In file included from /usr/local/include/boost/container_hash/extensions.hpp:22:
In file included from /usr/local/include/boost/detail/container_fwd.hpp:92:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/list:63:
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_list.h:567:7: error: static_assert failed due to requirement 'is_same<std::shared_ptr<Bloomberg::quantum::ITask>, std::shared_ptr<Bloomberg::quantum::Task>>::value' "std::list must have the same value_type as its allocator"
      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../quantum/quantum/quantum_task_queue.h:50:26: note: in instantiation of template class 'std::list<std::shared_ptr<Bloomberg::quantum::Task>, Bloomberg::quantum::ContiguousPoolManager<std::shared_ptr<Bloomberg::quantum::ITask>>>' requested here
    using TaskListIter = TaskList::iterator;
                         ^
../quantum/quantum/quantum_task_queue.h:95:18: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                 TaskListIter iter,
                 ^~~~~~~~~~~~
                 TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
../quantum/quantum/quantum_task_queue.h:100:9: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
        TaskListIter    _iter;              // task iterator
        ^~~~~~~~~~~~
        TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
../quantum/quantum/quantum_task_queue.h:132:26: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                         TaskListIter iter);
                         ^~~~~~~~~~~~
                         TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
../quantum/quantum/quantum_task_queue.h:143:5: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
    TaskListIter                        _queueIt;
    ^~~~~~~~~~~~
    TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
../quantum/quantum/quantum_task_queue.h:144:5: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
    TaskListIter                        _blockedIt;
    ^~~~~~~~~~~~
    TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
In file included from ../quantum/quantum/quantum_task_queue.h:166:
../quantum/quantum/impl/quantum_task_queue_impl.h:29:31: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                              TaskListIter iter,
                              ^~~~~~~~~~~~
                              TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
In file included from ../quantum/quantum/quantum_task_queue.h:166:
../quantum/quantum/impl/quantum_task_queue_impl.h:195:37: error: no matching constructor for initialization of 'IQueue::TaskSetterGuard'
            IQueue::TaskSetterGuard taskSetter(*this, task);
                                    ^          ~~~~~~~~~~~
../quantum/quantum/interface/quantum_iqueue.h:161:26: note: candidate constructor not viable: no known conversion from 'Bloomberg::quantum::TaskQueue' to 'Bloomberg::quantum::IQueue &' for 1st argument
IQueue::TaskSetterGuard::TaskSetterGuard(IQueue& taskQueue,
                         ^
../quantum/quantum/interface/quantum_iqueue.h:83:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
    struct TaskSetterGuard
           ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
In file included from ../quantum/quantum/quantum_task_queue.h:166:
../quantum/quantum/impl/quantum_task_queue_impl.h:308:52: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
ITask::Ptr TaskQueue::doDequeue(std::atomic_bool&, TaskListIter iter)
                                                   ^~~~~~~~~~~~
                                                   TaskList
../quantum/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
In file included from ../quantum/quantum/quantum_task_queue.h:166:
../quantum/quantum/impl/quantum_task_queue_impl.h:321:23: error: indirection requires pointer operand ('Bloomberg::quantum::TaskQueue::TaskList' (aka 'list<shared_ptr<Bloomberg::quantum::Task>, ContiguousPoolManager<shared_ptr<Bloomberg::quantum::ITask>>>') invalid)
    ITask::Ptr task = *iter;
                      ^~~~~
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:20:
In file included from ../quantum/quantum/interface/quantum_icontext.h:19:
In file included from ../quantum/quantum/interface/quantum_icontext_base.h:19:
In file included from ../quantum/quantum/quantum_task_id.h:89:
In file included from ../quantum/quantum/impl/quantum_task_id_impl.h:21:
In file included from /usr/local/include/boost/functional/hash.hpp:6:
In file included from /usr/local/include/boost/container_hash/hash.hpp:761:
In file included from /usr/local/include/boost/container_hash/extensions.hpp:22:
In file included from /usr/local/include/boost/detail/container_fwd.hpp:92:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/list:63:
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_list.h:567:7: error: static_assert failed due to requirement 'is_same<std::shared_ptr<Bloomberg::quantum::ITask>, std::shared_ptr<Bloomberg::quantum::IoTask>>::value' "std::list must have the same value_type as its allocator"
      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../quantum/quantum/quantum_io_queue.h:44:26: note: in instantiation of template class 'std::list<std::shared_ptr<Bloomberg::quantum::IoTask>, Bloomberg::quantum::StackAllocator<std::shared_ptr<Bloomberg::quantum::ITask>, 1000>>' requested here
    using TaskListIter = TaskList::iterator;
                         ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:21:
In file included from ../quantum/quantum/quantum_io_queue.h:114:
../quantum/quantum/impl/quantum_io_queue_impl.h:130:37: error: no matching constructor for initialization of 'IQueue::TaskSetterGuard'
            IQueue::TaskSetterGuard taskSetter(*this, task);
                                    ^          ~~~~~~~~~~~
../quantum/quantum/interface/quantum_iqueue.h:161:26: note: candidate constructor not viable: no known conversion from 'Bloomberg::quantum::IoQueue' to 'Bloomberg::quantum::IQueue &' for 1st argument
IQueue::TaskSetterGuard::TaskSetterGuard(IQueue& taskQueue,
                         ^
../quantum/quantum/interface/quantum_iqueue.h:83:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
    struct TaskSetterGuard
           ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:63:
In file included from ../quantum/quantum/quantum_read_write_mutex.h:19:
../quantum/quantum/quantum_read_write_spinlock.h:36:5: warning: explicitly defaulted move constructor is implicitly deleted [-Wdefaulted-function-deleted]
    ReadWriteSpinLock(ReadWriteSpinLock&&) = default;
    ^
../quantum/quantum/quantum_read_write_spinlock.h:171:39: note: move constructor of 'ReadWriteSpinLock' is implicitly deleted because field '_count' has a deleted move constructor
    alignas(128) std::atomic_uint32_t _count{0};
                                      ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:778:7: note: 'atomic' has been explicitly marked deleted here
      atomic(const atomic&) = delete;
      ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:63:
In file included from ../quantum/quantum/quantum_read_write_mutex.h:19:
../quantum/quantum/quantum_read_write_spinlock.h:42:24: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]
    ReadWriteSpinLock& operator=(ReadWriteSpinLock&&) = default;
                       ^
../quantum/quantum/quantum_read_write_spinlock.h:171:39: note: move assignment operator of 'ReadWriteSpinLock' is implicitly deleted because field '_count' has a deleted move assignment operator
    alignas(128) std::atomic_uint32_t _count{0};
                                      ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:779:15: note: 'operator=' has been explicitly marked deleted here
      atomic& operator=(const atomic&) = delete;
              ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:63:
../quantum/quantum/quantum_read_write_mutex.h:36:5: warning: explicitly defaulted move constructor is implicitly deleted [-Wdefaulted-function-deleted]
    ReadWriteMutex(ReadWriteMutex&&) = default;
    ^
../quantum/quantum/quantum_read_write_mutex.h:202:33: note: move constructor of 'ReadWriteMutex' is implicitly deleted because field '_spinlock' has a deleted move constructor
    mutable ReadWriteSpinLock   _spinlock;
                                ^
../quantum/quantum/quantum_read_write_spinlock.h:33:5: note: 'ReadWriteSpinLock' has been explicitly marked deleted here
    ReadWriteSpinLock(const ReadWriteSpinLock&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:63:
../quantum/quantum/quantum_read_write_mutex.h:42:21: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]
    ReadWriteMutex& operator=(ReadWriteMutex&&) = default;
                    ^
../quantum/quantum/quantum_read_write_mutex.h:202:33: note: move assignment operator of 'ReadWriteMutex' is implicitly deleted because field '_spinlock' has a deleted move assignment operator
    mutable ReadWriteSpinLock   _spinlock;
                                ^
../quantum/quantum/quantum_read_write_spinlock.h:39:24: note: 'operator=' has been explicitly marked deleted here
    ReadWriteSpinLock& operator=(const ReadWriteSpinLock&) = delete;
                       ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/ext/new_allocator.h:147:23: note: in defaulted move constructor for 'Bloomberg::quantum::TaskQueue' first required here
        { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
                             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/alloc_traits.h:484:8: note: in instantiation of function template specialization '__gnu_cxx::new_allocator<Bloomberg::quantum::TaskQueue>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
        { __a.construct(__p, std::forward<_Args>(__args)...); }
              ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:912:17: note: in instantiation of function template specialization 'std::allocator_traits<std::allocator<Bloomberg::quantum::TaskQueue>>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
      __traits::construct(__alloc, __dest, std::move(*__orig));
                ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:950:7: note: in instantiation of function template specialization 'std::__relocate_object_a<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
        std::__relocate_object_a(std::__addressof(*__cur),
             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:964:14: note: in instantiation of function template specialization 'std::__relocate_a_1<Bloomberg::quantum::TaskQueue *, Bloomberg::quantum::TaskQueue *, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
      return __relocate_a_1(std::__niter_base(__first),
             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:453:14: note: in instantiation of function template specialization 'std::__relocate_a<Bloomberg::quantum::TaskQueue *, Bloomberg::quantum::TaskQueue *, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
        return std::__relocate_a(__first, __last, __result, __alloc);
                    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:466:9: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::_S_do_relocate' requested here
        return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
               ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/vector.tcc:79:8: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::_S_relocate' requested here
              _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
              ^
../quantum/quantum/impl/quantum_dispatcher_core_impl.h:57:17: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::reserve' requested here
    _coroQueues.reserve(coroCount);
                ^
../quantum/quantum/quantum_spinlock.h:39:5: note: 'SpinLock' has been explicitly marked deleted here
    SpinLock(const SpinLock&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
../quantum/quantum/quantum_spinlock.h:39:5: note: 'SpinLock' has been explicitly marked deleted here
    SpinLock(const SpinLock&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::mutex'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::condition_variable'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/condition_variable:84:5: note: 'condition_variable' has been explicitly marked deleted here
    condition_variable(const condition_variable&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from ../quantum/quantum/quantum.h:48:
In file included from ../quantum/quantum/quantum_context.h:22:
In file included from ../quantum/quantum/quantum_dispatcher_core.h:20:
../quantum/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
10 warnings and 21 errors generated.
ninja: build stopped: subcommand failed.

Okay, cool, that must be due to me including this project as a subdirectory, right? Let's try with the "official" install path:

set(CMAKE_PREFIX_PATH /data/dev/quantum_install_test/)
find_package(Quantum)

add_executable(TestExec main.cpp)
target_link_libraries(TestExec Quantum::quantum)
[1/2] Building CXX object CMakeFiles/TestExec.dir/main.cpp.o
FAILED: CMakeFiles/TestExec.dir/main.cpp.o 
/usr/bin/c++ -DBOOST_ALL_NO_LIB -DBOOST_CONTEXT_DYN_LINK -isystem /data/dev/quantum_install_test/include -fPIE -fno-math-errno -ferror-limit=0 -std=c++17 -MD -MT CMakeFiles/TestExec.dir/main.cpp.o -MF CMakeFiles/TestExec.dir/main.cpp.o.d -o CMakeFiles/TestExec.dir/main.cpp.o -c ../main.cpp
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/interface/quantum_icontext.h:19:
In file included from /data/dev/quantum_install_test/include/quantum/interface/quantum_icontext_base.h:19:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_id.h:89:
In file included from /data/dev/quantum_install_test/include/quantum/impl/quantum_task_id_impl.h:21:
In file included from /usr/local/include/boost/functional/hash.hpp:6:
In file included from /usr/local/include/boost/container_hash/hash.hpp:761:
In file included from /usr/local/include/boost/container_hash/extensions.hpp:22:
In file included from /usr/local/include/boost/detail/container_fwd.hpp:92:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/list:63:
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_list.h:567:7: error: static_assert failed due to requirement 'is_same<std::shared_ptr<Bloomberg::quantum::ITask>, std::shared_ptr<Bloomberg::quantum::Task>>::value' "std::list must have the same value_type as its allocator"
      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:50:26: note: in instantiation of template class 'std::list<std::shared_ptr<Bloomberg::quantum::Task>, Bloomberg::quantum::ContiguousPoolManager<std::shared_ptr<Bloomberg::quantum::ITask>>>' requested here
    using TaskListIter = TaskList::iterator;
                         ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:95:18: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                 TaskListIter iter,
                 ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:100:9: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
        TaskListIter    _iter;              // task iterator
        ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:132:26: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                         TaskListIter iter);
                         ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:143:5: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
    TaskListIter                        _queueIt;
    ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:144:5: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
    TaskListIter                        _blockedIt;
    ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:166:
/data/dev/quantum_install_test/include/quantum/impl/quantum_task_queue_impl.h:29:31: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
                              TaskListIter iter,
                              ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:166:
/data/dev/quantum_install_test/include/quantum/impl/quantum_task_queue_impl.h:195:37: error: no matching constructor for initialization of 'IQueue::TaskSetterGuard'
            IQueue::TaskSetterGuard taskSetter(*this, task);
                                    ^          ~~~~~~~~~~~
/data/dev/quantum_install_test/include/quantum/interface/quantum_iqueue.h:161:26: note: candidate constructor not viable: no known conversion from 'Bloomberg::quantum::TaskQueue' to 'Bloomberg::quantum::IQueue &' for 1st argument
IQueue::TaskSetterGuard::TaskSetterGuard(IQueue& taskQueue,
                         ^
/data/dev/quantum_install_test/include/quantum/interface/quantum_iqueue.h:83:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
    struct TaskSetterGuard
           ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:166:
/data/dev/quantum_install_test/include/quantum/impl/quantum_task_queue_impl.h:308:52: error: unknown type name 'TaskListIter'; did you mean 'TaskList'?
ITask::Ptr TaskQueue::doDequeue(std::atomic_bool&, TaskListIter iter)
                                                   ^
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:49:11: note: 'TaskList' declared here
    using TaskList = std::list<Task::Ptr, ContiguousPoolManager<ITask::Ptr>>;
          ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:166:
/data/dev/quantum_install_test/include/quantum/impl/quantum_task_queue_impl.h:321:23: error: indirection requires pointer operand ('Bloomberg::quantum::TaskQueue::TaskList' (aka 'list<shared_ptr<Bloomberg::quantum::Task>, ContiguousPoolManager<shared_ptr<Bloomberg::quantum::ITask>>>') invalid)
    ITask::Ptr task = *iter;
                      ^~~~~
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:20:
In file included from /data/dev/quantum_install_test/include/quantum/interface/quantum_icontext.h:19:
In file included from /data/dev/quantum_install_test/include/quantum/interface/quantum_icontext_base.h:19:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_task_id.h:89:
In file included from /data/dev/quantum_install_test/include/quantum/impl/quantum_task_id_impl.h:21:
In file included from /usr/local/include/boost/functional/hash.hpp:6:
In file included from /usr/local/include/boost/container_hash/hash.hpp:761:
In file included from /usr/local/include/boost/container_hash/extensions.hpp:22:
In file included from /usr/local/include/boost/detail/container_fwd.hpp:92:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/list:63:
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_list.h:567:7: error: static_assert failed due to requirement 'is_same<std::shared_ptr<Bloomberg::quantum::ITask>, std::shared_ptr<Bloomberg::quantum::IoTask>>::value' "std::list must have the same value_type as its allocator"
      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/data/dev/quantum_install_test/include/quantum/quantum_io_queue.h:44:26: note: in instantiation of template class 'std::list<std::shared_ptr<Bloomberg::quantum::IoTask>, Bloomberg::quantum::StackAllocator<std::shared_ptr<Bloomberg::quantum::ITask>, 1000>>' requested here
    using TaskListIter = TaskList::iterator;
                         ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:21:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_io_queue.h:114:
/data/dev/quantum_install_test/include/quantum/impl/quantum_io_queue_impl.h:130:37: error: no matching constructor for initialization of 'IQueue::TaskSetterGuard'
            IQueue::TaskSetterGuard taskSetter(*this, task);
                                    ^          ~~~~~~~~~~~
/data/dev/quantum_install_test/include/quantum/interface/quantum_iqueue.h:161:26: note: candidate constructor not viable: no known conversion from 'Bloomberg::quantum::IoQueue' to 'Bloomberg::quantum::IQueue &' for 1st argument
IQueue::TaskSetterGuard::TaskSetterGuard(IQueue& taskQueue,
                         ^
/data/dev/quantum_install_test/include/quantum/interface/quantum_iqueue.h:83:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
    struct TaskSetterGuard
           ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/ext/new_allocator.h:147:23: note: in defaulted move constructor for 'Bloomberg::quantum::TaskQueue' first required here
        { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
                             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/alloc_traits.h:484:8: note: in instantiation of function template specialization '__gnu_cxx::new_allocator<Bloomberg::quantum::TaskQueue>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
        { __a.construct(__p, std::forward<_Args>(__args)...); }
              ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:912:17: note: in instantiation of function template specialization 'std::allocator_traits<std::allocator<Bloomberg::quantum::TaskQueue>>::construct<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue>' requested here
      __traits::construct(__alloc, __dest, std::move(*__orig));
                ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:950:7: note: in instantiation of function template specialization 'std::__relocate_object_a<Bloomberg::quantum::TaskQueue, Bloomberg::quantum::TaskQueue, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
        std::__relocate_object_a(std::__addressof(*__cur),
             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_uninitialized.h:964:14: note: in instantiation of function template specialization 'std::__relocate_a_1<Bloomberg::quantum::TaskQueue *, Bloomberg::quantum::TaskQueue *, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
      return __relocate_a_1(std::__niter_base(__first),
             ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:453:14: note: in instantiation of function template specialization 'std::__relocate_a<Bloomberg::quantum::TaskQueue *, Bloomberg::quantum::TaskQueue *, std::allocator<Bloomberg::quantum::TaskQueue>>' requested here
        return std::__relocate_a(__first, __last, __result, __alloc);
                    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:466:9: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::_S_do_relocate' requested here
        return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
               ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/vector.tcc:79:8: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::_S_relocate' requested here
              _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
              ^
/data/dev/quantum_install_test/include/quantum/impl/quantum_dispatcher_core_impl.h:57:17: note: in instantiation of member function 'std::vector<Bloomberg::quantum::TaskQueue>::reserve' requested here
    _coroQueues.reserve(coroCount);
                ^
/data/dev/quantum_install_test/include/quantum/quantum_spinlock.h:39:5: note: 'SpinLock' has been explicitly marked deleted here
    SpinLock(const SpinLock&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'Bloomberg::quantum::SpinLock'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/data/dev/quantum_install_test/include/quantum/quantum_spinlock.h:39:5: note: 'SpinLock' has been explicitly marked deleted here
    SpinLock(const SpinLock&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::mutex'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::condition_variable'
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/condition_variable:84:5: note: 'condition_variable' has been explicitly marked deleted here
    condition_variable(const condition_variable&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
In file included from ../main.cpp:1:
In file included from /data/dev/quantum_install_test/include/quantum/quantum.h:48:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_context.h:22:
In file included from /data/dev/quantum_install_test/include/quantum/quantum_dispatcher_core.h:20:
/data/dev/quantum_install_test/include/quantum/quantum_task_queue.h:59:5: error: call to deleted constructor of 'std::atomic_bool' (aka 'atomic<bool>')
    TaskQueue(TaskQueue&& other) = default;
    ^~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/atomic:73:5: note: 'atomic' has been explicitly marked deleted here
    atomic(const atomic&) = delete;
    ^
21 errors generated.
ninja: build stopped: subcommand failed.

Nope, that wasn't it.

main.cpp simply includes the quantum header for a start:

#include <quantum/quantum.h>

int main() {
    return 0;
}

Tested on Ubuntu 20.04 with Clang 12.0.1

What am I missing?

Regarding Release

This is not an issue. I didn't know where to raise my query. So, raising it here. We are planning to use the Quantum library for one of our products for high scalability and performance requirement. So, can you please let me know if there is any plan for a release which can be used for the product dev?

Spurious calls of task state handler in sequencer

Describe the bug
When I enqueued a single task with sequencer and checked a number of times the task state handler processed Started state, I noticed that it was called for all coroutine threads in case of "old" Sequencer and 2 times for experimental Sequencer.

To Reproduce
Steps to reproduce the behavior:

  1. Create a handler with atomic counters and setup it to the configuration
  2. Create dispatcher and sequencer with a simple integer key
  3. Enqueue a simple task
  4. Check counters

Expected behavior
Task state handler must be called only on a thread to which the task is assigned to

Environment (please complete the following information):

  • Ubuntu Linux 20.04

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.