Seastar allows writing such code, by using a seastar::thread object which comes with its own stack.
The seastar::thread allocates a 128KB stack, and runs the given function until then it blocks on the call to a future's get() method. Outside a seastar::thread context, get() may only be called on a future which is already available. But inside a thread, calling get() on a future which is not yet available stops running the thread function, and schedules a continuation for this future, which continues to run the thread's function (on the same saved stack) when the future becomes available.
The above sentences are quoted from seastar tutorial, Does this mean that seastar::thread is a kind of stackful coroutine?