FileStream.st
branchjv
changeset 21604 10256dd38558
parent 21285 7770135c2b54
child 23107 40173e082cbc
--- a/FileStream.st	Mon Feb 20 23:12:06 2017 +0000
+++ b/FileStream.st	Tue Feb 28 09:32:24 2017 +0000
@@ -1363,7 +1363,12 @@
 
 %{
     HFILE f = NULL;
-    int pass = 0;
+    enum {
+    	PASS_INITIAL = 1,
+    	PASS_RETRY_AFTER_SCAVENGE = 2,
+    	PASS_RETRY_AFTER_GARBAGE_COLLECT = 3,
+    	PASS_FINAL = PASS_RETRY_AFTER_GARBAGE_COLLECT
+    } pass = PASS_INITIAL;
 
     if (!__isNonNilObject(encodedPathName)
         || !(__isStringLike(openmode) || __isArrayLike(openmode)))
@@ -1742,11 +1747,26 @@
          * If no filedescriptors available, try to finalize
          * possibly collected fd's and try again.
          */
-        if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass == 0) {
-            pass = 1;
-            __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
-            __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
-            goto retry;
+        if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass < PASS_FINAL) {
+            switch (pass) {
+            	case PASS_INITIAL:
+            	    {
+            	        pass = PASS_RETRY_AFTER_SCAVENGE;
+            	        __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);	    
+            	        __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
+            	    }
+            	    goto retry;
+                case PASS_RETRY_AFTER_SCAVENGE:
+                    {
+            	        pass = PASS_RETRY_AFTER_GARBAGE_COLLECT;
+            	        __SSEND0(@global(ObjectMemory), @symbol(garbageCollect), 0);	    
+            	        __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
+            	    }
+            	    goto retry;
+            	case PASS_RETRY_AFTER_GARBAGE_COLLECT:
+            	    /* Should never be reached */
+            	    goto getOutOfHere;
+            }            
         }
     badArgument:
     getOutOfHere: