检查pjsip的socket select的性能,我发现了一个非常奇怪的超时行为。 socket_select.c中的源代码如下:
struct timeval os_timeout, *p_os_timeout;
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(sizeof(pj_fd_set_t)-sizeof(pj_sock_t) >= sizeof(fd_set),
PJ_EBUG);
if (timeout) {
os_timeout.tv_sec = timeout->sec;
os_timeout.tv_usec = timeout->msec * 1000;
p_os_timeout = &os_timeout;
} else {
p_os_timeout = NULL;
}
return select(n, PART_FDSET_OR_NULL(readfds), PART_FDSET_OR_NULL(writefds),
PART_FDSET_OR_NULL(exceptfds), p_os_timeout);
我已经检查过,并且传递给select函数的所有参数都是正确的,并且选择后总是将超时值重新初始化为正确的值。 n如果还设置为最大使用文件描述符。
问题在于,有时候,超时被正确触发并以0退出,但有时,它会被随机时间段(从某些msecs到分钟)阻塞,同时返回0。
我目前正在检查每个fd_set中的内容,以防万一,但如果有人知道可能出现的问题我真的很感激。
答案 0 :(得分:0)
问题很可能不在socket_select.c中。你在哪里打电话给选择?您是否使用多个线程并从另一个线程调用select?您可以发布您的代码或提供链接吗?