implement using coroutine(via boost::context)