Author: rfm
Date: Sat Jun 18 08:42:12 2016
New Revision: 39875

URL: http://svn.gna.org/viewcvs/gnustep?rev=39875&view=rev
Log:
Unchedule I/O events when entering an error state

Modified:
    libs/base/trunk/Source/GSStream.h
    libs/base/trunk/Source/GSStream.m

Modified: libs/base/trunk/Source/GSStream.h
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSStream.h?rev=39875&r1=39874&r2=39875&view=diff
==============================================================================
--- libs/base/trunk/Source/GSStream.h   (original)
+++ libs/base/trunk/Source/GSStream.h   Sat Jun 18 08:42:12 2016
@@ -75,7 +75,7 @@
 { \
   id                    _delegate;     /* Delegate controls operation. */\
   NSMutableDictionary  *_properties;   /* storage for properties       */\
-  BOOL                   _delegateValid;/* whether the delegate responds*/\
+  BOOL                  _delegateValid; /* whether the delegate responds*/\
   NSError               *_lastError;    /* last error occured           */\
   NSStreamStatus         _currentStatus;/* current status               */\
   NSMapTable           *_loops;        /* Run loops and their modes.   */\

Modified: libs/base/trunk/Source/GSStream.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSStream.m?rev=39875&r1=39874&r2=39875&view=diff
==============================================================================
--- libs/base/trunk/Source/GSStream.m   (original)
+++ libs/base/trunk/Source/GSStream.m   Sat Jun 18 08:42:12 2016
@@ -407,7 +407,7 @@
 {
   NSDebugMLLog(@"NSStream", @"record error: %@ - %@", self, anError);
   ASSIGN(_lastError, anError);
-  _currentStatus = NSStreamStatusError;
+  [self _setStatus: NSStreamStatusError];
 }
 
 - (void) _resetEvents: (NSUInteger)mask
@@ -533,7 +533,22 @@
 
 - (void) _setStatus: (NSStreamStatus)newStatus
 {
-  _currentStatus = newStatus;
+  if (_currentStatus != newStatus)
+    {
+      if (NSStreamStatusError == newStatus && NSCountMapTable(_loops) > 0)
+        {
+          /* After an error, we are in the run loops only to trigger
+           * errors, not for I/O, sop we must re-schedule in the right mode.
+           */
+          [self _unschedule];
+          _currentStatus = newStatus;
+          [self _schedule];
+        }
+      else
+        {
+          _currentStatus = newStatus;
+        }
+    }
 }
 
 - (BOOL) _unhandledData


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

Reply via email to