Skip to content

Commit 9212bfc

Browse files
committed
使用宏来开关是否支持多线程多调度器
1 parent 475482c commit 9212bfc

File tree

10 files changed

+90
-65
lines changed

10 files changed

+90
-65
lines changed

librf/src/channel.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace resumef
99
template<class _Ty>
1010
struct channel_impl : public std::enable_shared_from_this<channel_impl<_Ty>>
1111
{
12-
typedef _awaker<channel_impl<_Ty>, _Ty *, future_error> channel_read_awaker;
12+
typedef _awaker<channel_impl<_Ty>, _Ty *, error_code> channel_read_awaker;
1313
typedef std::shared_ptr<channel_read_awaker> channel_read_awaker_ptr;
1414

1515
typedef _awaker<channel_impl<_Ty>> channel_write_awaker;
@@ -63,7 +63,7 @@ namespace resumef
6363
auto val = std::move(_values.front());
6464
_values.pop_front();
6565

66-
r_awaker->awake(this, 1, &val, future_error::none);
66+
r_awaker->awake(this, 1, &val, error_code::none);
6767
ret_value = true;
6868
}
6969
else
@@ -111,7 +111,7 @@ namespace resumef
111111
auto r_awaker = *iter;
112112
iter = _read_awakes.erase(iter);
113113

114-
if (r_awaker->awake(this, 1, _values.size() ? &_values.front() : nullptr, future_error::read_before_write))
114+
if (r_awaker->awake(this, 1, _values.size() ? &_values.front() : nullptr, error_code::read_before_write))
115115
{
116116
if(_values.size()) _values.pop_front();
117117

@@ -186,7 +186,7 @@ namespace resumef
186186
awaitable_t<_Ty> awaitable;
187187

188188
auto awaker = std::make_shared<channel_read_awaker>(
189-
[st = awaitable._state](channel_impl_type *, _Ty * val, future_error fe) -> bool
189+
[st = awaitable._state](channel_impl_type *, _Ty * val, error_code fe) -> bool
190190
{
191191
if(val)
192192
st->set_value(std::move(*val));

librf/src/def.h

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ namespace resumef
6464

6565
#define _coro_promise_ptr(T) _coro_promise_ptr__<resumef::promise_t<T> >(_coro_frame_ptr())
6666

67-
enum struct future_error
67+
enum struct error_code
6868
{
6969
none,
7070
not_ready, // get_value called when value not available
@@ -75,13 +75,13 @@ namespace resumef
7575
max__
7676
};
7777

78-
const char * get_error_string(future_error fe, const char * classname);
78+
const char * get_error_string(error_code fe, const char * classname);
7979
//const char * future_error_string[size_t(future_error::max__)];
8080

8181
struct future_exception : std::exception
8282
{
83-
future_error _error;
84-
future_exception(future_error fe)
83+
error_code _error;
84+
future_exception(error_code fe)
8585
: exception(get_error_string(fe, "future_exception"))
8686
, _error(fe)
8787
{
@@ -90,8 +90,8 @@ namespace resumef
9090

9191
struct lock_exception : std::exception
9292
{
93-
future_error _error;
94-
lock_exception(future_error fe)
93+
error_code _error;
94+
lock_exception(error_code fe)
9595
: exception(get_error_string(fe, "lock_exception"))
9696
, _error(fe)
9797
{
@@ -100,8 +100,8 @@ namespace resumef
100100

101101
struct channel_exception : std::exception
102102
{
103-
future_error _error;
104-
channel_exception(future_error fe)
103+
error_code _error;
104+
channel_exception(error_code fe)
105105
: exception(get_error_string(fe, "channel_exception"))
106106
, _error(fe)
107107
{
@@ -112,14 +112,7 @@ namespace resumef
112112
struct state_base;
113113

114114
//获得当前线程下的调度器
115-
extern scheduler * this_scheduler();
116-
//获得当前线程下,正在由调度器调度的协程
117-
//extern state_base * this_coroutine();
118-
119-
//namespace detail
120-
//{
121-
// extern state_base * current_coroutine();
122-
//}
115+
scheduler * this_scheduler();
123116
}
124117

125118
#define co_yield_void co_yield nullptr

librf/src/future.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,25 @@ namespace resumef
155155
promise_impl_t()
156156
: _state(make_counted<state_type>())
157157
{
158+
#if RESUMEF_ENABLE_MULT_SCHEDULER
158159
_state->this_promise(this);
160+
#endif
159161
}
160162
promise_impl_t(promise_impl_t&& _Right)
161163
: _state(std::move(_Right._state))
162164
{
165+
#if RESUMEF_ENABLE_MULT_SCHEDULER
163166
_state->this_promise(this);
167+
#endif
164168
}
165169
promise_impl_t & operator = (promise_impl_t&& _Right)
166170
{
167171
if (this != _Right)
168172
{
169173
_state = std::move(_Right._state);
174+
#if RESUMEF_ENABLE_MULT_SCHEDULER
170175
_state->this_promise(this);
176+
#endif
171177
}
172178
return *this;
173179
}
@@ -326,21 +332,21 @@ namespace resumef
326332

327333
using awaitable_vt = awaitable_t<void>;
328334

335+
#if RESUMEF_ENABLE_MULT_SCHEDULER
329336
inline promise_t<void> * state_base::parent_promise() const
330337
{
331338
if (_coro) return _coro_promise_ptr__<promise_t<void>>(_coro.address());
332339
return nullptr;
333340
}
334341

335-
/*
336342
inline scheduler * state_base::parent_scheduler() const
337343
{
338344
auto promise_ = parent_promise();
339345
if (promise_)
340346
return promise_->_state->current_scheduler();
341347
return nullptr;
342348
}
343-
*/
349+
#endif
344350

345351
}
346352

librf/src/rf_task.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ namespace resumef
1919
virtual bool go_next(scheduler *) = 0;
2020
virtual void cancel() = 0;
2121
virtual void * get_id() = 0;
22+
#if RESUMEF_ENABLE_MULT_SCHEDULER
2223
virtual void bind(scheduler *) = 0;
24+
#endif
2325
};
2426

2527
//----------------------------------------------------------------------------------------------
@@ -76,10 +78,12 @@ namespace resumef
7678
{
7779
return nullptr;
7880
}
81+
#if RESUMEF_ENABLE_MULT_SCHEDULER
7982
virtual void bind(scheduler *) override
8083
{
8184

8285
}
86+
#endif
8387
};
8488

8589
template<class _Ty>
@@ -128,11 +132,13 @@ namespace resumef
128132
{
129133
return _future._state.get();
130134
}
135+
#if RESUMEF_ENABLE_MULT_SCHEDULER
131136
virtual void bind(scheduler * schdler) override
132137
{
133138
auto * _state = _future._state.get();
134139
_state->current_scheduler(schdler);
135140
}
141+
#endif
136142
};
137143

138144
//----------------------------------------------------------------------------------------------

librf/src/scheduler.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ std::atomic<intptr_t> g_resumef_evtctx_count = 0;
1111
namespace resumef
1212
{
1313

14-
static const char * future_error_string[(size_t)future_error::max__]
14+
static const char * future_error_string[(size_t)error_code::max__]
1515
{
1616
"none",
1717
"not_ready",
@@ -22,7 +22,7 @@ namespace resumef
2222

2323
static char sz_future_error_buffer[256];
2424

25-
const char * get_error_string(future_error fe, const char * classname)
25+
const char * get_error_string(error_code fe, const char * classname)
2626
{
2727
if (classname)
2828
{
@@ -32,41 +32,34 @@ namespace resumef
3232
return future_error_string[(size_t)(fe)];
3333
}
3434

35+
#if RESUMEF_ENABLE_MULT_SCHEDULER
3536
thread_local scheduler * th_scheduler_ptr = nullptr;
3637

3738
//获得当前线程下的调度器
3839
scheduler * this_scheduler()
3940
{
4041
return th_scheduler_ptr ? th_scheduler_ptr : &scheduler::g_scheduler;
4142
}
43+
#endif
4244

43-
//获得当前线程下,正在由调度器调度的协程
44-
/*
45-
namespace detail
46-
{
47-
state_base * current_coroutine()
48-
{
49-
scheduler * schdler = this_scheduler();
50-
if (schdler->current_state)
51-
return schdler->current_state;
52-
return schdler->top_state();
53-
}
54-
}
55-
*/
5645
local_scheduler::local_scheduler()
5746
{
47+
#if RESUMEF_ENABLE_MULT_SCHEDULER
5848
if (th_scheduler_ptr == nullptr)
5949
{
6050
_scheduler_ptr = new scheduler;
6151
th_scheduler_ptr = _scheduler_ptr;
6252
}
53+
#endif
6354
}
6455

6556
local_scheduler::~local_scheduler()
6657
{
58+
#if RESUMEF_ENABLE_MULT_SCHEDULER
6759
if (th_scheduler_ptr == _scheduler_ptr)
6860
th_scheduler_ptr = nullptr;
6961
delete _scheduler_ptr;
62+
#endif
7063
}
7164

7265
scheduler::scheduler()
@@ -79,17 +72,20 @@ namespace resumef
7972
scheduler::~scheduler()
8073
{
8174
cancel_all_task_();
82-
75+
#if RESUMEF_ENABLE_MULT_SCHEDULER
8376
if (th_scheduler_ptr == this)
8477
th_scheduler_ptr = nullptr;
78+
#endif
8579
}
8680

8781
void scheduler::new_task(task_base * task)
8882
{
8983
if (task)
9084
{
9185
scoped_lock<std::recursive_mutex> __guard(_mtx_ready);
86+
#if RESUMEF_ENABLE_MULT_SCHEDULER
9287
task->bind(this);
88+
#endif
9389
this->_ready_task.push_back(task);
9490
}
9591
}
@@ -126,9 +122,10 @@ namespace resumef
126122

127123
void scheduler::run_one_batch()
128124
{
125+
#if RESUMEF_ENABLE_MULT_SCHEDULER
129126
if (th_scheduler_ptr == nullptr)
130127
th_scheduler_ptr = this;
131-
128+
#endif
132129
{
133130
scoped_lock<std::recursive_mutex> __guard(_mtx_task);
134131

librf/src/scheduler.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,19 @@ namespace resumef
8686
local_scheduler & operator = (local_scheduler && right_) = delete;
8787
local_scheduler(const local_scheduler &) = delete;
8888
local_scheduler & operator = (const local_scheduler &) = delete;
89+
#if RESUMEF_ENABLE_MULT_SCHEDULER
8990
private:
9091
scheduler * _scheduler_ptr;
92+
#endif
9193
};
9294
//--------------------------------------------------------------------------------------------------
95+
#if !RESUMEF_ENABLE_MULT_SCHEDULER
96+
//获得当前线程下的调度器
97+
inline scheduler * this_scheduler()
98+
{
99+
return &scheduler::g_scheduler;
100+
}
101+
#endif
93102

94103
#if !defined(_DISABLE_RESUMEF_GO_MACRO)
95104
#define go (*::resumef::this_scheduler()) +

librf/src/state.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ namespace resumef
3333
{
3434
return _state.get();
3535
}
36+
#if RESUMEF_ENABLE_MULT_SCHEDULER
3637
virtual void bind(scheduler * ) override
3738
{
3839
}
40+
#endif
3941
};
4042

4143
state_base::~state_base()
@@ -52,12 +54,13 @@ namespace resumef
5254

5355
if (_coro)
5456
{
55-
// auto sch_ = this->current_scheduler();
56-
auto sch_ = this_scheduler();
57-
/*
57+
#if RESUMEF_ENABLE_MULT_SCHEDULER
58+
auto sch_ = this->current_scheduler();
5859
if (sch_ == nullptr)
5960
sch_ = this_scheduler();
60-
*/
61+
#else
62+
auto sch_ = this_scheduler();
63+
#endif
6164
sch_->push_task_internal(new awaitable_task_t<state_base>(this));
6265
}
6366
}
@@ -72,12 +75,13 @@ namespace resumef
7275

7376
if (_coro)
7477
{
75-
// auto sch_ = this->current_scheduler();
76-
auto sch_ = this_scheduler();
77-
/*
78+
#if RESUMEF_ENABLE_MULT_SCHEDULER
79+
auto sch_ = this->current_scheduler();
7880
if (sch_ == nullptr)
7981
sch_ = this_scheduler();
80-
*/
82+
#else
83+
auto sch_ = this_scheduler();
84+
#endif
8185
sch_->push_task_internal(new awaitable_task_t<state_base>(this));
8286
}
8387
}
@@ -88,7 +92,7 @@ namespace resumef
8892

8993
_coro = resume_cb;
9094

91-
/*
95+
#if RESUMEF_ENABLE_MULT_SCHEDULER
9296
if (_current_scheduler == nullptr)
9397
{
9498
auto * promise_ = this->parent_promise();
@@ -107,19 +111,19 @@ namespace resumef
107111
stptr->current_scheduler(_current_scheduler);
108112
_depend_states.clear();
109113
}
110-
*/
114+
#endif
111115
}
112116

117+
#if RESUMEF_ENABLE_MULT_SCHEDULER
113118
void state_base::current_scheduler(scheduler * sch_)
114119
{
115-
/*
116120
scoped_lock<lock_type> __guard(_mtx);
117121

118122
_current_scheduler = sch_;
119123

120124
for (auto & stptr : _depend_states)
121125
stptr->current_scheduler(sch_);
122126
_depend_states.clear();
123-
*/
124127
}
128+
#endif
125129
}

0 commit comments

Comments
 (0)