Как использовать NIF для взаимодействия с кодом C, который сохраняет состояние между вызовами (то есть, связанные списки как NIF) - PullRequest
0 голосов
/ 25 января 2012

Я хотел создать структуру данных связанного списка, которая была реализована в C. Идея заключалась в том, что можно было бы создать связанный список

ll:new() -> listId.

ListId, приведенный выше, представляет «указатель» некоторого типа, который будет возвращен в код C, который будет функционировать как некоторый тип дескриптора в списке. Я надеялся, что мне не придется передавать сам список взад и вперед, поскольку я представлял, что списки могут стать очень, очень большими. После создания связанного списка пользователи будут взаимодействовать с ним очевидными способами:

ll:add(ListId, Elt)
ll:add_after(ListId, Pos, Elt)

Я предполагал, что сделаю это с помощью возможностей Эрланга NIF. Теперь, чтобы это работало, сторона C должна вести список по нескольким вызовам add, add_after и т. Д.

В прямом C у меня была бы основная функция, с которой взаимодействует пользователь, которая поддержала бы программу, таким образом сохраняя связанный список, сохраняемый в течение жизни взаимодействия пользователя с программой. Насколько я понимаю, NIFs использует код на C без основной функции. То есть каждый вызов NIF - это одно и то же предложение.

Может кто-нибудь дать мне несколько советов о том, как (если это уместно) можно использовать NIF для взаимодействия с кодом C, которому необходимо сохранять состояние при нескольких вызовах? Я надеюсь, что это было ясно!

Ответы [ 2 ]

1 голос
/ 25 января 2012

Проверка документация для объектов ресурса. NIF API даже позволяет вам использовать erlang GC для GC списков, которые вы создаете в случае сбоя процесса, который его создал!

0 голосов
/ 25 января 2012

переменная 'static' в C может сохранять значение между вызовами, но я бы настоятельно не рекомендовал этот способ. Если вам нужно какое-то состояние, было бы лучше взглянуть на «порты» в erlang.

...