【问题标题】:How to use Boost.Coroutine with Boehm GC?如何在 Boehm GC 中使用 Boost.Coroutine?
【发布时间】:2015-03-30 06:26:42
【问题描述】:

Boost.Coroutine 分配自己的调用堆栈。 Boehm GC 是否将这些堆栈上的指针视为根,如果不是,我该如何做到这一点?在上下文切换到协程后,Boehm 终止程序。

【问题讨论】:

    标签: c++ boehm-gc boost-context boost-coroutine


    【解决方案1】:

    目前 boost 不提供挂钩分段堆栈分配的方法,因此这里有一个固定大小堆栈的解决方案。

    #include <gc/gc.h>
    #include <gc/gc_cpp.h>
    #include <boost/coroutine2/coroutine.hpp>
    #include <boost/coroutine2/protected_fixedsize_stack.hpp>
    #include <boost/context/stack_context.hpp>
    
    class BoehmGCStackAllocator {
        boost::coroutines2::protected_fixedsize_stack stack;
    
        // This is specific to boost::coroutines2::protected_fixedsize_stack.
        // The stack protection page is included in sctx.size, so we have to
        // subtract one page size from the stack size.
        std::size_t pfss_usable_stack_size(boost::context::stack_context &sctx) {
          return sctx.size - boost::context::stack_traits::page_size();
        }
    
      public:
        boost::context::stack_context allocate() {
            auto sctx = stack.allocate();
    
            // Despite what the boost docs warn, the only *implemented* stack direction
            // is "down". This is why we subtract the stack size.
            GC_add_roots(static_cast<char *>(sctx.sp) - pfss_usable_stack_size(sctx), sctx.sp);
            return sctx;
        }
    
        void deallocate(boost::context::stack_context sctx) {
            GC_remove_roots(static_cast<char *>(sctx.sp) - pfss_usable_stack_size(sctx), sctx.sp);
            stack.deallocate(sctx);
        }
    
    };
    

    然后在创建协程时提供它。

    auto coro = boost::coroutines2::coroutine<std::string>::pull_type(BoehmGCStackAllocator{}, [&](coro_t::push_type & yield) {
       // ...
    }
    

    【讨论】:

    • 已更新排除堆栈溢出保护保护页面。
    • 这用于未发布的 Nix 语言版本,该版本存在开放的段错误问题。 YMMV。
    【解决方案2】:

    大概 Boost.Coroutine 中的代码保存了一个指向它分配的调用堆栈的指针,并将其存储在一个“通常”的地方来存储指针(例如,一些指针变量)。

    如果是这种情况,那么是的,GC 会将指针从存储它的变量“追逐”到调用堆栈,并从那里(递归地)通过它包含的任何指针。

    【讨论】:

    • Boehm 崩溃,说它找不到当前线程的堆栈。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2011-10-17
    • 2014-01-22
    相关资源
    最近更新 更多