在单个函数中包含调用者/回调

时间:2010-12-08 05:08:35

标签: asynchronous callback wrapper

我正在编写一个使用libwireshark的应用程序,尽管具体细节并不完全相关。

我为库准备一个数据包进行剖析,然后调用epan_dissect_run(packet),然后调用给定的数据包,从而调用我指定的回调函数 - 使用register_tap_listener()

我的问题是:如何将这个过程包装在一个函数dissected_information* MyDissectPacket(packet)中?这不仅适用于我所概述的libwireshark,也适用于一般情况下明智地使用回调的库。

答案是否取决于回调是异步执行还是在另一个线程上执行?如果在同一个线程上同步执行回调,这是否会使包装代码更简单?

也许是我的Google-fu很弱 - 我不知道我应该使用哪些术语,因为这个问题肯定曾多次被问过。

1 个答案:

答案 0 :(得分:1)

如果您不知道它是否是异步的,您应该像编写函数一样编写函数。

这是一个生产者/消费者问题:有什么可以解决的 - 解剖的数据包是什么?所以信号量可以解决它等待有消耗的东西。你的回调函数必须表明数据包解析已经完成 - 有一些东西要消耗。

我要做的是(伪代码):

void my_callback()
{
   semaphore.post()
}

// ...

dissected_information* MyDissectPacket(packet)
{
  epan_dissect_run(packet) // asynchronous or not call
  semaphore.wait()         // if it is, it will stop here and wait the post() of the 
                           // callback
                           // if it is not, it will result exaclty like above, but the
                           // semaphore will always be already "posted"; so you will just have
                           // a useless semaphore.
}

我希望我能正确理解你的问题......

修改 如果您通过回调获得结果:

void my_callback(result)
{
   shared_var_result = result;
   semaphore.post()
}

// ...

dissected_information* MyDissectPacket(packet)
{
  epan_dissect_run(packet) // asynchronous or not call
  semaphore.wait()         // if it is, it will stop here and wait the post() of the 
                           // callback
                           // if it is not, it will result exaclty like above, but the
                           // semaphore will always be already "posted"; so you will just have
                           // a useless semaphore.
  return shared_var_result
}

我看不到任何其他合理的解决方案。