Pre-R16B driver_async_port_key替代方案

时间:2014-10-16 20:29:24

标签: erlang erlang-driver

根据erl_driver documentation for driver_async_port_key function

  

在OTP-R16之前,实际的端口ID可以用作正确转换的密钥,但在重写端口子系统之后,情况就不再如此。使用此功能,您可以根据OTP-R16之前的端口ID实现相同的分配。

这适当的演员是什么?

1 个答案:

答案 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
}