Lines Matching defs:co

53 static inline void CoStackCheck(CoRoutine* co)
55 if (unlikely(co->stkMem.magic != STACK_MAGIC)) {
56 FFRT_LOGE("sp offset:%p.\n", co->stkMem.stk +
57 co->stkMem.size - co->ctx.regs[FFRT_REG_SP]);
221 static inline void CoExit(CoRoutine* co, bool isNormalTask)
225 SwitchTsdToThread(co->task);
228 CoStackCheck(co);
229 CoSwitch(&co->ctx, &co->thEnv->schCtx);
234 CoRoutine* co = reinterpret_cast<CoRoutine*>(arg);
235 ffrt::CPUEUTask* task = co->task;
257 co->status.store(static_cast<int>(CoStatus::CO_UNINITIALIZED));
258 CoExit(co, isNormalTask);
261 static void CoSetStackProt(CoRoutine* co, int prot)
267 uint64_t mp = reinterpret_cast<uint64_t>(co->stkMem.stk);
279 CoRoutine* co = nullptr;
281 co = ffrt::CoRoutineAllocMem(stackSize);
283 co = static_cast<CoRoutine*>(mmap(nullptr, stackSize,
285 if (co == reinterpret_cast<CoRoutine*>(MAP_FAILED)) {
290 if (!co) {
294 co->allocatedSize = stackSize;
295 co->stkMem.size = static_cast<uint64_t>(stackSize - sizeof(CoRoutine) + 8);
296 co->stkMem.magic = STACK_MAGIC;
298 CoSetStackProt(co, PROT_READ);
300 co->status.store(static_cast<int>(CoStatus::CO_UNINITIALIZED));
301 return co;
304 static inline void CoMemFree(CoRoutine* co)
307 CoSetStackProt(co, PROT_WRITE | PROT_READ);
310 if (likely(co->allocatedSize == defaultStackSize)) {
311 ffrt::CoRoutineFreeMem(co);
313 int ret = munmap(co, co->allocatedSize);
375 FFRT_LOGE("alloc co routine failed");
380 auto co = task->coRoutine;
381 if (co->status.load() == static_cast<int>(CoStatus::CO_UNINITIALIZED)) {
382 co2_init_context(&co->ctx, CoStartEntry, static_cast<void*>(co), co->stkMem.stk, co->stkMem.size);
426 auto co = task->coRoutine;
441 SwitchTsdToTask(co->task);
443 CoSwitch(&co->thEnv->schCtx, &co->ctx);
446 CoStackCheck(co);
449 if (co->isTaskDone) {
451 co->isTaskDone = false;
470 GetCoEnv()->runningCo = co;
478 CoRoutine* co = static_cast<CoRoutine*>(GetCoEnv()->runningCo);
479 co->status.store(static_cast<int>(CoStatus::CO_NOT_FINISH));
481 CoSwitchOutTransaction(co->task);
482 if (co->task->type == ffrt_normal_task) {
483 co->task->UpdateState(ffrt::TaskState::BLOCKED);
485 FFRT_BLOCK_MARKER(co->task->gid);
487 SwitchTsdToThread(co->task);
489 CoStackCheck(co);
490 CoSwitch(&co->ctx, &GetCoEnv()->schCtx);
498 co->status.store(static_cast<int>(CoStatus::CO_NOT_FINISH)); // recovery to old state
499 CoExit(co, co->task->type == ffrt_normal_task);