1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
From 0e054339c1422168a7f4a9dcf090268053a33b1f Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Thu, 20 Jul 2017 21:05:37 -0700
Subject: [PATCH 2/5] wvtask: Dont use ucontext on non-glibc systems
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
utils/wvtask.cc | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/utils/wvtask.cc b/utils/wvtask.cc
index cdcd544..c0bff7d 100644
--- a/utils/wvtask.cc
+++ b/utils/wvtask.cc
@@ -199,7 +199,9 @@ WvTaskMan::WvTaskMan()
stacktop = (char *)alloca(0);
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(&get_stack_return) == 0);
+#endif
if (context_return == 0)
{
// initial setup - start the stackmaster() task (never returns!)
@@ -265,13 +267,17 @@ int WvTaskMan::run(WvTask &task, int val)
state = &old_task->mystate;
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(state) == 0);
+#endif
int newval = context_return;
if (newval == 0)
{
// saved the state, now run the task.
context_return = val;
+#ifdef __GLIBC__
setcontext(&task.mystate);
+#endif
return -1;
}
else
@@ -319,13 +325,17 @@ int WvTaskMan::yield(int val)
#endif
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(¤t_task->mystate) == 0);
+#endif
int newval = context_return;
if (newval == 0)
{
// saved the task state; now yield to the toplevel.
context_return = val;
+#ifdef __GLIBC__
setcontext(&toplevel);
+#endif
return -1;
}
else
@@ -341,7 +351,9 @@ int WvTaskMan::yield(int val)
void WvTaskMan::get_stack(WvTask &task, size_t size)
{
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(&get_stack_return) == 0);
+#endif
if (context_return == 0)
{
assert(magic_number == -WVTASK_MAGIC);
@@ -371,7 +383,9 @@ void WvTaskMan::get_stack(WvTask &task, size_t size)
// initial setup
stack_target = &task;
context_return = size/1024 + (size%1024 > 0);
+#ifdef __GLIBC__
setcontext(&stackmaster_task);
+#endif
}
else
{
@@ -409,7 +423,9 @@ void WvTaskMan::_stackmaster()
assert(magic_number == -WVTASK_MAGIC);
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(&stackmaster_task) == 0);
+#endif
val = context_return;
if (val == 0)
{
@@ -419,7 +435,9 @@ void WvTaskMan::_stackmaster()
// all current stack allocations) and go back to get_stack
// (or the constructor, if that's what called us)
context_return = 1;
+#ifdef __GLIBC__
setcontext(&get_stack_return);
+#endif
}
else
{
@@ -474,7 +492,9 @@ void WvTaskMan::do_task()
// back here from longjmp; someone wants stack space.
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(&task->mystate) == 0);
+#endif
if (context_return == 0)
{
// done the setjmp; that means the target task now has
@@ -510,7 +530,9 @@ void WvTaskMan::do_task()
}
else
{
+#ifdef __GLIBC__
assert(getcontext(&task->func_call) == 0);
+#endif
task->func_call.uc_stack.ss_size = task->stacksize;
task->func_call.uc_stack.ss_sp = task->stack;
task->func_call.uc_stack.ss_flags = 0;
@@ -521,9 +543,11 @@ void WvTaskMan::do_task()
(void (*)(void))call_func, 1, task);
context_return = 0;
+#ifdef __GLIBC__
assert(getcontext(&task->func_return) == 0);
if (context_return == 0)
setcontext(&task->func_call);
+#endif
}
// the task's function terminated.
--
2.13.3
|