-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcoroutine.cpp
43 lines (35 loc) · 915 Bytes
/
coroutine.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "coroutine.h"
#include "schedule.h"
#include <assert.h>
#include <string.h>
#include <stdlib.h>
namespace coroutine {
Coroutine::Coroutine(const CoroutineFunc& func, int id_arg)
: func_(func),
id_(id_arg),
state_(kReady),
stack_(NULL),
capacity_(0),
size_(0) {
}
Coroutine::~Coroutine() {
assert(state_ == kDead);
}
void Coroutine::start(Schedule* schedule) {
if (func_) {
setState(kRunning);
func_(schedule);
}
}
void Coroutine::saveStack(char* top) {
char dummy = 0;
assert(top - &dummy <= static_cast<ptrdiff_t>(Schedule::kStackSize));
if (capacity_ < top - &dummy) {
::free(stack_);
capacity_ = top - &dummy;
stack_ = static_cast<char*>(::malloc(static_cast<size_t>(capacity_)));
}
size_ = top - &dummy;
memcpy(stack_, &dummy, static_cast<size_t>(size_));
}
} // namespace coroutine