Author: mlytwyn
Date: Fri Jan 30 03:00:16 2015
New Revision: 38308

URL: http://svn.gna.org/viewcvs/gnustep?rev=38308&view=rev
Log:
Patch for race condition

Modified:
    libs/base/branches/gnustep_testplant_branch/Source/GSMDNSNetServices.m

Modified: libs/base/branches/gnustep_testplant_branch/Source/GSMDNSNetServices.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Source/GSMDNSNetServices.m?rev=38308&r1=38307&r2=38308&view=diff
==============================================================================
--- libs/base/branches/gnustep_testplant_branch/Source/GSMDNSNetServices.m      
(original)
+++ libs/base/branches/gnustep_testplant_branch/Source/GSMDNSNetServices.m      
Fri Jan 30 03:00:16 2015
@@ -925,9 +925,13 @@
                         forMode: NSDefaultRunLoopMode];
       }
       
+#if 0
       [service->runloop addTimer: service->timer
                          forMode: service->runloopmode];
       [service->timer fire];
+#else
+      DNSServiceProcessResult(_netService);
+#endif
     }
     else // notify the delegate of the error
     {
@@ -1101,7 +1105,7 @@
       }
       
       // Prepare query for A and/or AAAA record
-      errorCode = DNSServiceQueryRecord((DNSServiceRef *) &_netService,
+      errorCode = DNSServiceQueryRecord((DNSServiceRef *) &_queryRef,
                                         flags,
                                         interfaceIndex,
                                         hosttarget,
@@ -1120,15 +1124,76 @@
       }
       else
            {
+#if 0
+        // Try delaying a bit for Bonjour to respond...
         service->timer = [[NSTimer timerWithTimeInterval: INTERVAL
                                                   target: self
                                                 selector: @selector(loop:)
                                                 userInfo: nil
                                                  repeats: YES] retain];
         [service->timer fire];
-
+        
         // notify the delegate
         [self netServiceDidResolveAddress: self];
+#else
+#if 0
+        while (errorCode == kDNSServiceErr_NoError)
+        {
+          errorCode = DNSServiceProcessResult(_queryRef);
+        }
+#else
+        {
+          struct  timeval      tout = { 0, 50 };
+          fd_set  set;
+          int     sock = DNSServiceRefSockFD(_queryRef);;
+        
+          if (-1 != sock)
+          {
+            int selcode = 1;
+            FD_ZERO(&set);
+            FD_SET(sock, &set);
+            
+            while ((selcode = select(sock + 1, &set, (fd_set *) NULL, (fd_set 
*) NULL, &tout)) == 1)
+            {
+              errorCode = DNSServiceProcessResult(_queryRef);
+            }
+            if (-1 == selcode)
+            {
+              NSLog(@"%s:%d:DNSServiceProcessResult select code: %d errno: 
%d", __PRETTY_FUNCTION__, __LINE__, selcode, errno);
+            }
+            else if (selcode == 0)
+            {
+              NSLog(@"%s:%d:DNSServiceProcessResult select code: %d TIMEOUT", 
__PRETTY_FUNCTION__, __LINE__, selcode);
+            }
+          }
+        }
+#endif
+        
+#if 0
+        if (kDNSServiceErr_NoError != errorCode)
+        {
+          // Notify delegate...
+          [self netService: self
+             didNotResolve: CreateError(self, errorCode)];
+          [self stopResolving: self];
+        }
+        else
+#endif
+        if (([self addresses] == nil) || ([[self addresses] count] == 0))
+        {
+          // Notify delegate...
+          [self netService: self
+             didNotResolve: CreateError(self, errorCode)];
+          [self stopResolving: self];
+        }
+        else
+        {
+          // notify the delegate
+          [self netServiceDidResolveAddress: self];
+        }
+        DNSServiceRefDeallocate(_queryRef);
+        NSLog(@"%s:%d:errorCode: %ld", __PRETTY_FUNCTION__, __LINE__, 
(long)errorCode);
+#endif
            }
     }
   }
@@ -1301,6 +1366,7 @@
   Service      *service;
   
   INTERNALTRACE;
+  NSLog(@"%s:%d:DNSServiceRef: %p", __PRETTY_FUNCTION__, __LINE__, sdRef);
 
   service = (Service *) _reserved;
   
@@ -1486,10 +1552,10 @@
 
   if (-1 != sock)
   {
+    int selcode;
     FD_ZERO(&set);
     FD_SET(sock, &set);
     
-    int selcode;
     selcode = select(sock + 1, &set, (fd_set *) NULL, (fd_set *) NULL, &tout);
     if (1 == selcode)
     {
@@ -2013,7 +2079,7 @@
         DESTROY(service->timeout);
       }
       
-      service->timeout = [[NSTimer scheduledTimerWithTimeInterval: timeout + 
SHORTTIMEOUT
+      service->timeout = [[NSTimer timerWithTimeInterval: timeout + 
SHORTTIMEOUT
                                                            target: self
                                                          selector: 
@selector(stopResolving:)
                                                          userInfo: nil


_______________________________________________
Gnustep-cvs mailing list
Gnustep-cvs@gna.org
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to