|
|
|
@ -67,7 +67,7 @@ void TestControl1::DoWork() {
|
|
|
|
|
value++;
|
|
|
|
|
}
|
|
|
|
|
results[id] = value;
|
|
|
|
|
Fiber::YieldTo(work_fibers[id], thread_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(work_fibers[id], *thread_fibers[id]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestControl1::ExecuteThread(u32 id) {
|
|
|
|
@ -76,7 +76,7 @@ void TestControl1::ExecuteThread(u32 id) {
|
|
|
|
|
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], work_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], *work_fibers[id]);
|
|
|
|
|
thread_fibers[id]->Exit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -117,11 +117,11 @@ public:
|
|
|
|
|
for (u32 i = 0; i < 12000; i++) {
|
|
|
|
|
value1 += i;
|
|
|
|
|
}
|
|
|
|
|
Fiber::YieldTo(fiber1, fiber3);
|
|
|
|
|
Fiber::YieldTo(fiber1, *fiber3);
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
assert1 = id == 1;
|
|
|
|
|
value2 += 5000;
|
|
|
|
|
Fiber::YieldTo(fiber1, thread_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(fiber1, *thread_fibers[id]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DoWork2() {
|
|
|
|
@ -129,7 +129,7 @@ public:
|
|
|
|
|
;
|
|
|
|
|
value2 = 2000;
|
|
|
|
|
trap = false;
|
|
|
|
|
Fiber::YieldTo(fiber2, fiber1);
|
|
|
|
|
Fiber::YieldTo(fiber2, *fiber1);
|
|
|
|
|
assert3 = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -137,19 +137,19 @@ public:
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
assert2 = id == 0;
|
|
|
|
|
value1 += 1000;
|
|
|
|
|
Fiber::YieldTo(fiber3, thread_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(fiber3, *thread_fibers[id]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ExecuteThread(u32 id);
|
|
|
|
|
|
|
|
|
|
void CallFiber1() {
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber1);
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], *fiber1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CallFiber2() {
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber2);
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], *fiber2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Exit();
|
|
|
|
@ -241,23 +241,23 @@ public:
|
|
|
|
|
|
|
|
|
|
void DoWork1() {
|
|
|
|
|
value1 += 1;
|
|
|
|
|
Fiber::YieldTo(fiber1, fiber2);
|
|
|
|
|
Fiber::YieldTo(fiber1, *fiber2);
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
value3 += 1;
|
|
|
|
|
Fiber::YieldTo(fiber1, thread_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(fiber1, *thread_fibers[id]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DoWork2() {
|
|
|
|
|
value2 += 1;
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
Fiber::YieldTo(fiber2, thread_fibers[id]);
|
|
|
|
|
Fiber::YieldTo(fiber2, *thread_fibers[id]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ExecuteThread(u32 id);
|
|
|
|
|
|
|
|
|
|
void CallFiber1() {
|
|
|
|
|
const u32 id = thread_ids.Get();
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], fiber1);
|
|
|
|
|
Fiber::YieldTo(thread_fibers[id], *fiber1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Exit();
|
|
|
|
@ -332,7 +332,7 @@ public:
|
|
|
|
|
|
|
|
|
|
void Execute() {
|
|
|
|
|
thread_fiber = Fiber::ThreadToFiber();
|
|
|
|
|
Fiber::YieldTo(thread_fiber, fiber1);
|
|
|
|
|
Fiber::YieldTo(thread_fiber, *fiber1);
|
|
|
|
|
thread_fiber->Exit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -340,7 +340,7 @@ public:
|
|
|
|
|
fiber1->SetRewindPoint(std::function<void(void*)>{WorkControl4}, this);
|
|
|
|
|
if (rewinded) {
|
|
|
|
|
goal_reached = true;
|
|
|
|
|
Fiber::YieldTo(fiber1, thread_fiber);
|
|
|
|
|
Fiber::YieldTo(fiber1, *thread_fiber);
|
|
|
|
|
}
|
|
|
|
|
rewinded = true;
|
|
|
|
|
fiber1->Rewind();
|
|
|
|
|