swapcontext - Linux

Table of Contents

※ [本文轉錄自 LinuxDev 看板 #1DDRLRXR ]

作者: yueayase (scrya) 看板: LinuxDev
標題: [問題]swapcontext
時間: Tue Jan 18 23:44:25 2011

對於swapcontext()這個function,修改以下code(從linux man page):

#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>

static ucontext_t uctx_main, uctx_func1, uctx_func2;

#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)

static void
func1(void)
{
printf("func1: started\n");
printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");

/* 有趣的地方 */
printf("test...\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
printf("func1: returning\n");
}

static void
func2(void)
{
printf("func2: started\n");
printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n");
if (swapcontext(&uctx_func2, &uctx_func1) == -1)
die("swapcontext");
printf("func2: returning\n");
}

int
main(int argc, char *argv[])
{
char func1_stack[16384];
char func2_stack[16384];

if (getcontext(&uctx_func1) == -1)
die("getcontext");
uctx_func1.uc_stack.ss_sp = func1_stack;
uctx_func1.uc_stack.ss_size = sizeof(func1_stack);
uctx_func1.uc_link = &uctx_main;
makecontext(&uctx_func1, func1, 0);

if (getcontext(&uctx_func2) == -1)
die("getcontext");
uctx_func2.uc_stack.ss_sp = func2_stack;
uctx_func2.uc_stack.ss_size = sizeof(func2_stack);
/* Successor context is f1(), unless argc > 1 */
uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1;
makecontext(&uctx_func2, func2, 0);

printf("main: swapcontext(&uctx_main, &uctx_func2)\n");
if (swapcontext(&uctx_main, &uctx_func2) == -1)
die("swapcontext");

printf("main: exiting\n");
exit(EXIT_SUCCESS);
}

如果照原本的,會有下列結果
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
func2: returning
func1: returning
main: exiting

可是如果在第一次swapcontext()後加了
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");

結果變成
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
test...
func2: returning


怪了,不是應該回到func1()去嗎?
怎麼main() 和 func1()都沒有作用呢?

如果一個function已經結束,再做一次swapcontext()
好像會產生這樣的結果,
我很好奇,怎麼把這種"func2()已用完"的狀態抓出來?

希望有一些強者可以幫我解答

--

All Comments