基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. *Copyright 2017~2020 lanzhengpeng
  3. *
  4. *Licensed under the Apache License, Version 2.0 (the "License");
  5. *you may not use this file except in compliance with the License.
  6. *You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. *Unless required by applicable law or agreed to in writing, software
  11. *distributed under the License is distributed on an "AS IS" BASIS,
  12. *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. *See the License for the specific language governing permissions and
  14. *limitations under the License.
  15. */
  16. #pragma once
  17. #include <cstdint>
  18. #include <cstddef>
  19. #include <type_traits>
  20. #include <atomic>
  21. #include <chrono>
  22. #include <array>
  23. #include <vector>
  24. #include <deque>
  25. #include <mutex>
  26. #include <map>
  27. #include <list>
  28. #include <any>
  29. #include <unordered_map>
  30. #include <functional>
  31. #include <optional>
  32. #include <thread>
  33. #include <cassert>
  34. #include <utility>
  35. #if __cpp_impl_coroutine
  36. #include <coroutine>
  37. #ifdef _MSC_VER
  38. #ifndef __clang__
  39. extern "C" size_t _coro_frame_size();
  40. extern "C" void* _coro_frame_ptr();
  41. extern "C" void _coro_init_block();
  42. extern "C" void* _coro_resume_addr();
  43. extern "C" void _coro_init_frame(void*);
  44. extern "C" void _coro_save(size_t);
  45. extern "C" void _coro_suspend(size_t);
  46. extern "C" void _coro_cancel();
  47. extern "C" void _coro_resume_block();
  48. #pragma intrinsic(_coro_frame_size)
  49. #pragma intrinsic(_coro_frame_ptr)
  50. #pragma intrinsic(_coro_init_block)
  51. #pragma intrinsic(_coro_resume_addr)
  52. #pragma intrinsic(_coro_init_frame)
  53. #pragma intrinsic(_coro_save)
  54. #pragma intrinsic(_coro_suspend)
  55. #pragma intrinsic(_coro_cancel)
  56. #pragma intrinsic(_coro_resume_block)
  57. #else
  58. #include "src/unix/clang_builtin.h"
  59. #endif
  60. #endif
  61. #elif defined(__clang__)
  62. #include "src/unix/coroutine.h"
  63. #elif __has_include(<experimental/coroutine>)
  64. #include <experimental/coroutine>
  65. #else
  66. #include "src/unix/coroutine.h"
  67. #endif
  68. #include "src/stop_token.h"
  69. #include "src/config.h"
  70. #if RESUMEF_DEBUG_COUNTER
  71. #include <iostream>
  72. #endif
  73. #include "src/def.h"
  74. #include "src/macro_def.inl"
  75. #include "src/exception.inl"
  76. #include "src/counted_ptr.h"
  77. #include "src/type_traits.inl"
  78. #include "src/type_concept.inl"
  79. #include "src/spinlock.h"
  80. #include "src/state.h"
  81. #include "src/future.h"
  82. #include "src/promise.h"
  83. #include "src/awaitable.h"
  84. #include "src/generator.h"
  85. #include "src/rf_task.h"
  86. #include "src/timer.h"
  87. #include "src/scheduler.h"
  88. #include "src/promise.inl"
  89. #include "src/state.inl"
  90. #include "src/switch_scheduler.h"
  91. #include "src/current_scheduler.h"
  92. #include "src/yield.h"
  93. #include "src/sleep.h"
  94. #include "src/when.h"
  95. #include "src/_awaker.h"
  96. #include "src/ring_queue.h"
  97. #include "src/intrusive_link_queue.h"
  98. #include "src/channel.h"
  99. #include "src/event.h"
  100. #include "src/mutex.h"
  101. namespace resumef = librf;