add nonblock function