Lines Matching refs:co
49 static inline void CoStackCheck(CoRoutine* co) in CoStackCheck() argument
51 if (unlikely(co->stkMem.magic != STACK_MAGIC)) { in CoStackCheck()
52 FFRT_LOGE("sp offset:%p.\n", co->stkMem.stk + in CoStackCheck()
53 co->stkMem.size - co->ctx.regs[REG_SP]); in CoStackCheck()
213 static inline void CoExit(CoRoutine* co, bool isNormalTask) in CoExit() argument
217 SwitchTsdToThread(co->task); in CoExit()
220 CoStackCheck(co); in CoExit()
221 CoSwitch(&co->ctx, &co->thEnv->schCtx); in CoExit()
226 CoRoutine* co = reinterpret_cast<CoRoutine*>(arg); in CoStartEntry() local
227 ffrt::CPUEUTask* task = co->task; in CoStartEntry()
249 co->status.store(static_cast<int>(CoStatus::CO_UNINITIALIZED)); in CoStartEntry()
250 CoExit(co, isNormalTask); in CoStartEntry()
253 static void CoSetStackProt(CoRoutine* co, int prot) in CoSetStackProt() argument
259 uint64_t mp = reinterpret_cast<uint64_t>(co->stkMem.stk); in CoSetStackProt()
270 CoRoutine* co = nullptr; in AllocNewCoRoutine() local
272 co = ffrt::CoRoutineAllocMem(stackSize); in AllocNewCoRoutine()
274 co = static_cast<CoRoutine*>(mmap(nullptr, stackSize, in AllocNewCoRoutine()
276 if (co == reinterpret_cast<CoRoutine*>(MAP_FAILED)) { in AllocNewCoRoutine()
281 if (!co) { in AllocNewCoRoutine()
285 co->allocatedSize = stackSize; in AllocNewCoRoutine()
286 co->stkMem.size = static_cast<uint64_t>(stackSize - sizeof(CoRoutine) + 8); in AllocNewCoRoutine()
287 co->stkMem.magic = STACK_MAGIC; in AllocNewCoRoutine()
289 CoSetStackProt(co, PROT_READ); in AllocNewCoRoutine()
291 co->status.store(static_cast<int>(CoStatus::CO_UNINITIALIZED)); in AllocNewCoRoutine()
292 return co; in AllocNewCoRoutine()
295 static inline void CoMemFree(CoRoutine* co) in CoMemFree() argument
298 CoSetStackProt(co, PROT_WRITE | PROT_READ); in CoMemFree()
301 if (likely(co->allocatedSize == defaultStackSize)) { in CoMemFree()
302 ffrt::CoRoutineFreeMem(co); in CoMemFree()
304 int ret = munmap(co, co->allocatedSize); in CoMemFree()
367 auto co = task->coRoutine; in CoCreat() local
368 if (co->status.load() == static_cast<int>(CoStatus::CO_UNINITIALIZED)) { in CoCreat()
369 … co2_init_context(&co->ctx, CoStartEntry, static_cast<void*>(co), co->stkMem.stk, co->stkMem.size); in CoCreat()
407 auto co = task->coRoutine; in CoStart() local
422 SwitchTsdToTask(co->task); in CoStart()
424 CoSwitch(&co->thEnv->schCtx, &co->ctx); in CoStart()
427 CoStackCheck(co); in CoStart()
430 if (co->isTaskDone) { in CoStart()
432 co->isTaskDone = false; in CoStart()
451 coRoutineEnv->runningCo = co; in CoStart()
459 CoRoutine* co = static_cast<CoRoutine*>(GetCoEnv()->runningCo); in CoYield() local
460 co->status.store(static_cast<int>(CoStatus::CO_NOT_FINISH)); in CoYield()
462 CoSwitchOutTransaction(co->task); in CoYield()
463 if (co->task->type == ffrt_normal_task) { in CoYield()
464 co->task->UpdateState(ffrt::TaskState::BLOCKED); in CoYield()
466 FFRT_BLOCK_MARKER(co->task->gid); in CoYield()
468 SwitchTsdToThread(co->task); in CoYield()
470 CoStackCheck(co); in CoYield()
471 CoSwitch(&co->ctx, &GetCoEnv()->schCtx); in CoYield()
479 co->status.store(static_cast<int>(CoStatus::CO_NOT_FINISH)); // recovery to old state in CoYield()
480 CoExit(co, co->task->type == ffrt_normal_task); in CoYield()