ソースを参照

clang的一个bug导致when_all/any代码可能编译失败。

不得已更换切换调度器的写法。
tags/v2.9.7
tearshark 4年前
コミット
a31da60a94
2個のファイルの変更17行の追加5行の削除
  1. 13
    1
      librf/src/switch_scheduler.h
  2. 4
    4
      tutorial/test_async_switch_scheduler.cpp

+ 13
- 1
librf/src/switch_scheduler.h ファイルの表示

@@ -33,8 +33,20 @@ RESUMEF_NS
scheduler_t* _scheduler;
};

inline switch_scheduler_awaitor operator co_await(scheduler_t& sch)
//由于跟when_all/when_any混用的时候,在clang上编译失败:
//clang把scheduler_t判断成一个is_awaitable,且放弃选择when_all/any(scheduler_t& sch, ...)版本
//故放弃这种用法
//inline switch_scheduler_awaitor operator co_await(scheduler_t& sch) noexcept
//{
// return { &sch };
//}
inline switch_scheduler_awaitor via(scheduler_t& sch) noexcept
{
return { &sch };
}
inline switch_scheduler_awaitor via(scheduler_t* sch) noexcept
{
return { sch };
}

}

+ 4
- 4
tutorial/test_async_switch_scheduler.cpp ファイルの表示

@@ -59,28 +59,28 @@ static future_t<> resumable_get_long_switch_scheduler(int64_t val, channel_t<boo
std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl;

co_await *sch_in_thread;
co_await via(sch_in_thread);
val = co_await async_get_long_switch_scheduler(val);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl;

co_await *sch_in_main;
co_await via(sch_in_main);
val = co_await async_get_long_switch_scheduler(val);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl;

co_await *sch_in_thread;
co_await via(sch_in_thread);
val = co_await async_get_long_switch_scheduler(val);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl;

co_await *sch_in_thread; //fake switch
co_await via(sch_in_thread); //fake switch
val = co_await async_get_long_switch_scheduler(val);

std::cout << "thread = " << std::this_thread::get_id();

読み込み中…
キャンセル
保存