2008-11-4
ACE5.5
现象:
一个正常的TCP连接,一段时间后client向server发送数据失败——127.0.0.1的地址,连接未断开,client日志显示发送成功,而server的日志却显示未收到数据。
内部实现:
client发送数据时首先将数据加入ACE_Message_Queue<ACE_MT_SYNCH>中,再使用reactor()->notify(this, ACE_Event_Handler::WRITE_MASK)进行发送(该过程正常执行);在发送线程ACE_Task_Base的svc()中循环调用reactor()->handle_events()处理事件,在handle_output中调用send_n进行发送;程序没有调用reactor()->register_handler注册ACE_Event_Handler::WRITE_MASK事件。
跟踪:
发现没有回调handle_output()——是因为使用notify方式不能保证该函数被回调吗?
尝试加入ACE_Event_Handler::WRITE_MASK注册。
犯错了!线程被堵了。
本次问题在ASR时发生,以前发生过一次“是”在TTS时,现象完全一样——现在才发现其实上次的原因也是因为ASR造成的线程阻塞,难怪上次一直压TTS问题也没重现。
看看错误的传递路径:
ASR语法错误 -> “过快”的错误处理 -> 底层设备状态错误 -> 底层API调用阻塞 -> 线程阻塞 -> 通信失败 -> TTS不可用
——够烂吧?
ACE5.5
现象:
一个正常的TCP连接,一段时间后client向server发送数据失败——127.0.0.1的地址,连接未断开,client日志显示发送成功,而server的日志却显示未收到数据。
内部实现:
client发送数据时首先将数据加入ACE_Message_Queue<ACE_MT_SYNCH>中,再使用reactor()->notify(this, ACE_Event_Handler::WRITE_MASK)进行发送(该过程正常执行);在发送线程ACE_Task_Base的svc()中循环调用reactor()->handle_events()处理事件,在handle_output中调用send_n进行发送;程序没有调用reactor()->register_handler注册ACE_Event_Handler::WRITE_MASK事件。
跟踪:
发现没有回调handle_output()——是因为使用notify方式不能保证该函数被回调吗?
尝试加入ACE_Event_Handler::WRITE_MASK注册。
犯错了!线程被堵了。
本次问题在ASR时发生,以前发生过一次“是”在TTS时,现象完全一样——现在才发现其实上次的原因也是因为ASR造成的线程阻塞,难怪上次一直压TTS问题也没重现。
看看错误的传递路径:
ASR语法错误 -> “过快”的错误处理 -> 底层设备状态错误 -> 底层API调用阻塞 -> 线程阻塞 -> 通信失败 -> TTS不可用
——够烂吧?