Fix test-select-registry to "atomically" unmask interrupts.
authorMatt Birkholz <puck@birchwood-abbey.net>
Sun, 5 Jul 2015 16:35:22 +0000 (09:35 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Mon, 6 Jul 2015 06:27:17 +0000 (23:27 -0700)
commit3aae2597e0e09607b3ebb24340f91f2389b731f8
tree1540f3d7d83afbf5111a8c2c9e6a72b14ae6c83e
parenteb9d34ad5f20de583c3097ba8deebf1c8d99b9ab
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.
src/microcode/uxio.c
src/runtime/thread.scm