[Node.js]Node.jsにperlインタプリタを組み込む node-perl

先日の Hachioji.pm #2 のLTで発表した node-perlについて簡単な解説をしておきます。

GitHub - hideo55/node-perl: Embeded perl interpreter for node.js
LT資料

node-perl
Perlインタプリタの組み込み

まず、C/C++プログラムへのPerlインタプリタの組み込みはほぼperldocのperlembed - C プログラムへの Perl の埋め込み方 - perldoc.jpのままです。
ただ、インタプリタを組み込んだだけでは標準出力などはそのまま出力されてしまいます。そこで、以下のようにしています。

void override_stdhandle (pTHX_ SV *sv,const char *name ) {
	int status;
	GV *handle = gv_fetchpv(name,TRUE,SVt_PVIO);
	SV *svref = newRV_inc(sv);

	save_gp(handle, 1);

	status = Perl_do_open9(aTHX_ handle, ">:scalar", 8 , FALSE, O_WRONLY, 0, Nullfp, svref, 1);
	if(status == 0) {
		Perl_croak(aTHX_ "Failed to open %s: %" SVf,name, get_sv("!",TRUE));
	}
}

ようは PerlIO::scalar で標準出力の出力先をスカラ変数に変えているわけです。

EIOスレッド

現在、githubで公開しているものは node::ObjectWrapを継承したものなので非同期じゃありません。node::EventEmitterを継承し、EIOスレッドを使用したバージョンも作ってあるのですが、全く安定していないので未公開です。
このあたりは、mod_perlのworker MPMでやっていることを参考にすればなんとかなるかなーと考えています。