Fix test-select-registry to "atomically" unmask interrupts.
authorMatt Birkholz <puck@birchwood-abbey.net>
Fri, 24 Jul 2015 00:54:30 +0000 (17:54 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:45 +0000 (01:09 -0700)
commitc0816ccc3db619866dad4da50f33ab6d8edabc4d
tree561bef393027113d0ff5f6a0a4bdaaf8887b1996
parent1003c79eb3ace28a190f49d6078205eafb802d4d
Fix test-select-registry to "atomically" unmask interrupts.

When SMPing the machine cannot miss e.g a global-GC interrupt, else
the whole world grinds to a halt.  Using (set-interrupt-enables!
interrupt-mask/all) and then (test-select-registry ... #t) admits a
small "hole" wherein such an interrupt can drop, allowing the machine
to block without realizing it missed an interrupt intended to wake it.

The test-select-registry primitive does not actually "atomically
unmask interrupts" but simply ignores the mask inside its critical
section -- as if the mask was interrupt-mask/all.

Adjust branches so that, when not blocking, the simpler poll/select is
called (rather than ppoll/pselect).

Eliminate loops that re-try after masked interrupts arrive since all
interrupts are considered unmasked here.

Conflicts:
src/runtime/thread.scm
src/microcode/uxio.c
src/runtime/thread.scm