Browse Source

use nonblock listener socket to avoid blocking

experimental/first_unicode_implementation
George Wang 18 years ago
parent
commit
cd6bdb6fbe
  1. 32
      sapi/litespeed/lsapilib.c

32
sapi/litespeed/lsapilib.c

@ -179,6 +179,27 @@ static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader
pHeader->m_packetLen.m_iLen = len;
}
static int lsapi_set_nblock( int fd, int nonblock )
{
int val = fcntl( fd, F_GETFL, 0 );
if ( nonblock )
{
if (!( val & O_NONBLOCK ))
{
return fcntl( fd, F_SETFL, val | O_NONBLOCK );
}
}
else
{
if ( val & O_NONBLOCK )
{
return fcntl( fd, F_SETFL, val &(~O_NONBLOCK) );
}
}
return 0;
}
static int lsapi_close( int fd )
{
int ret;
@ -602,6 +623,7 @@ int LSAPI_InitRequest( LSAPI_Request * pReq, int fd )
} else {
pReq->m_fdListen = fd;
pReq->m_fd = -1;
lsapi_set_nblock( fd, 1 );
}
return 0;
}
@ -643,6 +665,7 @@ int LSAPI_Accept_r( LSAPI_Request * pReq )
return -1;
}
} else {
lsapi_set_nblock( pReq->m_fd , 0 );
if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) {
setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY,
(char *)&nodelay, sizeof(nodelay));
@ -1837,9 +1860,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
}
/* perror( "select()" ); */
break;
} else {
continue;
}
} else {
continue;
}
pReq->m_fd = lsapi_accept( pServer->m_fd );
@ -1852,6 +1875,7 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
s_req_processed = 0;
s_pChildStatus = child_status;
child_status->m_iKillSent = 0;
lsapi_set_nblock( pReq->m_fd, 0 );
/* don't catch our signals */
sigaction( SIGCHLD, &old_child, 0 );
@ -1966,7 +1990,11 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
pReq->m_fd = lsapi_accept( pReq->m_fdListen );
if ( pReq->m_fd != -1 ) {
fd = pReq->m_fd;
lsapi_set_nblock( fd, 0 );
} else {
if (( errno == EINTR )||( errno == EAGAIN)) {
continue;
}
return -1;
}
} else {

Loading…
Cancel
Save