根据功能的erl_driver 文档driver_async_port_key
,
在 OTP-R16 之前,实际的 port id 可以通过适当的转换作为 key,但是在 port 子系统重写之后,情况就不再如此了。使用此功能,您可以实现与 OTP-R16 之前相同的基于端口 ID 的分配。
什么是正确的铸造?
根据功能的erl_driver 文档driver_async_port_key
,
在 OTP-R16 之前,实际的 port id 可以通过适当的转换作为 key,但是在 port 子系统重写之后,情况就不再如此了。使用此功能,您可以实现与 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
. 该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
}