0

根据功能的erl_driver 文档driver_async_port_key

在 OTP-R16 之前,实际的 port id 可以通过适当的转换作为 key,但是在 port 子系统重写之后,情况就不再如此了。使用此功能,您可以实现与 OTP-R16 之前相同的基于端口 ID 的分配。

什么是正确的铸造?

4

1 回答 1

1

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
}
于 2014-10-17T13:22:26.250 回答