Fix for bug 49990 "Networking fails after sleep/wake cycle" on Mac. rtm+, r=pinkerton, sr =sfraser. Added support for provide will/has closed OT events.

This commit is contained in:
gordon%netscape.com 2000-10-10 21:25:27 +00:00
Родитель c53f51da77
Коммит 7e3061d98b
1 изменённых файлов: 42 добавлений и 21 удалений

Просмотреть файл

@ -67,7 +67,6 @@ static struct {
void * cookie;
} dnsContext;
static PRBool gOTInitialized;
static pascal void DNSNotifierRoutine(void * contextPtr, OTEventCode code, OTResult result, void * cookie);
static pascal void NotifierRoutine(void * contextPtr, OTEventCode code, OTResult result, void * cookie);
@ -122,14 +121,13 @@ void _MD_InitNetAccess()
errOT = INIT_OPEN_TRANSPORT();
PR_ASSERT(err == kOTNoError);
dnsContext.serviceRef = NULL;
dnsContext.lock = PR_NewLock();
PR_ASSERT(dnsContext.lock != NULL);
dnsContext.thread = _PR_MD_CURRENT_THREAD();
dnsContext.cookie = NULL;
gOTInitialized = PR_FALSE;
/* XXX Does not handle absence of open tpt and tcp yet! */
}
@ -137,8 +135,15 @@ static void _MD_FinishInitNetAccess()
{
OSStatus errOT;
if (dnsContext.serviceRef)
return;
dnsContext.serviceRef = OT_OPEN_INTERNET_SERVICES(kDefaultInternetServicesPath, NULL, &errOT);
if (errOT != kOTNoError) return; /* no network -- oh well */
if (errOT != kOTNoError) {
dnsContext.serviceRef = NULL;
return; /* no network -- oh well */
}
PR_ASSERT((dnsContext.serviceRef != NULL) && (errOT == kOTNoError));
/* Install notify function for DNR Address To String completion */
@ -148,25 +153,47 @@ static void _MD_FinishInitNetAccess()
/* Put us into async mode */
errOT = OTSetAsynchronous(dnsContext.serviceRef);
PR_ASSERT(errOT == kOTNoError);
gOTInitialized = PR_TRUE;
}
static pascal void DNSNotifierRoutine(void * contextPtr, OTEventCode code, OTResult result, void * cookie)
static pascal void DNSNotifierRoutine(void * contextPtr, OTEventCode otEvent, OTResult result, void * cookie)
{
#pragma unused(contextPtr)
_PRCPU * cpu = _PR_MD_CURRENT_CPU();
if (code == T_DNRSTRINGTOADDRCOMPLETE) {
OSStatus errOT;
dnsContext.thread->md.osErrCode = result;
dnsContext.cookie = cookie;
if (_PR_MD_GET_INTSOFF()) {
cpu->u.missed[cpu->where] |= _PR_MISSED_IO;
dnsContext.thread->md.missedIONotify = PR_TRUE;
return;
}
DoneWaitingOnThisThread(dnsContext.thread);
switch (otEvent) {
case T_DNRSTRINGTOADDRCOMPLETE:
if (_PR_MD_GET_INTSOFF()) {
cpu->u.missed[cpu->where] |= _PR_MISSED_IO;
dnsContext.thread->md.missedIONotify = PR_TRUE;
return;
}
DoneWaitingOnThisThread(dnsContext.thread);
break;
case kOTProviderWillClose:
errOT = OTSetSynchronous(dnsContext.serviceRef);
// fall through to kOTProviderIsClosed case
case kOTProviderIsClosed:
errOT = OTCloseProvider((ProviderRef)dnsContext.serviceRef);
dnsContext.serviceRef = nil;
if (_PR_MD_GET_INTSOFF()) {
cpu->u.missed[cpu->where] |= _PR_MISSED_IO;
dnsContext.thread->md.missedIONotify = PR_TRUE;
return;
}
DoneWaitingOnThisThread(dnsContext.thread);
break;
default: // or else we don't handle the event
PR_ASSERT(otEvent==NULL);
}
// or else we don't handle the event
}
@ -486,7 +513,6 @@ PRInt32 _MD_socket(int domain, int type, int protocol)
OSStatus err;
EndpointRef endpoint;
if (!gOTInitialized)
_MD_FinishInitNetAccess();
// We only deal with internet domain
@ -1894,7 +1920,6 @@ PR_IMPLEMENT(unsigned long) inet_addr(const char *cp)
OSStatus err;
InetHost host;
if (!gOTInitialized)
_MD_FinishInitNetAccess();
err = OTInetStringToHost((char*) cp, &host);
@ -1917,7 +1942,6 @@ PR_IMPLEMENT(struct hostent *) gethostbyname(const char * name)
PRUint32 index;
PRThread *me = _PR_MD_CURRENT_THREAD();
if (!gOTInitialized)
_MD_FinishInitNetAccess();
me->io_pending = PR_TRUE;
@ -1958,7 +1982,6 @@ PR_IMPLEMENT(struct hostent *) gethostbyaddr(const void *addr, int addrlen, int
PR_ASSERT(type == AF_INET);
PR_ASSERT(addrlen == sizeof(struct in_addr));
if (!gOTInitialized)
_MD_FinishInitNetAccess();
OTInetHostToString((InetHost)addr, sHostInfo.name);
@ -1969,7 +1992,6 @@ PR_IMPLEMENT(struct hostent *) gethostbyaddr(const void *addr, int addrlen, int
PR_IMPLEMENT(char *) inet_ntoa(struct in_addr addr)
{
if (!gOTInitialized)
_MD_FinishInitNetAccess();
OTInetHostToString((InetHost)addr.s_addr, sHostInfo.name);
@ -1983,7 +2005,6 @@ PRStatus _MD_gethostname(char *name, int namelen)
OSStatus err;
InetInterfaceInfo info;
if (!gOTInitialized)
_MD_FinishInitNetAccess();
/*