|  | Home | Libraries | People | FAQ | More | 
        C99 defines setjmp()/longjmp()
        to provide non-local jumps but it does not require that longjmp()
        preserves the current stack frame. Therefore, jumping into a function which
        was exited via a call to longjmp() is undefined [2].
      
        Since POSIX.1-2003 ucontext_t
        is deprecated and was removed in POSIX.1-2008! The function signature of
        makecontext()
        is:
      
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
        The third argument of makecontext() specifies the number of integer arguments
        that follow which will require function pointer cast if func
        will accept those arguments which is undefined in C99 [3].
      
The arguments in the var-arg list are required to be integers, passing pointers in var-arg list is not guaranteed to work, especially it will fail for architectures where pointers are larger than integers.
        ucontext_t preserves signal
        mask between context switches which involves system calls consuming a lot
        of CPU cycles (ucontext_t is slower by perfomance_link[factor 13x] relative
        to fcontext_t).
      
        A drawback of Windows Fiber API is that CreateFiber() does not accept a pointer to user allocated
        stack space preventing the reuse of stacks for other context instances. Because
        the Windows Fiber API requires to call ConvertThreadToFiber() if SwitchFiber() is called for a thread which has not been
        converted to a fiber. For the same reason ConvertFiberToThread() must be called after return from SwitchFiber()
        if the thread was forced to be converted to a fiber before (which is inefficient).
      
if ( ! is_a_fiber() ) { ConvertThreadToFiber( 0); SwitchToFiber( ctx); ConvertFiberToThread(); }
        If the condition _WIN32_WINNT >= _WIN32_WINNT_VISTA
        is met function IsThreadAFiber() is provided in order to detect if the current
        thread was already converted. Unfortunately Windows XP + SP 2/3 defines
        _WIN32_WINNT >=
        _WIN32_WINNT_VISTA without providing
        IsThreadAFiber().