にゃははー

はへらー

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

まとめ

この一言に尽きます。

libstdc++で_GLIBCXX_USE_NANOSLEEPがないとstd::sleep_for/std::sleep_untilが定義されない件について

結構前から議論が上がってて見てたけどそういえば書いてなかったので今更ですけど...

例えばLinuxPOSIX系OSで

#include <chrono>
#include <thread>

int main()
{
	std::this_thread::sleep_for(std::chrono::seconds(1));
}

としてもGCCは

hoge.cpp: In function ‘int main()’:
hoge.cpp:6: error: ‘sleep_for’ is not a member of ‘std::this_thread’

とか言ってくるわけです。

かと言って_GLIBCXX_USE_NANOSLEEPをdefineするのもあまりよろしくありません。

これについての議論がbugzillaで行われています。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52680
これによるとlibstdc++のconfigureでチェックしようということになっています。
4.8で入るかまではわからないですが、リリースまで結構時間があるので入るのではないでしょうか。

また、Linuxはnanosleepを持っているのがわかりきっているので、GCCのビルド時のconfigureに

--enable-libstdcxx-time=rt

を指定すればいいようです。

Ubuntu12.04のgcc-4.6パッケージはデフォルトで付いているのでデフォルトで使う分には問題ないようです。
Ubuntu12.04のgcc-4.6パッケージのconfigureを見る限り

--enable-libstdcxx-time=yes

でもいいようなのでこんな感じで適当にやればsleep_for/sleep_untilが使えるようになるはずです。

MacOSやBSDとかはちょっと分からないのでyesとか書いて試してみてください。

Blog移行のお知らせ

相当前から移行してたけどアナウンスしてないこと完全に忘れてたので今更ながら...

多分twitterとかで知ってると思いますが、 http://flast.hateblo.jp/ に移ってます。
ネットワーク関係は http://flast-net.hateblo.jp/ こちらに

こっちは消さないですが戻ってくることは無いです

GCC4.8をC++でコンパイルするブランチ

GCCC++を使用することを決定したわけですが、その実際の動きがありました。
http://gcc.gnu.org/wiki/cxx-conversion

configureに --enable-build-with-cxx を叩きこむと一部のソースがC++コンパイラでコンパイルするようになるわけですが、このブランチは再実装も視野に入れたものとなっています。
現在は /branches/cxx-conversion というブランチ上での実験ですが、どこまでC++を使うことになるのでしょうか。

GCC4.8はClangに近づく

GCC4.8からdiagnostic messageを改良する動きが出ています。
http://gcc.gnu.org/wiki/ClangDiagnosticsComparison


GCC4.6からdiagnostic messageの改良が始まっていましたが、これまでのは例えば

struct S
{
    ... snip ...
}

int i;

というコードで意味不明なエラーメッセージが出ていたのを、セミコロンが抜けているといった本質的なメッセージに修正するといったものでした。

$ cat hoge.c
struct S
{
}

int i;
$ gcc-4.4 hoge.c
hoge.c:5: error: two or more data types in declaration specifiers
$ gcc-4.6 hoge.c
hoge.c:5:1: error: expected ';', identifier or '(' before 'int'

これがGCC 4.8だとClangに近いメッセージになります。(既にtrunkに入っています)

$ gcc-4.8 hoge.c
hoge.c:5:1: error: expected ';', identifier or '(' before 'int'
 int i;
 ^

まだ指してる場所が変な感じですが、今後もっと改良されていくのではないでしょうか。

Steven Watanabeの神コミット in Boost.Context

Boost.Contextがtrunk入り - にゃははーでBoost.Contextのビルドオプションが面倒だと言ったが、我らがSteven Watanabeがやってくれた。

svnではrev.77196,ftp.tsukubaのgitでは6d06ffddf135088328525bb677c0c0e0687c917dだ。

このコミットが何を意味するか端的に言うと、今までbjamにaddress-modelだとかinstruction-setだとかarchitectureだとかわたしてたのを推論してくれるというコミット。
このおかげで1.50のリリースでBoost.Contextが入ってもビルドに詰む人が出なくなるというわけだ。心置き無くContext使いましょう。

bjamの高速化といいサポートといい流石Steven Watanabeだ。Good Job!

CentOS5.7のcpanでMongoDBを入れるときのメモ

人生初perl/cpancpanの依存関係が死んでるらしくて嵌ったのでメモ...

まずDateTimeは自動的に選択されるけど,死んでるのは総じてDateTimeから先.

MongoDB
  `-> DateTime
        |-> Math::Round
        |-> Params::Validate
        |     `-> Attribute::Handlers
        |-> DateTime::Locale
        `-> DateTime::TimeZone
  1. DateTimeのテストでMath/Round.pmが無いって怒られる
  2. DateTimeのテストでParams/Validate.pmが無いって怒られる
  3. Params::ValidateのテストでAttribute/Handlers.pmのバージョンが低いって怒られる(act:0.8.20, req:0.9)
  4. DateTimeのテストでDateTime/Locale.pmが無いって怒られる
  5. DateTimeのテストでDateTime/TimeZone.pmが無いって怒られる

悲しかった...



25/Feb/2015 追記

別のhostでやったらParams::ValidateがModule.Implementation.pmを要求してた...