ドライバ¶この章では、効率のよいドライバを書くための短い概要を紹介します。この章は、すでにドライバを良く理解している人を対象としています。ドライバと並行性¶ランタイムシステムはドライバ内のコードを実行する前はいつも、何かしらのロックをかけます。デフォルトでは、ドライバのレベルでロックがかけられます。そのため、1つのドライバでいくつかのポートを開いていたとすると、同時に2つ以上のポートに対する処理を実行することはできません。それぞれのポートごとにロックをかけられるように、設定することもできます。ドライバが関数的に使われる(状態をもたず、重い計算を行って返すだけ)の場合には、あらかじめポートに名前をつけてオープンしておいて、次のようなスケジュールIDに基づいてポートが選ばれるようにすることができます。?PORT_NAMES()).この場合は、16以上のスケジューラがない限りは、ドライバに対するポートのロックは行われません。ドライバ呼び出し時に巨大なバイナリのコピーを避ける¶バイナリ呼び出し時にバイナリのコピーを避ける方法は2つあります。引き数がバイナリであった場合、ドライバはバイナリの内容のを指すポイントを渡すため、バイナリのコピーは行われません。内のすべてのバイナリはコピーされます。2回呼び出す必要があります。この方法は1つのプロセスだけがそのポートにアクセスしているときしか正常に動作しません。その2回の呼び出しに間に他のプロセスが呼び出しをするかもしれないからです。コールバックを実装する方法です。渡されて、その中にrefcバイナリが含まれていた場合、参照だけが渡されます。ドライバから小さなバイナリを返す¶ランタイムシステムは、64バイトまでのバイナリは、ヒープバイナリとして扱うことができます。メッセージに載せて送られる時は、常にコピーされます。送られない場合よりもメモリ消費は負えますが、ガベージコレクションは軽くなります。返ってくるバイナリがいつも小さいということが分かっているのであれば、事前にアロケートされたバイナリを必要としないAPI呼び出しを使用すべきでしょう。ドライバからコピーしないで巨大なバイナリを返す¶ドライバ側から、巨大なバイナリをErlangのプロセスに返すときに、データのコピーを避けたいのであれば、ドライバー側でバイナリのアロケートを行い、それを何らかの方法でErlangプロセスに送る必要があります。使って作られたバイナリの送信方法には何通りかあります。制御コールバックから呼ばれていると、バイナリをかえすことができます。使って送信することができます。使うと、Erlangの項にバイナリを含めることができます。