Erlang R16B之前的驱动程序\u异步\u端口\u密钥替代方案

Erlang R16B之前的驱动程序\u异步\u端口\u密钥替代方案,erlang,erlang-driver,Erlang,Erlang Driver,根据, 在OTP-R16之前,实际的端口id可以用作具有适当强制转换的密钥,但在重写端口子系统之后,情况就不再如此了。使用此功能,您可以基于端口id实现与OTP-R16之前相同的分发 什么是正确的类型转换?类型是指向结构的指针的类型定义。要在较旧的驱动程序应用程序中获取无符号int异步密钥类型,需要将此指针类型转换为无符号int。实现这一点的一种方法是通过C99uintpttr\u t类型强制转换它,该类型保证足够大以容纳指针值: #include <stdint.h> #inclu

根据,

在OTP-R16之前,实际的端口id可以用作具有适当强制转换的密钥,但在重写端口子系统之后,情况就不再如此了。使用此功能,您可以基于端口id实现与OTP-R16之前相同的分发


什么是正确的类型转换?

类型是指向结构的指针的类型定义。要在较旧的驱动程序应用程序中获取
无符号int
异步密钥类型,需要将此指针类型转换为
无符号int
。实现这一点的一种方法是通过C99
uintpttr\u 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版本控制信息编写一个可移植函数来返回异步密钥。”是的,这就是我的计划。谢谢
#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
}