绑定回调
C代码经常使用回调。回调总是由两种类型的函数组成:
注册功能
回调函数
注册函数以回调函数作为参数调用,它将回调存储在服务器中。
然后,当某个特定类型的事件发生时,服务器将调用回调。
回调函数几乎总是有一个特殊的参数,通常被调用 client_data 是一个 void* 一些任意的数据。注册回调时,还接受特定的客户端数据指针。调用回调时,服务器将注册的客户端数据指针传递给它。
Felix提供了一种在Felix中编写C回调的方法。为此,将生成一个固定函数,该函数属于回调所需的类型,它将客户机数据指针强制转换为实现回调的Felix函数的闭包,然后调用它。
同时支持过程回调和函数回调。Felix代码具有对垃圾收集器的完全访问权限,但不能实际触发回收。无法执行服务调用,因为C堆栈挡道了。
回调的定义如下:
callback fun cb1 : int * cb1 * double -> int;
callback proc cb2 : int * cb2 * double;
这里的特殊参数是给定回调类型的名称, cb1 和 cb2 在示例中,指示客户端数据指针的位置。
这些函数将在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;
}
现在,当你注册回叫通行证时 cb1 或 cb2 作为回叫,然后传球 C_hack::cast[address]cback1 或 C_hack::cast[address]cback2 作为客户端数据指针。
完整示例
函数回调 int 争论。
带有 int 和 double 争论。