aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-connectivity/wvdial/wvstreams/0002-wvtask-Dont-use-ucontext-on-non-glibc-systems.patch
blob: 232db9e63b71168d975eaf17026fda07f4cfeb8d (plain)
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(&current_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