Boost.Contextの怒涛の変更
Boost.Contextがtrunkに入ってだいぶ経ちましたが、ここのところ非常に大きな変更が入っています。
※今後も更に変更されるかもしれないので、リリース時にはこのエントリも役に立たないかもしれないです。
これまでの流れ
内部実装とかユーザから直接関係ないものは省略します。
- r77938
- boost::contexts名前空間がboost::ctxに変更されました
- high-level APIが消えました (boost::contexts::context)
- low-level APIの移動・リネームが行われました (e.g. ::boost_fcontext_t -> boost::ctx::fcontext_t)
- r78082
- boost::ctx::align_stackがboost::ctx::detail名前空間に移動しました
- r78088
- boost::ctx::fcontext_tにdefault ctorが追加されました (zero initされます)
- r78114
- boost::ctx::start_fcontextが消えました 代わりにboost::ctx::jump_fcontextを使用します
- context linkingが削除されました ただし.fc_linkは存在していますが使用されません
- boost::ctx::jump_fcontextに第四引数が追加されました ただし使用されません
- r78129
- boost::ctx::make_fcontextの第三引数が削除されました boost::ctx::jump_fcontextの第三引数を代わりに使用します
- r17150
- boost::ctx::fcontext_t.fc_linkが削除されました
- r17152
簡単なサンプル
#include <iostream> #include <cstddef> #include <boost/context/fcontext.hpp> #include <boost/context/stack_allocator.hpp> #include <boost/context/stack_utils.hpp> namespace ctx = boost::ctx; fcontext_t fcm, fc; void f(intptr_t) { std::cout << "f()" << std::endl; ctx::jump_context(&fc, &fcm, 0); } int main() { ctx::context_allocator alloc; const std::size_t stacksize = ctx::default_stacksize(); fc.fc_stack.base = alloc.allocate(stacksize); fc.fc_stack.limit = static_cast<char *>(fc.fc_stack.base) - stacksize; ctx::make_fcontext(&fc, f); std::cout << "pre-jump" << std::endl; ctx::jump_context(&fcm, &fc, 0); std::cout << "post-jump" << std::endl; alloc.deallocate(fc.fc_stack.base, stacksize); }
context linkingがあった頃は飛んだ先の関数で終了すればcallerへ戻ってくることができましたが、context linkingが削除された為、自前で戻る必要があります。
戻らなかった場合exit(0)が呼ばれます。
今まで最初の実行にはstart用の関数が用意されて今したが、全てjumpで行えるようになりました。
最初のjumpの第三引数が実引数として渡ります。