Указатель возврата из Erlang C NIF

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

 #define LENGTH = 50;

 int *a, array[LENGTH];

 a = enif_alloc(LENGTH * sizeof(int));

Это должен быть указатель, который можно вернуть или даже сохранить, чтобы при возвращении в NIF из того же процесса Erlang я мог получить доступ к указателю и памяти, на которую он ссылается.


person BAR    schedule 19.01.2013    source источник


Ответы (2)


В данном конкретном случае я бы использовал enif_alloc_resource. Создайте структуру, содержащую указатель, и установите ее как объект ресурса.

Вы также можете закодировать его как двоичный файл, но я бы рекомендовал этого не делать, так как это позволит функциям erlang изменять содержимое перед его передачей обратно. Типы ресурсов непрозрачны со стороны erlang и не могут быть изменены.

person Soup d'Campbells    schedule 22.01.2013

Чтобы вернуть двоичные файлы из Nif, я использую enif_alloc_binary и enif_make_binary. Затем в Nif, который получит доступ к указателю, перейдите в двоичный файл и используйте enif_inspect_binary для аргумента, чтобы получить ваш ErlNifBinary, который будет содержать указатель на данные.

person Xavier    schedule 22.01.2013