c - 什么时候需要 CAMLparamX?

标签 c garbage-collection ocaml

我正在使用 OCaml 中的外部声明编写 C 库的接口(interface)。我使用 ctypes 进行测试,但它涉及 100% 的快速调用开销(通过 core_bench 微基准测试测量)。

函数如下所示:

/* 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)

据我所知,这些值表示为标记为“自定义”的框,GC 应保持不变。

我是否需要取消对 CAMLparamX 宏的注释以通知 GC 我的使用情况或者忽略它们是否合法?

最佳答案

根据byterun/memory.h中的评论您的函数必须以包含所有value 参数的CAMLparamN 宏开头。

关于c - 什么时候需要 CAMLparamX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21930764/

相关文章:

c - 通过 C 打开应用程序

c - 使用 strtok 函数在 C 中拆分字符串

perl - 打开最新的日志文件并打印晚于特定时间戳的行

functional-programming - 在 OCaml 中使用 GADT 时,如何删除函数上的 'less general definition' 错误消息?

c - 如何将文本文件中的一行子字符串保存到字符串数组中?

c - 试图理解这个 strtok 实现中的代码

java - 在 Tomcat 6 中为 Java 的 GC 消息添加时间戳

c# - 同一类的析构函数中的对象实例化和垃圾收集

ubuntu - Ocaml 没有创建 .o 文件

module - 在模块中使用 'with type' 构造时放宽类型检查