diff options
Diffstat (limited to 'src/tests/common/fibers.cpp')
| -rw-r--r-- | src/tests/common/fibers.cpp | 39 |
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 | ||
| 73 | void TestControl1::ExecuteThread(u32 id) { | 73 | void 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 | ||
| 185 | void TestControl2::ExecuteThread(u32 id) { | 186 | void 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 | ||
| 190 | void TestControl2::Exit() { | 192 | void 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 | ||
| 282 | void TestControl3::ExecuteThread(u32 id) { | 284 | void 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 | ||
| 287 | void TestControl3::Exit() { | 290 | void 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(); |