From 855f941a23413a8dcc5a6a7004d4b61a1abcf882 Mon Sep 17 00:00:00 2001 From: "sfraser%netscape.com" Date: Tue, 19 Feb 2002 01:26:30 +0000 Subject: [PATCH] Fix for bug 121952 -- make PR_ConnectContinue work on Mac, re-enabling non-blocking connects. r=wtc. Also bring forward some code changes to build with CodeWarrior Pro 7 (UPP stuff). --- nsprpub/pr/include/md/_macos.h | 13 ++++++++----- nsprpub/pr/src/io/prsocket.c | 2 +- nsprpub/pr/src/md/mac/macio.c | 2 +- nsprpub/pr/src/md/mac/macsockotpt.c | 17 +++++++++++++---- nsprpub/pr/src/md/mac/macthr.c | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/nsprpub/pr/include/md/_macos.h b/nsprpub/pr/include/md/_macos.h index ccd54a83ac64..a95febd1e787 100644 --- a/nsprpub/pr/include/md/_macos.h +++ b/nsprpub/pr/include/md/_macos.h @@ -115,15 +115,18 @@ typedef struct _MDSocketCallerInfo { struct _MDFileDesc { PRInt32 osfd; - PRBool orderlyDisconnect; - PRBool readReady; - PRBool writeReady; - PRBool exceptReady; + PRPackedBool orderlyDisconnect; + PRPackedBool readReady; + PRPackedBool writeReady; + PRPackedBool exceptReady; PRLock * miscLock; /* Server sockets: listen bit tells the notifier func what to do */ PRBool doListen; + /* stored error for non-blocking connects, as a Unix-style error code */ + OTReason disconnectError; + _MDSocketCallerInfo misc; _MDSocketCallerInfo read; _MDSocketCallerInfo write; @@ -647,7 +650,7 @@ extern PRStatus _MD_CloseFileMap(struct PRFileMap *fmap); #define _MD_CLOSE_FILE_MAP _MD_CloseFileMap extern void SetLogFileTypeCreator(const char *logFile); -extern int _MD_mac_get_nonblocking_connect_error(PRInt32 osfd); +extern int _MD_mac_get_nonblocking_connect_error(PRFileDesc* fd); /* diff --git a/nsprpub/pr/src/io/prsocket.c b/nsprpub/pr/src/io/prsocket.c index fad56f809790..acbc0016725d 100644 --- a/nsprpub/pr/src/io/prsocket.c +++ b/nsprpub/pr/src/io/prsocket.c @@ -347,7 +347,7 @@ static PRStatus PR_CALLBACK SocketConnectContinue( #elif defined(XP_MAC) - err = _MD_mac_get_nonblocking_connect_error(osfd); + err = _MD_mac_get_nonblocking_connect_error(fd); if (err == -1) return PR_FAILURE; else diff --git a/nsprpub/pr/src/md/mac/macio.c b/nsprpub/pr/src/md/mac/macio.c index bef0eb1a2823..ef404db5064a 100644 --- a/nsprpub/pr/src/md/mac/macio.c +++ b/nsprpub/pr/src/md/mac/macio.c @@ -267,7 +267,7 @@ PRInt32 ReadWriteProc(PRFileDesc *fd, void *buf, PRUint32 bytes, IOOperation op) a 32 byte Ptr in the heap, so only do this once */ if (!sCompletionUPP) - sCompletionUPP = NewIOCompletionProc((IOCompletionProcPtr)&AsyncIOCompletion); + sCompletionUPP = NewIOCompletionUPP((IOCompletionProcPtr)&AsyncIOCompletion); /* grab the thread so we know which one to post to at completion */ pbAsync.thread = me; diff --git a/nsprpub/pr/src/md/mac/macsockotpt.c b/nsprpub/pr/src/md/mac/macsockotpt.c index 8ee592cba165..3002a7ece518 100644 --- a/nsprpub/pr/src/md/mac/macsockotpt.c +++ b/nsprpub/pr/src/md/mac/macsockotpt.c @@ -373,6 +373,8 @@ static pascal void NotifierRoutine(void * contextPtr, OTEventCode code, OTResul PR_ASSERT(err == kOTNoError); secret->md.exceptReady = PR_TRUE; // XXX Check this + md->disconnectError = discon.reason; // save for _MD_mac_get_nonblocking_connect_error + // wake up waiting threads, if any result = -3199 - discon.reason; // obtain the negative error code if ((readThread = secret->md.read.thread) != NULL) { @@ -2197,25 +2199,32 @@ ErrorExit: } -int _MD_mac_get_nonblocking_connect_error(PRInt32 osfd) +int _MD_mac_get_nonblocking_connect_error(PRFileDesc* fd) { - OTResult resultOT; - EndpointRef endpoint = (EndpointRef) osfd; + EndpointRef endpoint = (EndpointRef)fd->secret->md.osfd; + OTResult resultOT = OTGetEndpointState(endpoint); - resultOT = OTGetEndpointState(endpoint); switch (resultOT) { case T_OUTCON: macsock_map_error(EINPROGRESS); return -1; + case T_DATAXFER: return 0; + case T_IDLE: + macsock_map_error(fd->secret->md.disconnectError); + fd->secret->md.disconnectError = 0; return -1; + case T_INREL: macsock_map_error(ENOTCONN); return -1; + default: PR_ASSERT(0); return -1; } + + return -1; // not reached } diff --git a/nsprpub/pr/src/md/mac/macthr.c b/nsprpub/pr/src/md/mac/macthr.c index 2a35bfcced96..8838ef155194 100644 --- a/nsprpub/pr/src/md/mac/macthr.c +++ b/nsprpub/pr/src/md/mac/macthr.c @@ -199,7 +199,7 @@ void _MD_StartInterrupts(void) gPrimaryThread = _PR_MD_CURRENT_THREAD(); if ( !gTimerCallbackUPP ) - gTimerCallbackUPP = NewTimerProc(TimerCallback); + gTimerCallbackUPP = NewTimerUPP(TimerCallback); // Fill in the Time Manager queue element