freeDiameter - fd_sess_handler_create

时间:2017-01-22 17:01:15

标签: c free-diameter

我刚才有一个关于" fd_sess_handler_create"的问题。在freeDiameter库中运行。

好吧,在test_app扩展中,有一个ta_cli_init函数来初始化客户端程序,当代码在C中时,这个块编译得很好:

int ta_cli_init(void)
{
  CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, (void*)free, NULL, NULL) );
  CHECK_FCT( fd_event_trig_regcb(ta_conf->signal, "test_app.cli", ta_cli_test_message ) );
  return 0;
}

但是,一旦我将代码更改为C ++,编译器就开始唠叨"清理"参数(第二个参数),我必须更改代码以使其编译:

void sess_handler_free(struct sess_state * state, os0_t sid, void * opaque)
{
}

int ta_cli_init(void)
{
  CHECK_FCT( fd_sess_handler_create(&ta_cli_reg, &sess_handler_free, NULL, NULL) );
  CHECK_FCT( fd_event_trig_regcb(ta_conf->signal, "ocs_app.cli", ta_cli_test_message ) );

  return 0;
}

现在可以编译代码,但因为我不确定清理上下文,因为你看到我把它留空了。

你能告诉我在我的自定义sess_handler_free函数体中应该清楚到底应该清理什么吗?

1 个答案:

答案 0 :(得分:0)

sess_handler_free需要释放struct sess_state 加上您的代码附加到其上的任何其他数据结构。

如果您没有任何其他数据结构,则只需使用sess_handler_free来电free(state)即可。 (直接传递自由函数是另一种方法。)

如果您确实有其他数据结构,则需要从struct sess_state找到它们并使用delete将其释放,如果它们是使用newfree创建的它们是使用malloc创建的。

请参阅diameap_cli_sess_cleanup作为示例实现 - 请注意,它会检查methodDatauser.passworduser.userid字段,如果存在,则将其释放,然后释放{{1本身 - 这个扩展分配了这些字段,因此它负责释放它们。