4,436
社区成员
发帖
与我相关
我的任务
分享
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;
}