mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-04 21:18:35 +00:00
Bug 141614: restored Matthew Zahorik's net_server nonblocking connect
logic, which accidentally got deleted when the BONE changes were checked in. This patch was contributed by Arougthopher <arougthopher@lizardland.net>. Modified Files: bfile.c bmisc.c bnet.c
This commit is contained in:
parent
937dfac4d5
commit
d171294dd7
@ -741,6 +741,56 @@ _MD_pr_poll(PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout)
|
|||||||
out_flags |= PR_POLL_WRITE;
|
out_flags |= PR_POLL_WRITE;
|
||||||
}
|
}
|
||||||
if (FD_ISSET(osfd, &ex)) out_flags |= PR_POLL_EXCEPT;
|
if (FD_ISSET(osfd, &ex)) out_flags |= PR_POLL_EXCEPT;
|
||||||
|
|
||||||
|
/* Workaround for nonblocking connects under net_server */
|
||||||
|
#ifndef BONE_VERSION
|
||||||
|
if (out_flags)
|
||||||
|
{
|
||||||
|
/* check if it is a pending connect */
|
||||||
|
int i = 0, j = 0;
|
||||||
|
PR_Lock( _connectLock );
|
||||||
|
for( i = 0; i < connectCount; i++ )
|
||||||
|
{
|
||||||
|
if(connectList[i].osfd == osfd)
|
||||||
|
{
|
||||||
|
int connectError;
|
||||||
|
int connectResult;
|
||||||
|
|
||||||
|
connectResult = connect(connectList[i].osfd,
|
||||||
|
&connectList[i].addr,
|
||||||
|
connectList[i].addrlen);
|
||||||
|
connectError = errno;
|
||||||
|
|
||||||
|
if(connectResult < 0 )
|
||||||
|
{
|
||||||
|
if(connectError == EINTR || connectError == EWOULDBLOCK ||
|
||||||
|
connectError == EINPROGRESS || connectError == EALREADY)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i == (connectCount - 1))
|
||||||
|
{
|
||||||
|
connectList[i].osfd = -1;
|
||||||
|
} else {
|
||||||
|
for(j = i; j < connectCount; j++ )
|
||||||
|
{
|
||||||
|
memcpy( &connectList[j], &connectList[j+1],
|
||||||
|
sizeof(connectList[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
connectCount--;
|
||||||
|
|
||||||
|
bottom->secret->md.connectReturnValue = connectResult;
|
||||||
|
bottom->secret->md.connectReturnError = connectError;
|
||||||
|
bottom->secret->md.connectValueValid = PR_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PR_Unlock( _connectLock );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
pd->out_flags = out_flags;
|
pd->out_flags = out_flags;
|
||||||
if (out_flags) ready++;
|
if (out_flags) ready++;
|
||||||
|
@ -37,8 +37,12 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
PRLock *_connectLock = NULL;
|
PRLock *_connectLock = NULL;
|
||||||
|
|
||||||
|
#ifndef BONE_VERSION
|
||||||
|
/* Workaround for nonblocking connects under net_server */
|
||||||
PRUint32 connectCount = 0;
|
PRUint32 connectCount = 0;
|
||||||
ConnectListNode connectList[64];
|
ConnectListNode connectList[64];
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
_MD_cleanup_before_exit (void)
|
_MD_cleanup_before_exit (void)
|
||||||
@ -63,7 +67,10 @@ _MD_final_init (void)
|
|||||||
{
|
{
|
||||||
_connectLock = PR_NewLock();
|
_connectLock = PR_NewLock();
|
||||||
PR_ASSERT(NULL != _connectLock);
|
PR_ASSERT(NULL != _connectLock);
|
||||||
|
#ifndef BONE_VERSION
|
||||||
|
/* Workaround for nonblocking connects under net_server */
|
||||||
connectCount = 0;
|
connectCount = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -585,13 +585,18 @@ retry:
|
|||||||
|
|
||||||
if( fd->secret->nonblocking && ((err == EAGAIN) || (err == EINPROGRESS))) {
|
if( fd->secret->nonblocking && ((err == EAGAIN) || (err == EINPROGRESS))) {
|
||||||
PR_Lock(_connectLock);
|
PR_Lock(_connectLock);
|
||||||
connectList[connectCount].osfd = osfd;
|
if (connectCount < sizeof(connectList)/sizeof(connectList[0])) {
|
||||||
memcpy(&connectList[connectCount].addr, addr, addrlen);
|
connectList[connectCount].osfd = osfd;
|
||||||
connectList[connectCount].addrlen = addrlen;
|
memcpy(&connectList[connectCount].addr, addr, addrlen);
|
||||||
connectList[connectCount].timeout = timeout;
|
connectList[connectCount].addrlen = addrlen;
|
||||||
connectCount++;
|
connectList[connectCount].timeout = timeout;
|
||||||
PR_Unlock(_connectLock);
|
connectCount++;
|
||||||
_PR_MD_MAP_CONNECT_ERROR(err);
|
PR_Unlock(_connectLock);
|
||||||
|
_PR_MD_MAP_CONNECT_ERROR(err);
|
||||||
|
} else {
|
||||||
|
PR_Unlock(_connectLock);
|
||||||
|
PR_SetError(PR_INSUFFICIENT_RESOURCES_ERROR, 0);
|
||||||
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
#else /* BONE_VERSION */
|
#else /* BONE_VERSION */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user