functionのerl_driver ドキュメントにdriver_async_port_key
よると、
OTP-R16 より前は、実際のポート ID を適切なキャストでキーとして使用できましたが、ポート サブシステムの書き換え後は、そうではなくなりました。この機能により、OTP-R16以前と同様のポートIDによる配信が実現できます。
この適切なキャストは何ですか?
functionのerl_driver ドキュメントにdriver_async_port_key
よると、
OTP-R16 より前は、実際のポート ID を適切なキャストでキーとして使用できましたが、ポート サブシステムの書き換え後は、そうではなくなりました。この機能により、OTP-R16以前と同様のポートIDによる配信が実現できます。
この適切なキャストは何ですか?
型は、構造体へのポインターのErlDrvPort
typedef です。古いドライバー アプリケーションで非同期キーの型を取得するunsigned int
には、このポインター型を に変換する必要がありますunsigned int
。uintptr_t
これを実現する 1 つの方法は、ポインター値を保持するのに十分な大きさであることが保証されている C99 型を使用してキャストすることです。
#include <stdint.h>
#include "erl_driver.h"
unsigned int my_port_key(ErlDrvPort port)
{
return (unsigned int) (uintptr_t) port;
}
で利用可能なドライバ API のバージョン管理情報を使用して、非同期キーを返す移植可能な関数を作成できますerl_driver.h
。このdriver_async_port_key
関数はドライバー API バージョン 2.2 で導入されたため、driver_async_port_key
バージョン 2.2 以降を使用するときに呼び出すか、古いバージョンのキャスト アプローチにフォールバックできます。
#include <stdint.h>
#include "erl_driver.h"
unsigned int my_port_key(ErlDrvPort port)
{
#if ERL_DRV_EXTENDED_MAJOR_VERSION > 2 || \
(ERL_DRV_EXTENDED_MAJOR_VERSION == 2 && ERL_DRV_EXTENDED_MINOR_VERSION >= 2)
return driver_async_port_key(port);
#else
return (unsigned int) (uintptr_t) port;
#endif
}