根据erl_driver documentation for driver_async_port_key
function,
在OTP-R16之前,实际的端口ID可以用作正确转换的密钥,但在重写端口子系统之后,情况就不再如此。使用此功能,您可以根据OTP-R16之前的端口ID实现相同的分配。
这适当的演员是什么?
答案 0 :(得分:1)
ErlDrvPort
类型是指向结构的指针的typedef。要在较旧的驱动程序应用程序中获取unsigned int
异步键类型,您需要将此指针类型转换为unsigned int
。实现此目的的一种方法是将其转换为C99 uintptr_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
}