2014-02-21 3 views
4

Я пишу интерфейс к C-библиотеке, используя внешние объявления в OCaml. Я использовал ctypes для тестирования, но он включал 100% накладных расходов для быстрых вызовов (измеренных с помощью базового теста core_bench).Когда требуется CAMLparamX?

функции выглядят следующим образом:

/* external _create_var : float -> int -> int -> int -> _npnum = "ocaml_tnp_number_create_var" ;; */ 
value ocaml_tnp_number_create_var(value v, value nr, value p, value o) { 
    //CAMLparam4(v, nr, p, o); 
    const int params = Int_val(p); 
    const int order = Int_val(o); 
    const int number = Int_val(nr); 
    const double value = Double_val(v); 
    return CTYPES_FROM_PTR(tnp_number_create_variable(value, number, params, order)); 
} 
/* external _delete : _npnum -> unit = "ocaml_tnp_number_delete" ;; */ 
value ocaml_tnp_number_delete(value num) { 
    //CAMLparam1(num); 
    struct tnp_number* n = CTYPES_TO_PTR(num); 
    tnp_number_delete(n); 
    return Val_unit; 
} 

Я позаимствовал CTYPES_ * макросы, так что я в основном перемещение указателей вокруг как значения Int64.

#define CTYPES_FROM_PTR(P) caml_copy_int64((intptr_t)P) 
#define CTYPES_TO_PTR(I64) ((void *)Int64_val(I64)) 
#define CTYPES_PTR_PLUS(I64, I) caml_copy_int64(Int64_val(I64) + I) 

AFAIK, эти значения представлены в виде прямоугольников, которые помечены как «обычай», которые должны быть оставлены нетронутыми ГМ.

Нужно ли раскомментировать макросы CAMLparamX, чтобы уведомить GC о моем использовании или законно ли их опустить?

ответ

3

Согласно комментарию byterun/memory.h ваша функция необходимо начать с CAMLparamN макро со всеми value параметрами.

+1

Недопустимые аргументы значения, такие как целые числа, не обязательно должны быть в CAMLparamN. См. Byterun/ints.c исходного кода компилятора OCaml для таких примеров. – camlspotter

+0

@camlspotter Существует пробел между тем, что на самом деле безопасно, и тем, что указано как безопасное. Указанный вами ярлык и многие другие недокументированы. Документация приведена в этом ответе. Вопрос касается того, что является * юридическим *, а не тем, что происходит. –

Смежные вопросы