Understanding blocking and non-blocking code