Существуют ли макросы, которые можно использовать для проверки версии Erlang в коде драйвера C?

Erlang R15B добавлен ErlDrvSSizeT typedef и R16B добавлены erl_drv_output_term функционировать и устарел старый эквивалент. Есть ли способ проверить эти различия с помощью макросов препроцессора, чтобы поддерживать более старые версии Erlang с тем же кодом?

1 ответ

Решение

Вы можете использовать ERL_DRV_EXTENDED_MAJOR_VERSION а также ERL_DRV_EXTENDED_MINOR_VERSION значения макросов, представленные в erl_driver.h, чтобы принимать решения об особенностях. Всякий раз, когда изменяется драйвер API, эти значения соответственно увеличиваются. Эти приращения всегда объясняются в примечаниях к выпуску Erlang/OTP.

Например, Erlang/OTP R15B изменил некоторые типы параметров функций API с int в новый тип ErlDrvSizeT лучше справляться с 64-битными платформами. Вы можете проверить это и компенсировать это для более старых версий pre-R15B, используя код ниже:

#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
#endif

Этот typedef позволяет использовать тип ErlDrvSizeT даже для более старых версий драйверов.

На момент написания этой статьи, Erlang/OTP версии 17.3 и версии 6.2 системы времени исполнения Erlang (erts) являются актуальными. Для erts 6.2, ERL_DRV_EXTENDED_MAJOR_VERSION а также ERL_DRV_EXTENDED_MINOR_VERSION имеют значения 3 и 1 соответственно. Изменения в этом коммите Erlang/OTP создали эти значения версии.

Другие вопросы по тегам