根据driver_async_port_key
函数的erl_driver文档,
在OTP-R16之前,实际的端口id可以用作具有适当铸造的密钥,但在重写端口子系统之后,情况不再如此。使用此功能,您可以实现与OTP-R16之前相同的基于端口id的分发。
这个合适的铸件是什么?
ErlDrvPort
类型是指向结构的指针的typedef。要在较旧的驱动程序应用程序中获得unsigned int
异步密钥类型,需要将此指针类型转换为unsigned int
。实现这一点的一种方法是通过C99uintptr_t
类型进行强制转换,该类型保证足够大,可以容纳指针值:
#include <stdint.h>
#include "erl_driver.h"
unsigned int my_port_key(ErlDrvPort port)
{
return (unsigned int) (uintptr_t) port;
}
您可以使用erl_driver.h
中提供的驱动程序API版本控制信息编写一个可移植函数来返回异步密钥。driver_async_port_key
函数是在驱动程序API 2.2版中引入的,因此我们可以在使用2.2版或更高版本时调用driver_async_port_key
,或者对旧版本采用强制转换方法:
#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
}