R16B之前的driver_sync_port_key备选方案



根据driver_async_port_key函数的erl_driver文档,

在OTP-R16之前,实际的端口id可以用作具有适当铸造的密钥,但在重写端口子系统之后,情况不再如此。使用此功能,您可以实现与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中提供的驱动程序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
}

相关内容

  • 没有找到相关文章

最新更新