绑定回调

C代码经常使用回调。回调总是由两种类型的函数组成:

  1. 注册功能

  2. 回调函数

注册函数以回调函数作为参数调用,它将回调存储在服务器中。

然后,当某个特定类型的事件发生时,服务器将调用回调。

回调函数几乎总是有一个特殊的参数,通常被调用 client_data 是一个 void* 一些任意的数据。注册回调时,还接受特定的客户端数据指针。调用回调时,服务器将注册的客户端数据指针传递给它。

Felix提供了一种在Felix中编写C回调的方法。为此,将生成一个固定函数,该函数属于回调所需的类型,它将客户机数据指针强制转换为实现回调的Felix函数的闭包,然后调用它。

同时支持过程回调和函数回调。Felix代码具有对垃圾收集器的完全访问权限,但不能实际触发回收。无法执行服务调用,因为C堆栈挡道了。

回调的定义如下:

callback fun cb1 : int * cb1 * double -> int;

callback proc cb2 : int * cb2 * double;

这里的特殊参数是给定回调类型的名称, cb1cb2 在示例中,指示客户端数据指针的位置。

这些函数将在C代码中生成:

int cb1(int, void *client_data, double);

void cb2(int, void *client_data, double);

要真正定义Felix中的回调:

fun cback1 (x:int, y:double) => (x.double + y).int;

proc cback2 (x:int, y:double) {
  println$ "x=" + x.str + ",y=" + y.str;
}

现在,当你注册回叫通行证时 cb1cb2 作为回叫,然后传球 C_hack::cast[address]cback1C_hack::cast[address]cback2 作为客户端数据指针。

完整示例

函数回调 int 争论。

带有 intdouble 争论。