summaryrefslogtreecommitdiff
path: root/src/tests/common/fibers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/common/fibers.cpp')
-rw-r--r--src/tests/common/fibers.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/tests/common/fibers.cpp b/src/tests/common/fibers.cpp
index b2ded2065..d94492fc6 100644
--- a/src/tests/common/fibers.cpp
+++ b/src/tests/common/fibers.cpp
@@ -67,15 +67,16 @@ void TestControl1::DoWork() {
67 value++; 67 value++;
68 } 68 }
69 results[id] = value; 69 results[id] = value;
70 Fiber::YieldTo(work_fibers[id].get(), thread_fibers[id].get()); 70 Fiber::YieldTo(work_fibers[id], thread_fibers[id]);
71} 71}
72 72
73void TestControl1::ExecuteThread(u32 id) { 73void TestControl1::ExecuteThread(u32 id) {
74 thread_ids.Register(id); 74 thread_ids.Register(id);
75 thread_fibers[id] = Fiber::ThreadToFiber(); 75 auto thread_fiber = Fiber::ThreadToFiber();
76 thread_fibers[id] = thread_fiber;
76 work_fibers[id] = std::make_shared<Fiber>(std::function<void(void*)>{WorkControl1}, this); 77 work_fibers[id] = std::make_shared<Fiber>(std::function<void(void*)>{WorkControl1}, this);
77 items[id] = rand() % 256; 78 items[id] = rand() % 256;
78 Fiber::YieldTo(thread_fibers[id].get(), work_fibers[id].get()); 79 Fiber::YieldTo(thread_fibers[id], work_fibers[id]);
79 thread_fibers[id]->Exit(); 80 thread_fibers[id]->Exit();
80} 81}
81 82
@@ -116,11 +117,11 @@ public:
116 for (u32 i = 0; i < 12000; i++) { 117 for (u32 i = 0; i < 12000; i++) {
117 value1 += i; 118 value1 += i;
118 } 119 }
119 Fiber::YieldTo(fiber1.get(), fiber3.get()); 120 Fiber::YieldTo(fiber1, fiber3);
120 const u32 id = thread_ids.Get(); 121 const u32 id = thread_ids.Get();
121 assert1 = id == 1; 122 assert1 = id == 1;
122 value2 += 5000; 123 value2 += 5000;
123 Fiber::YieldTo(fiber1.get(), thread_fibers[id].get()); 124 Fiber::YieldTo(fiber1, thread_fibers[id]);
124 } 125 }
125 126
126 void DoWork2() { 127 void DoWork2() {
@@ -128,7 +129,7 @@ public:
128 ; 129 ;
129 value2 = 2000; 130 value2 = 2000;
130 trap = false; 131 trap = false;
131 Fiber::YieldTo(fiber2.get(), fiber1.get()); 132 Fiber::YieldTo(fiber2, fiber1);
132 assert3 = false; 133 assert3 = false;
133 } 134 }
134 135
@@ -136,19 +137,19 @@ public:
136 const u32 id = thread_ids.Get(); 137 const u32 id = thread_ids.Get();
137 assert2 = id == 0; 138 assert2 = id == 0;
138 value1 += 1000; 139 value1 += 1000;
139 Fiber::YieldTo(fiber3.get(), thread_fibers[id].get()); 140 Fiber::YieldTo(fiber3, thread_fibers[id]);
140 } 141 }
141 142
142 void ExecuteThread(u32 id); 143 void ExecuteThread(u32 id);
143 144
144 void CallFiber1() { 145 void CallFiber1() {
145 const u32 id = thread_ids.Get(); 146 const u32 id = thread_ids.Get();
146 Fiber::YieldTo(thread_fibers[id].get(), fiber1.get()); 147 Fiber::YieldTo(thread_fibers[id], fiber1);
147 } 148 }
148 149
149 void CallFiber2() { 150 void CallFiber2() {
150 const u32 id = thread_ids.Get(); 151 const u32 id = thread_ids.Get();
151 Fiber::YieldTo(thread_fibers[id].get(), fiber2.get()); 152 Fiber::YieldTo(thread_fibers[id], fiber2);
152 } 153 }
153 154
154 void Exit(); 155 void Exit();
@@ -184,7 +185,8 @@ static void WorkControl2_3(void* control) {
184 185
185void TestControl2::ExecuteThread(u32 id) { 186void TestControl2::ExecuteThread(u32 id) {
186 thread_ids.Register(id); 187 thread_ids.Register(id);
187 thread_fibers[id] = Fiber::ThreadToFiber(); 188 auto thread_fiber = Fiber::ThreadToFiber();
189 thread_fibers[id] = thread_fiber;
188} 190}
189 191
190void TestControl2::Exit() { 192void TestControl2::Exit() {
@@ -239,23 +241,23 @@ public:
239 241
240 void DoWork1() { 242 void DoWork1() {
241 value1 += 1; 243 value1 += 1;
242 Fiber::YieldTo(fiber1.get(), fiber2.get()); 244 Fiber::YieldTo(fiber1, fiber2);
243 const u32 id = thread_ids.Get(); 245 const u32 id = thread_ids.Get();
244 value3 += 1; 246 value3 += 1;
245 Fiber::YieldTo(fiber1.get(), thread_fibers[id].get()); 247 Fiber::YieldTo(fiber1, thread_fibers[id]);
246 } 248 }
247 249
248 void DoWork2() { 250 void DoWork2() {
249 value2 += 1; 251 value2 += 1;
250 const u32 id = thread_ids.Get(); 252 const u32 id = thread_ids.Get();
251 Fiber::YieldTo(fiber2.get(), thread_fibers[id].get()); 253 Fiber::YieldTo(fiber2, thread_fibers[id]);
252 } 254 }
253 255
254 void ExecuteThread(u32 id); 256 void ExecuteThread(u32 id);
255 257
256 void CallFiber1() { 258 void CallFiber1() {
257 const u32 id = thread_ids.Get(); 259 const u32 id = thread_ids.Get();
258 Fiber::YieldTo(thread_fibers[id].get(), fiber1.get()); 260 Fiber::YieldTo(thread_fibers[id], fiber1);
259 } 261 }
260 262
261 void Exit(); 263 void Exit();
@@ -264,7 +266,7 @@ public:
264 u32 value2{}; 266 u32 value2{};
265 u32 value3{}; 267 u32 value3{};
266 ThreadIds thread_ids; 268 ThreadIds thread_ids;
267 std::vector<std::unique_ptr<Common::Fiber>> thread_fibers; 269 std::vector<std::shared_ptr<Common::Fiber>> thread_fibers;
268 std::shared_ptr<Common::Fiber> fiber1; 270 std::shared_ptr<Common::Fiber> fiber1;
269 std::shared_ptr<Common::Fiber> fiber2; 271 std::shared_ptr<Common::Fiber> fiber2;
270}; 272};
@@ -281,7 +283,8 @@ static void WorkControl3_2(void* control) {
281 283
282void TestControl3::ExecuteThread(u32 id) { 284void TestControl3::ExecuteThread(u32 id) {
283 thread_ids.Register(id); 285 thread_ids.Register(id);
284 thread_fibers[id] = Fiber::ThreadToFiber(); 286 auto thread_fiber = Fiber::ThreadToFiber();
287 thread_fibers[id] = thread_fiber;
285} 288}
286 289
287void TestControl3::Exit() { 290void TestControl3::Exit() {
@@ -329,7 +332,7 @@ public:
329 332
330 void Execute() { 333 void Execute() {
331 thread_fiber = Fiber::ThreadToFiber(); 334 thread_fiber = Fiber::ThreadToFiber();
332 Fiber::YieldTo(thread_fiber.get(), fiber1.get()); 335 Fiber::YieldTo(thread_fiber, fiber1);
333 thread_fiber->Exit(); 336 thread_fiber->Exit();
334 } 337 }
335 338
@@ -337,7 +340,7 @@ public:
337 fiber1->SetRewindPoint(std::function<void(void*)>{WorkControl4}, this); 340 fiber1->SetRewindPoint(std::function<void(void*)>{WorkControl4}, this);
338 if (rewinded) { 341 if (rewinded) {
339 goal_reached = true; 342 goal_reached = true;
340 Fiber::YieldTo(fiber1.get(), thread_fiber.get()); 343 Fiber::YieldTo(fiber1, thread_fiber);
341 } 344 }
342 rewinded = true; 345 rewinded = true;
343 fiber1->Rewind(); 346 fiber1->Rewind();