2012-10-23 101 views
0

检查pjsip的套接字选择的性能,我发现一个非常奇怪的行为与超时。在socket_select.c的源代码如下:选择(2)超时的奇怪行为

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); 

我检查,并通过选择函数的所有参数都正确和超时值始终重新初始化后选择正确的值。如果还设置为最大使用的文件描述符。

的问题是,有时,超时被适当地烧制,并用0退出但是,有时,它就会被阻塞的一个随机时间(从一些毫秒至几分钟),也返回0。

我目前我正在检查每个fd_set中的内容,以防万一,但是如果有人知道哪些内容可能出错,我将非常感激。

回答

0

这个问题很可能不在socket_select.c中。你在哪里打电话给选择?您是否使用多个线程并从另一个线程调用select?你可以发布你的代码或提供链接?

+0

源代码只是pjsip的1.x分支版本4109.这是从ioqueue_select.c(在pj_ioqueue_poll中)调用的pj_sock_select的代码。另一方面,我创建了一个基本的选择测试应用程序,并且我看到,当有套接字活动时,我也会在超时(不是很大,大约7或8毫秒)中出现一些延迟。所以,我认为,Android的选择实现应该有一个问题。 – jcm

+0

我记得有一个使用Android NDK构建PJSIP 1.8.10的补丁。 http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2011-October/013409.html。查看您的PJSIP版本是否还需要补丁您是否使用最新版本的Android-NDK?如果您使用PJSIP 2.x,你会发现有什么区别吗? –

+0

感谢您的链接,但我已经在使用此补丁以及其他一些改进。我没有使用最新的NDK,但是7,我会尝试PJSIP 2.0,但是套接字的源代码与1.8版本相同。另一方面,我检查了Android的通用内核源代码,我认为,如果文件操作的轮询回调被阻止,问题可能出现在select的实际实现中。我试图解决这个问题,但现在没有运气:-( – jcm