18 #include <glog/logging.h> 33 static const uint64_t kMagic8Bytes = 0xfaceb00cfaceb00c;
35 std::thread::id localThreadId() {
36 return std::this_thread::get_id();
40 static size_t nonMagicInBytes(
unsigned char* stackLimit,
size_t stackSize) {
41 CHECK_EQ(reinterpret_cast<intptr_t>(stackLimit) %
sizeof(
uint64_t), 0u);
42 CHECK_EQ(stackSize %
sizeof(
uint64_t), 0u);
46 auto firstNonMagic = std::find_if(
47 begin, end, [](
uint64_t val) {
return val != kMagic8Bytes; });
49 return (end - firstNonMagic) *
sizeof(
uint64_t);
81 #ifndef FOLLY_SANITIZE_ADDRESS 100 (void)recordStackUsed;
105 #ifdef FOLLY_SANITIZE_ADDRESS 106 if (asanFakeStack_ !=
nullptr) {
117 #ifndef FOLLY_SANITIZE_ADDRESS 119 auto currentPosition =
static_cast<size_t>(
121 static_cast<unsigned char*
>(
static_cast<void*
>(&stackDummy)));
124 VLOG(4) <<
"Stack usage: " << currentPosition;
129 #ifdef FOLLY_SANITIZE_ADDRESS 131 nullptr, &asanMainStackBase_, &asanMainStackSize_);
152 std::current_exception(),
"running Fiber func_/resultFunc_");
163 <<
"Fiber stack overflow";
173 auto preemptImpl = [&]()
mutable {
177 DCHECK(!std::current_exception());
237 return new char[
size];
241 delete[]
reinterpret_cast<char*
>(
buffer);
std::vector< uint8_t > buffer(kBufferSize+16)
static void freeHeapBuffer(void *buffer)
void(* dataDestructor_)(void *)
void deactivateFiber(Fiber *fiber)
void ensureLoopScheduled()
size_t stackHighWatermark_
void deallocate(unsigned char *limit, size_t size)
unsigned char * fiberStackLimit_
FiberTailQueue readyFibers_
std::aligned_storage< kBufferSize >::type buffer_
const std::type_info * dataType_
auto begin(TestAdlIterable &instance)
—— Concurrent Priority Queue Implementation ——
bool stackFilledWithMagic_
virtual void run(folly::Function< void()> func)=0
static void * allocateHeapBuffer(size_t size)
folly::Function< void()> resultFunc_
virtual void runnable(uintptr_t id) noexcept=0
Fiber(const Fiber &)=delete
static constexpr size_t kBufferSize
Single-threaded task execution engine.
constexpr auto size(C const &c) -> decltype(c.size())
InlineFunctionRunner * preemptRunner_
auto end(TestAdlIterable &instance)
void recordStackPosition()
void remoteReadyInsert(Fiber *fiber)
void preempt(State state)
void init(bool recordStackUsed)
ExecutionObserver * observer_
FiberManager & fiberManager_
folly::Function< void()> func_
folly::Function< void()> finallyFunc_
std::thread::id threadId_
ExceptionCallback exceptionCallback_
GlobalFiberTailQueue allFibers_
void(* dataCopyConstructor_)(void *, const void *)
GuardPageAllocator stackAllocator_
LocalData & operator=(const LocalData &other)