--- 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: