fase 4+5: fibers cooperatius substitueixen el game thread, sense mutex ni cv
This commit is contained in:
36
source/core/system/fiber.hpp
Normal file
36
source/core/system/fiber.hpp
Normal file
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
// Fiber minimalista sobre el suport natiu del SO (ucontext_t en POSIX,
|
||||
// Fibers API en Windows). Serveix per a implementar un yield/resume
|
||||
// cooperatiu entre el Director i el codi del joc sense un std::thread
|
||||
// ni mutex/condition_variable. Substituïx el bloqueig de publishFrame/
|
||||
// consumeFrame amb un mecanisme de control explícit.
|
||||
//
|
||||
// Contracte:
|
||||
// - GameFiber::init(entry) prepara un fiber que executarà `entry`
|
||||
// en un stack dedicat. No el comença a executar encara.
|
||||
// - GameFiber::resume() cedeix el control al fiber. Retorna quan el
|
||||
// fiber crida GameFiber::yield() o quan la funció entry retorna.
|
||||
// - GameFiber::yield() es crida des de dins del fiber per a tornar
|
||||
// el control al main (al punt just després de resume()).
|
||||
// - GameFiber::is_done() indica si la funció entry ha retornat.
|
||||
// - GameFiber::destroy() allibera el stack i reinicia l'estat.
|
||||
//
|
||||
// Per al port a emscripten (Fase 7) caldrà substituir aquesta capa per
|
||||
// Asyncify, però el contracte públic pot romandre idèntic.
|
||||
namespace GameFiber {
|
||||
|
||||
using EntryFn = void (*)();
|
||||
|
||||
void init(EntryFn entry, std::size_t stack_size = 256 * 1024);
|
||||
void destroy();
|
||||
|
||||
void resume();
|
||||
void yield();
|
||||
|
||||
bool is_done();
|
||||
bool is_initialized();
|
||||
|
||||
} // namespace GameFiber
|
||||
Reference in New Issue
Block a user