not using polling, to reduce CPU usage when idle