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