Hi Gambit community and Marc,
This email is to draw your attention to the issue "Mitigate the bug in
poll() on Mac OS X (= on OSX, "--enable-poll" causes CPU hogging
currently)".
It basically means, the Gambit REPL on Mac OS causes the laptop fan to
spin, due to that its poll() keeps returning instantly instead of waiting
for IO which is its intended behavior.
I just registered it on GitHub, https://github.com/gambit/gambit/issues/498.
Copy of the report below so you don't even need to click the link.
While this issue is already known from before (both in Gambit and in Mac
OS), I think to help clarify what's a good fix, me and someone with a Mac
will run the tests below.
Any thoughts and solution suggestions much appreciated.
Adam
--
This issue has been noticed by at least someone before, e.g. Gerbil's
getting started page says "./configure […] --enable-poll # For Linux and
BSD; don't use this on macOS". [1]
I'll now pass some references on this topic:
-
Apple's poll() man page in the latest version today (March 2020) says
"BUGS: The poll() system call currently does not support devices.". (Not
sure exactly what "devices" is here however from how Gambit reacts we can
reliably deduce that Gambit's use of the console on Mac OS X does count as
a "device" in this definition, unless of course poll() would have even more
bugs that are not listed in this page.) [2]
-
Apple's poll() has a really ugly history: until before Mac OS 10.12.2
(released Dec 2016), it always returned immediately. [3]
For that old bug, I see at least two test scripts available, [3] and
[4], the first one just uses a timeout, and the second one poll():s a pipe.
The tests appear to be time-dependent.
Now to the parts I'm not clear about and where I guess some further steps
are needed:
-
Make a minimal reproduction script in C:
I don't have a Mac OS installation to test on. Someone else who does,
told me that poll() to the STDIN FD does work as expected, meaning the
Gambit CPU hog bug on Mac OS X is not tested for that route (if the test
outcome is correct).
We should figure out which FD or device is the console "device" that
still today maces Mac OS' poll() return immediately.
-
Make Gambit make a debug print-out to get confirmed exactly how poll()
fails:
Just for completeness I'd love to know which return value poll() gives
Gambit on Mac OS X right now, and also exactly which FD Gambit polls for.
This is specifically with a fresh "gsi" with default IO settings, that is
waiting for console input only.
-
Isolate the issue in Gambit:
We should do some alternative testing in Gambit where Gambit is *not*
poll():ing the console, to get validated that for Gambit it's the console
specifically that poll() doesn't work for i.e. for network descriptors and
files it does what it should.
-
Guess about how the solution should look:
I guess the solution is that Gambit's ./configure on Mac OS X should
ignore --enable-poll .
If anyone likes to compile binaries for all platforms including Mac OS X
that will never poll() the console, maybe those guys should do their
|compile-file| with the C define correspondent of --enable-poll, that
should be something like "-DENABLE_POLL", need to check.
So preliminarily it looks to me like that the latest version of Mac OS X
does have a bug in poll(), and presuming this is correct, it's a great
shame that Apple is forcing its whole ecosystem into ancient select() with
all its constraints, quite incredible really.
I'll participate in just a bit more testing of this bug per above later.
The CPU hogging is enough to turn on the fan on a Mac laptop, making it
nicer to have the Gambit REPL not run than run, that is a really
unnecessary annoyance.
@feeley <https://github.com/feeley> what do you think & is a good solution.
(@vyzo <https://github.com/vyzo> after this is fixed the "# For Linux and
BSD; don't use this on macOS" precaution in Gerbil should not apply
anymore. That is also nice as special Gambit configure arguments for Mac OS
X is an unnecessary asymmetry.)
Thanks!
[1]
https://github.com/vyzo/gerbil/blob/bb287c5840fcb747c1047d8ff82c0977d8f9ca7…
[2]
https://developer.apple.com/library/archive/documentation/System/Conceptual…
[3] https://daniel.haxx.se/blog/2016/10/11/poll-on-mac-10-12-is-broken/
[4]
https://stackoverflow.com/questions/591826/it-really-looks-like-os-x-has-a-…