Skip to content

docs: Linux-first first-party README for Helios - #2

Merged
unjordi merged 1 commit into
developfrom
docs/helios-readme-firstparty
Jun 28, 2026
Merged

docs: Linux-first first-party README for Helios#2
unjordi merged 1 commit into
developfrom
docs/helios-readme-firstparty

Conversation

@unjordi

@unjordi unjordi commented Jun 28, 2026

Copy link
Copy Markdown
Owner

Reframes the README around what this fork is for, and gives Helios its own documentation instead of deferring everyone to upstream.

Our own docs (Linux-first):

  • New Quick start (Linux) and Building from source (Linux) sections — verified on Arch/CachyOS (gcc-14, submodules, the exact cmake flags). Replaces the old "Refer to LizardByte's documentation" pointer.
  • Upstream Sunshine docs kept as a reference for not-yet-migrated topics, not the primary doc.

Less Windows-centric:

  • SudoVDA / HDR notes condensed and stated honestly (Windows works today; native Linux/Wayland VD is the flagship WIP).
  • winget / choco install moved into a collapsed "Windows (inherited from Apollo)" block under Downloads instead of being front-and-center.

Also: added a "Focus of this fork" section (links ClassicOldSong#1161/ClassicOldSong#1477/ClassicOldSong#1414/ClassicOldSong#1427), repointed clone/downloads to unjordi/Helios, added Selene to Integrations, and dropped the upstream author's personal disclaimer (not this fork's voice) while keeping clear attribution to ClassicOldSong (Apollo) and LizardByte (Sunshine).

First pass — we'll keep migrating wiki topics into first-party docs over time.

🤖 Generated with Claude Code

Reframe the README around this fork's focus and our own docs instead of
deferring to upstream:
- Add a "Focus of this fork" section (native Linux/Wayland virtual
  display; links ClassicOldSong#1161/ClassicOldSong#1477/ClassicOldSong#1414/ClassicOldSong#1427).
- Add first-party "Quick start (Linux)" and "Building from source
  (Linux)" sections, verified on Arch/CachyOS (gcc-14, cmake flags,
  submodules). Replaces the bare "go read LizardByte's docs" pointer.
- Keep upstream Sunshine docs as a *reference*, not the primary doc.
- De-emphasize Windows: SudoVDA/HDR notes condensed and stated honestly
  (Windows today, Linux WIP); winget/choco moved into a collapsed
  "Windows (inherited from Apollo)" block under Downloads.
- Repoint downloads/clone to unjordi/Helios; add Selene to Integrations.
- Drop the upstream author's personal disclaimer (not this fork's voice);
  keep clear attribution to ClassicOldSong (Apollo) and LizardByte
  (Sunshine).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@unjordi
unjordi merged commit f9d16ec into develop Jun 28, 2026
@unjordi
unjordi deleted the docs/helios-readme-firstparty branch June 28, 2026 21:00
unjordi added a commit that referenced this pull request Jul 28, 2026
`proc_t::terminate()` es alcanzable desde al menos CUATRO hilos sin ninguna
sincronizacion, y recorre `_app_prep_it`, que es estado MIEMBRO:

  - hilo del system tray          (system_tray.cpp:98,137,144,456)
  - hilo HTTPS de la config web   (confighttp.cpp:894,1184,1235)
  - hilo HTTPS de nvhttp, via el endpoint /cancel -> rtsp_stream::terminate_sessions()
  - la ruta de teardown de sesion (process.cpp)

Escenario que se dispara solo: al cerrar el stream, el cliente manda /cancel por
HTTP mientras la ruta de desconexion ya esta terminando la app. Los dos
`terminate()` recorren el mismo cursor -> los undo prep-cmds se ejecutan DOS
VECES y el iterador se pasa de `_app_prep_begin` -> SIGSEGV.

No es una carrera estrecha: el `child.wait()` del bucle es bloqueante, asi que la
ventana dura segundos.

Capturado en vivo (2026-07-28), hilo `nvhttp::47984`:

    #0  proc::proc_t::terminate(bool, bool)        <-- SIGSEGV (SEGV_MAPERR)
    #1  stream::session::join(session_t&)
    #2  rtsp_stream::terminate_sessions()
    #3  nvhttp::cancel(Response, Request)
    ...
    #13 std::thread ... nvhttp::start()

con el sintoma delator en el log: "Executing Undo Cmd" DOS veces, 0.8 s aparte.
Tres crashes en dos dias en el mismo host (2 x SIGSEGV + 1 x SIGTRAP).

Consecuencia grave: cuando el daemon muere a media terminacion, los undo que
faltaban NO corren. En un host con un prep-cmd que bloquea la sesion al
desconectar, eso deja la MAQUINA DESBLOQUEADA.

Cambios:

1. `std::recursive_mutex` compartido, tomado en execute(), pause(), terminate(),
   launch_input_only() y refresh(). Recursivo porque pause() reentra por
   terminate() cuando terminate_on_pause esta activo.
   Es `static inline` a proposito: `proc_t` se move-asigna al recargar apps.json
   (`proc = std::move(*proc_opt)`), y un mutex miembro eliminaria el move
   assignment defaulted. Ademas asi el lock sobrevive esa recarga, que es
   justamente la otra mitad de la carrera.

2. Guarda de idempotencia `_terminating`: una segunda llamada concurrente sale
   sin repetir los undo, en vez de duplicarlos.

3. El bucle de undo recorre un cursor LOCAL y retira el compartido de entrada, de
   modo que ninguna otra llamada pueda observar un iterador a medio consumir.

4. Timeout por comando (10 s) en el bucle de undo. Antes, un undo colgado impedia
   que corrieran los siguientes y disparaba el watchdog de sesion ("Hang
   detected!"), que mata el daemon — el SIGTRAP de la lista de arriba. Se usa un
   bucle de sondeo porque `child::wait_for()` esta roto/deprecado en
   Boost.Process v1 (ya documentado en `terminate_process_group`).

Los puntos 1-3 atacan el SIGSEGV; el 4 ataca el SIGTRAP. Son el mismo bucle.

Build verde con gcc-14, Release, cero warnings.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant