37 lines
1.3 KiB
C++
37 lines
1.3 KiB
C++
#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
|