にゃははー

はへらー

Boost.Contextの怒涛の変更

Boost.Contextがtrunkに入ってだいぶ経ちましたが、ここのところ非常に大きな変更が入っています。
※今後も更に変更されるかもしれないので、リリース時にはこのエントリも役に立たないかもしれないです。

これまでの流れ

内部実装とかユーザから直接関係ないものは省略します。

  • r77938
  1. boost::contexts名前空間がboost::ctxに変更されました
  2. high-level APIが消えました (boost::contexts::context)
  3. low-level APIの移動・リネームが行われました (e.g. ::boost_fcontext_t -> boost::ctx::fcontext_t)
  • r78082
  1. boost::ctx::align_stackがboost::ctx::detail名前空間に移動しました
  • r78088
  1. boost::ctx::fcontext_tにdefault ctorが追加されました (zero initされます)
  • r78114
  1. boost::ctx::start_fcontextが消えました 代わりにboost::ctx::jump_fcontextを使用します
  2. context linkingが削除されました ただし.fc_linkは存在していますが使用されません
  3. boost::ctx::jump_fcontextに第四引数が追加されました ただし使用されません
  • r78129
  1. boost::ctx::make_fcontextの第三引数が削除されました boost::ctx::jump_fcontextの第三引数を代わりに使用します
  • r17150
  1. boost::ctx::fcontext_t.fc_linkが削除されました
  • r17152
  1. boost::ctx::jump_fcontextの第四引数にfalseを指定することで浮動小数レジスタをストア・ロードをしない様にすることができます デフォルト引数としてtrueが与えられています

簡単なサンプル

#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の第三引数が実引数として渡ります。

まとめ

この一言に尽きます。