Add project files.

This commit is contained in:
alejo committed 2026-09-12 00:08:03 -03:00
commit 3087fcea8a
71 files changed
+8325

No files matched your search

@@ -0,0 +1,81 @@
# Hot Reload -- live demo
Unlike `source/examples/HotReloadDemo` (a fixed script that loads two
pre-built versions and exits), this one is interactive: a host that
keeps running, and one plugin file you edit and rebuild yourself,
however many times you like, while it's live.
## Run it
```sh
cmake -S . -B out/build -DBUILD_EXAMPLES=ON
cmake --build out/build
./out/build/bin/examples/hotreload_live_demo_host
```
Leave that running. In another terminal, either rebuild by hand after
each edit:
```sh
cmake --build out/build --target hotreload_live_plugin
```
or run the watcher in this directory so saving is all you need to do:
```sh
source/examples/HotReloadLiveDemo/watch.sh out/build
```
Then open `Plugin/src/LivePlugin.cpp` -- it has its own comment with
several concrete things worth trying, in order (change a value, delete
the function, add a new one, add a data symbol). Each one lines up
with something `source/HotReload/README.md`'s "Hot reloading C++
symbols" and "The two guarantees" sections describe -- this is a place
to go watch each of those claims happen, not just read about them.
## What you should see
Editing and saving `live_tick()`'s multiplier and rebuilding should
change the running Host's printed values within about a second, on
the frame count it was already at -- not a restart. This was verified
in exactly this shape while building the feature: host running,
`watch.sh` running, and nothing else done except editing the file and
saving -- the running process picked up the new multiplier on its own
a couple of seconds later.
## If a reload doesn't seem to happen
- Check the target actually rebuilt -- `watch.sh` prints a build
failure clearly rather than silently doing nothing; a plain compile
error leaves the previous `.so`/`.dll` completely untouched, which
is why the Host would keep running old code without any error of
its own in that case.
- The Host polls once a second (see `Host/Main.cpp`) -- give it a
moment.
- Confirm you rebuilt the target this example actually watches,
`hotreload_live_plugin`, not the whole project (rebuilding
everything works too, it's just slower per iteration).
## Why rebuilding a `.so`/`.dll` the Host already has loaded works at all
On Linux/macOS this is unremarkable -- a running process's existing
mapping of a file survives the file being replaced, which is exactly
this project's normal build-then-relink cycle.
On Windows it's normally *not* possible to overwrite or delete a DLL
file a running process has loaded, which would otherwise make this
exact workflow (keep the Host running, rebuild the DLL it already
loaded) fail with the linker unable to write its output. This example
avoids that for a reason that already exists elsewhere in this
library, not anything specific to this demo:
`HotReloadContext::stagePathForLoad()` (`source/HotReload/src/
HotReloadContext.cpp`) copies a plugin to a fresh, uniquely-named file
before ever calling `LoadLibrary`/`dlopen` on it -- built originally to
sidestep a dlopen caching gotcha on POSIX (see that function's
comment) -- so the path this example's build actually writes to is
never the one Windows locks. This reasoning was not verified against
a real Windows rebuild-while-running cycle specifically (unlike the
rest of this library's Windows behavior, which was exercised under
Wine -- see `source/HotReload/README.md`'s verification notes); if a
rebuild on Windows still fails while the Host is running, that
mismatch between reasoning and reality is worth reporting.