Hi, On Mon, 9 May 2016, Rich Felker wrote:
> > > The *context APIs are deprecated and I'm not sure they're worth > > > supporting with this. It would be a good excuse to get people to > > > stop using them. > > > > How? POSIX decided to remove the facilities without any adequate > > replacement (thread aren't). > > Threads work just as well as the ucontext api for coroutines. Due to the > requirement to save/restore signal masks, the latter requires a syscall, > making it no faster than a voluntary context switch via futex syscall. Uhm, no. If you disregard efficiency, sure, POSIX threads are sometimes a replacement on some platforms. They still have completely different activation models (being synchronous with *context, for which you need even further slow synchronization in a threading model). > Most of the other hacks people used the ucontext API for were complete > hacks with undefined behavior, anyway. Sure, that doesn't imply the facility should be removed. I can misuse all kinds of stuff. > BTW it's not even possible to implement makecontext on most targets due > to the wacky variadic calling convention it uses -- in most ABIs, > there's simply no way to shift the variadic args into the right slots > for calling the start function for the new context without knowing their > types, and the implementation has no way to know the types. So it's > really an unusably broken API. Of course. But _that_ implies that a workable replacement should have been put in place, not the unrealistic stance POSIX took with the removal: makecontext2(ucontext_t *ucp, void (*func)(void*), void* cookie); Done. I never understood why they left in the hugely unuseful {sig,}{set,long}jmp() but removed the actually useful *context() (amended somehow like above). Ciao, Michael.