关于socket的select函数

lnuyasha_hrb 2011-02-23 11:45:16
请哪位大侠帮我详细解读下下面select 函数, 感觉有点问题


int select(
int nfds,
fd_set_t *readSet,
fd_set_t *writeSet,
fd_set_t *exSet,
timeval_t *timeVal
)
{

int ret;
fd_select_set_t fdSets;
selectHandle_t *selHandle;
sig_t semid;
int timeout;
int isTimeOut;
int msec;
uint8 cpriority;
sig_t ctaskid;
stdsess_t *StdSess_p = &StdSess;


if(timeVal == NULL)
timeout = 0;
else
{
msec = (timeVal->tv_sec*1000) + (timeVal->tv_usec/1000);
if(msec==0 && timeVal->tv_usec!=0)
msec++;

if(msec==0)
timeout =-1;
else if(msec < 0)
timeout = 0x7ffff;
else
timeout = msec;

}

/* new a selectHandle */
if((selHandle = (selectHandle_t*)calloc(1, sizeof(selectHandle_t)))==NULL)
return -1;


selHandle->semId = screatesem();

semid = selHandle->semId;

if(readSet!=NULL)
fd_copy(&(selHandle->readSet), readSet);
if(writeSet!=NULL)
fd_copy(&(selHandle->writeSet), writeSet);
if(exSet!=NULL)
fd_copy(&(selHandle->exSet), exSet);

fd_zero(&(fdSets.outReadSet));
fd_zero(&(fdSets.outWriteSet));
fd_zero(&(fdSets.outExSet));

cpriority = sysTaskPriority();
ctaskid = sysTaskId();

if( cpriority > NETWORK_TASK_PRIORITY ) {
sysSetTaskPriority(ctaskid, NETWORK_TASK_PRIORITY);
}
else if( cpriority < NETWORK_TASK_PRIORITY ) {
DBG_pline_1("May break critical section!!!\r\n");
sysreset();
}

/* select: socket closed */
/* check invalid socket that has been broken before we really do select */
ret = sel_check_invalid_socket( &fdSets, selHandle );
/* end select: socket closed */

ret += do_select(&fdSets, selHandle, 1);

if( ret == 0 && timeout!=-1 )
{
/* swap upcall */

swap_upcall(selHandle);

// if (sysTaskId() == piniId && !StdSess.inproc) {
if (sysTaskId() == piniId && !StdSess_p->inproc) {
IntSemID = semid;
ControlStdio(0, 0, CTLC, selectInt);
isTimeOut = swait(semid, timeout);
ResetStdio();
IntSemID = 0;
}
else
isTimeOut = swait(semid, timeout);

if (cpriority > NETWORK_TASK_PRIORITY)
sysSetTaskPriority(ctaskid, cpriority);

if(!isTimeOut){
ret = do_select(&fdSets, selHandle, 0);
/* select: socket closed */
/* check if we do close_s() to make an invalid socket and ssignal the original task */
ret += sel_check_invalid_socket( &fdSets, selHandle );
/* end select: socket closed */
}

/* recover all upcall */
if(ret == 0) /* semephore timeout, need to recover upcall */
recover_upcall(selHandle);

}
else if(cpriority > NETWORK_TASK_PRIORITY)
sysSetTaskPriority(ctaskid, cpriority);


if(readSet!=NULL)
fd_copy(readSet,&(fdSets.outReadSet));
if(writeSet!=NULL)
fd_copy(writeSet,&(fdSets.outWriteSet));
if(exSet!=NULL)
fd_copy(exSet,&(fdSets.outExSet));

recover_upcall(selHandle);
sdeletesem(semid);
free(selHandle);

return ret;
}
...全文
120 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧