|
|
|
@ -67,15 +67,16 @@ void TestControl1::DoWork() { |
|
|
|
value++; |
|
|
|
} |
|
|
|
results[id] = value; |
|
|
|
Fiber::YieldTo(work_fibers[id].get(), thread_fibers[id].get()); |
|
|
|
Fiber::YieldTo(work_fibers[id], thread_fibers[id]); |
|
|
|
} |
|
|
|
|
|
|
|
void TestControl1::ExecuteThread(u32 id) { |
|
|
|
thread_ids.Register(id); |
|
|
|
thread_fibers[id] = Fiber::ThreadToFiber(); |
|
|
|
auto thread_fiber = Fiber::ThreadToFiber(); |
|
|
|
thread_fibers[id] = thread_fiber; |
|
|
|
work_fibers[id] = std::make_shared<Fiber>(std::function<void(void*)>{WorkControl1}, this); |
|
|
|
items[id] = rand() % 256; |
|
|
|
Fiber::YieldTo(thread_fibers[id].get(), work_fibers[id].get()); |
|
|
|
Fiber::YieldTo(thread_fibers[id], work_fibers[id]); |
|
|
|
thread_fibers[id]->Exit(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -116,11 +117,11 @@ public: |
|
|
|
for (u32 i = 0; i < 12000; i++) { |
|
|
|
value1 += i; |
|
|
|
} |
|
|
|
Fiber::YieldTo(fiber1.get(), fiber3.get()); |
|
|
|
Fiber::YieldTo(fiber1, fiber3); |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
assert1 = id == 1; |
|
|
|
value2 += 5000; |
|
|
|
Fiber::YieldTo(fiber1.get(), thread_fibers[id].get()); |
|
|
|
Fiber::YieldTo(fiber1, thread_fibers[id]); |
|
|
|
} |
|
|
|
|
|
|
|
void DoWork2() { |
|
|
|
@ -128,7 +129,7 @@ public: |
|
|
|
; |
|
|
|
value2 = 2000; |
|
|
|
trap = false; |
|
|
|
Fiber::YieldTo(fiber2.get(), fiber1.get()); |
|
|
|
Fiber::YieldTo(fiber2, fiber1); |
|
|
|
assert3 = false; |
|
|
|
} |
|
|
|
|
|
|
|
@ -136,19 +137,19 @@ public: |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
assert2 = id == 0; |
|
|
|
value1 += 1000; |
|
|
|
Fiber::YieldTo(fiber3.get(), thread_fibers[id].get()); |
|
|
|
Fiber::YieldTo(fiber3, thread_fibers[id]); |
|
|
|
} |
|
|
|
|
|
|
|
void ExecuteThread(u32 id); |
|
|
|
|
|
|
|
void CallFiber1() { |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
Fiber::YieldTo(thread_fibers[id].get(), fiber1.get()); |
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber1); |
|
|
|
} |
|
|
|
|
|
|
|
void CallFiber2() { |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
Fiber::YieldTo(thread_fibers[id].get(), fiber2.get()); |
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber2); |
|
|
|
} |
|
|
|
|
|
|
|
void Exit(); |
|
|
|
@ -184,7 +185,8 @@ static void WorkControl2_3(void* control) { |
|
|
|
|
|
|
|
void TestControl2::ExecuteThread(u32 id) { |
|
|
|
thread_ids.Register(id); |
|
|
|
thread_fibers[id] = Fiber::ThreadToFiber(); |
|
|
|
auto thread_fiber = Fiber::ThreadToFiber(); |
|
|
|
thread_fibers[id] = thread_fiber; |
|
|
|
} |
|
|
|
|
|
|
|
void TestControl2::Exit() { |
|
|
|
@ -239,23 +241,23 @@ public: |
|
|
|
|
|
|
|
void DoWork1() { |
|
|
|
value1 += 1; |
|
|
|
Fiber::YieldTo(fiber1.get(), fiber2.get()); |
|
|
|
Fiber::YieldTo(fiber1, fiber2); |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
value3 += 1; |
|
|
|
Fiber::YieldTo(fiber1.get(), thread_fibers[id].get()); |
|
|
|
Fiber::YieldTo(fiber1, thread_fibers[id]); |
|
|
|
} |
|
|
|
|
|
|
|
void DoWork2() { |
|
|
|
value2 += 1; |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
Fiber::YieldTo(fiber2.get(), thread_fibers[id].get()); |
|
|
|
Fiber::YieldTo(fiber2, thread_fibers[id]); |
|
|
|
} |
|
|
|
|
|
|
|
void ExecuteThread(u32 id); |
|
|
|
|
|
|
|
void CallFiber1() { |
|
|
|
const u32 id = thread_ids.Get(); |
|
|
|
Fiber::YieldTo(thread_fibers[id].get(), fiber1.get()); |
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber1); |
|
|
|
} |
|
|
|
|
|
|
|
void Exit(); |
|
|
|
@ -264,7 +266,7 @@ public: |
|
|
|
u32 value2{}; |
|
|
|
u32 value3{}; |
|
|
|
ThreadIds thread_ids; |
|
|
|
std::vector<std::unique_ptr<Common::Fiber>> thread_fibers; |
|
|
|
std::vector<std::shared_ptr<Common::Fiber>> thread_fibers; |
|
|
|
std::shared_ptr<Common::Fiber> fiber1; |
|
|
|
std::shared_ptr<Common::Fiber> fiber2; |
|
|
|
}; |
|
|
|
@ -281,7 +283,8 @@ static void WorkControl3_2(void* control) { |
|
|
|
|
|
|
|
void TestControl3::ExecuteThread(u32 id) { |
|
|
|
thread_ids.Register(id); |
|
|
|
thread_fibers[id] = Fiber::ThreadToFiber(); |
|
|
|
auto thread_fiber = Fiber::ThreadToFiber(); |
|
|
|
thread_fibers[id] = thread_fiber; |
|
|
|
} |
|
|
|
|
|
|
|
void TestControl3::Exit() { |
|
|
|
@ -329,7 +332,7 @@ public: |
|
|
|
|
|
|
|
void Execute() { |
|
|
|
thread_fiber = Fiber::ThreadToFiber(); |
|
|
|
Fiber::YieldTo(thread_fiber.get(), fiber1.get()); |
|
|
|
Fiber::YieldTo(thread_fiber, fiber1); |
|
|
|
thread_fiber->Exit(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -337,7 +340,7 @@ public: |
|
|
|
fiber1->SetRewindPoint(std::function<void(void*)>{WorkControl4}, this); |
|
|
|
if (rewinded) { |
|
|
|
goal_reached = true; |
|
|
|
Fiber::YieldTo(fiber1.get(), thread_fiber.get()); |
|
|
|
Fiber::YieldTo(fiber1, thread_fiber); |
|
|
|
} |
|
|
|
rewinded = true; |
|
|
|
fiber1->Rewind(); |
|
|
|
|