Wrt 2/6, don't we already effectively flush the whole list? Note that the sleep is inside an "else if", so if the list was non-empty we'll check it again immediately.
I think it's also incorrect to sleep immediately; we need to check the CV predicate first. (Consider if an op is queued before the thread even executes.)
The rest of this series makes sense to me, I think, although I'd appreciate Giovanni's review since he's touched this area recently and will probably notice something I didn't.