アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

XS での pTHX/pTHX_, aTHX/aTHX_ について

今日は以前紹介したList::Flatten::XS を更新してバージョン 0.03 をリリースしたのだが、リリースした途端に次のような issue が飛んできた。

github.com

内容はスレッド Perl でビルドができないというもので、一番最初のレポートが去年の 4 月頃になっていた。(CPAN RT であったために全然気づかなかった...反省)
実はスレッドが使えるPerlをビルドしたことがなく、初めてそのビルド行って上記の issue を修正した。

その時に活用したものが pTHX, aTHX だった。

それで検索すると id:gfx さんの以下の記事にたどり着いた。

d.hatena.ne.jp

記事によると

自分の関数についても,PerlAPI と同じように最初の引数にスレッドコンテキスト渡すようにしないと,その関数の内部でPerlAPIが使えません。 スレッドコンテキストの宣言にはpTHX/pTHX_を使います。API の呼出には aTHX/aTHX_ を使います。

この記事を読んで早速次のようにコードを修正した。

github.com

gfx さんの記事にある通り、宣言時だけ static SV * _fast_flatten(pTHX_ SV *ref) という感じで宣言し、_fast_flatten(aTHX_ ref) といった感じで呼び出しを行う。これだけでスレッド Perl 上でビルドが可能になった。

このように毎回 を呼びたくない場合、dTHX を代わりに宣言することもできるらしい。
注意書きを含め詳しいことは以下のリンクに載っている。

metacpan.org

ちなみに僕は plenv を使って Perl のビルドを行っていて、スレッド Perl をビルドしたい場合は次のようにするとできる。既に 5.26.0 をビルドしていたため、--as オプションで名前をつけた。

plenv install 5.26.0 -Dusethreads --as thread_perl_5.26.0

クール。

そして今日なんやかんやでいろいろ修正を行い、1 日で 0.02 から 0.05 までバージョンアップとなった。
しかし、正直な話 List::Flatten::XS は少ない行数で、基本的な PerlAPI を利用しているため、XS の入門にうってつけのソースコードではないかと思った。以下に github へのリンクを貼っておく。

github.com