Effective ATS:
Redis を用いたプロセス間通信

この記事では、NOSQL redis を用いたプロセス間通信の素直な例を紹介します。 この例の主な目的は redis の関数を ATS コードの中から直接呼び出す具体例を示すことです。

メッセージチャネル

はじめにメッセージチャネルを表わす型 [msgchan] を導入しましょう:
abstype msgchan_type = ptr
typedef msgchan = msgchan_type
次の関数はメッセージチャネルを生成します:
fun msgchan_create (name: string): msgchan
実際の実装ではメッセージチャネルは redis のキューを参照する単なるキーで、関数 [msgchan_create] は与えられた名前に基づいたキーを算出します。

与えられたメッセージチャネルにメッセージを挿入するために、次の関数 [msgchan_insert] を使うことができます:

fun msgchan_insert
  (chan: msgchan, msg: string, nerr: &int >> _) : void
[msgchan_insert] の3番目の引数は参照渡しで、メッセージの挿入に失敗するとその値を増やします。

与えられたメッセージチャネルからメッセージを取り出すために、次の関数 [msgchan_takeout] を使うことができます:

fun msgchan_takeout (chan: msgchan, nerr: &int >> _): stropt
[msgchan_takeout] の2番目の引数は参照渡しで、メッセージの取り出しに失敗するとその値を増やします。 [msgchan_takeout] は、通常の文字列か NULL ポインタどちらかを取る optional 文字列を返します。 NULL ポインタが返された場合もまた、なんらかの種類の失敗を示しています。 与えられたチャネルがその時点で空だったら、そのチャネルに対する [msgchan_takeout] 呼び出しはブロックすることに注意してください。

もしチャネルに対して [msgchan_insert] もしくは [msgchan_takeout] を呼び出した結果が失敗だったら、 2回目の試みの前にそのチャネルに関連した redis 接続を再確立させなければなりません。

Redis 接続

redis 接続を構成するというのは、値がメモリ位置 l に保管されているとき、型 [redisContext(l)] の値を生成することを意味しています。 そのような値を参照する redisContext 値を使ってみましょう。 redis 接続を正常に構成できなかった場合、生成された単なる NULL ポインタであるような redisContext 値に型 [redisContext(null)] が割り当てられます。

いったん redis 接続が構成されると、この接続に関連する redisContext 値は (サイズ 1 であるような) 参照に保存されます。 次の関数は、(一時的な使用を目的として) 保管された redisContext 値を得ることができます:

fun the_redisContext_vtget (): [l:addr] vttakeout0 (redisContext(l))
このとき [vttakeout0] は次のように定義されています:
vtypedef
vttakeout0 (a:vt@ype) = (a -<lin,prf> void | a) // borrowed linear value
次のコードは典型的な呼び出しシーケンスを表わしています:
//
val (fpf | ctx) = the_redisContext_vtget ()
//
// Here is some code that makes use of [ctx]
//
prval () = fpf (ctx) // returning the borrowed context
//
このとき [the_redisContext_vtget] は redisContext 値とこの値を解放するための証明関数を得るために呼び出されています。 そして redisContext 値を使い終わったら、それを解放するためにその証明関数を呼び出します。

テスト

メッセージチャネルを実装している ATS コードは次のファイルから入手できます:
msgchan.sats
msgchan.dats
redisContextSetup.dats
ファイル [test_up.dats] は、ファイルの内容物をメッセージチャネルにアップロードするテストコードです。

ファイル [test_dn.dats] は、メッセージチャネルの内容物をファイルにダウンロードするテストコードです。

ATS ソースコードを [test_up] と [test_dn] にコンパイルするための Makefile があります。 IP アドレス 127.0.0.1 のポート 6379 で redis サーバが利用できることを仮定しています。 次のコマンドで実行すると:

cat msgchan.sats | ./test_up & ./test_dn
ファイル [msgchan.sats] の中身が逐次的にコンソールに表示されるのが見えるはずです。 このとき、連続した2行を表示する間に (せいぜい3秒程度の) 短い休止が入ります。
この記事は Hongwei Xi によって書かれ、 Japan ATS User Group によって翻訳されています。