News for hackers. Stuff that matters.
Re:Hot-code reloading on macOS/arm64 with Zig by charcircuit on Thursday March 17, 2022 @07:01PM (#30716816)
This seems like it would just crash or make your program get into an inconsistent state. What happens if you are executing a transaction but mid transaction your binary gets updated and your transaction now has done half of what's needed by the old version and half of what's needed by the new version. I don't think it would be that hard to get into an inconsistent state.
Re:Hot-code reloading on macOS/arm64 with Zig by Groxx on Thursday March 17, 2022 @07:16PM (#30716919)
If that matters, you probably shouldn't be using hot code reloading regardless of the language or implementation.
Re:Hot-code reloading on macOS/arm64 with Zig by mihaigalos on Friday March 18, 2022 @04:51AM (#30719926)
> If that matters, you probably shouldn't be using hot code reloading regardless of the language or implementation.

Why not? Perhaps I'm missing the point, but can't this be mutex'd away? Or perhaps you're refering to the fact that the hot code reloading mechanism should provide the mutex implicitly?

Re:Hot-code reloading on macOS/arm64 with Zig by Groxx on Friday March 18, 2022 @10:03PM (#30730188)
Things like restoring connections can be mutex'd away in the implementation, yeah. Or whatever the actually-working version would be, maybe there needs to be a socket-owning parent process that never dies, I dunno.

But if you write

    result = 0
    while true:
      result += 2 * do_something()
and change that to this and reload:

    result = 1
    while true:
      result -= 2 * do_something()
then even "ideal, correct behavior" at a reload level can give you end result values that are not possible to get while running either version of the code end-to-end. It's not possible to "fix" that because it's doing exactly what you told it to do - either it preserves values and can produce impossible values, or it does not and it's not really hot-swapping any more. Or it does some mix of that and it has even more surprising / wrong edge cases.

There are of course uses for systems with hot-swap boundaries/transactions to prevent swapping during critical regions, or to do something like stop and replace actors rather than touching their internal state, and they exist (e.g. erlang). But that requires your code to already be adopting those semantics, and it inherently defines boundaries on what is swapped and what is not. In that case the root "inconsistent transaction state" concern is not really a hot swapping issue, it's a failure to define your boundaries and semantics correctly - a normal bug / relying on undefined behavior.

Re:Hot-code reloading on macOS/arm64 with Zig by kubkon on Thursday March 17, 2022 @07:34PM (#30717040)
Yep, you are absolutely right, and hence why this is a proof-of-concept after all and a start really. With the proper tweaks to the linker though I am sure it would be possible orchestrate updates in such a way as to not clobber any existing global state or cause weird UB (by overwriting the code a thread is currently executing, etc.). Either way, thanks so much for the feedback!
Re:Hot-code reloading on macOS/arm64 with Zig by vgel on Friday March 18, 2022 @12:13AM (#30718682)
Yeah, I've never been a huge fan of hot-code reloading for that reason -- when I'm writing code I'm often trying to get something stable, and if it's having funky issues I don't want to be second-guessing whether it's the HCR or my own error. I've never found a HCR that's stable enough for me to not have that worry, and I don't think it's possible for the reason you mentioned.
Re:Hot-code reloading on macOS/arm64 with Zig by torginus on Friday March 18, 2022 @05:58AM (#30720269)
Well, games have a leg up on the competition in this regard - games tend to have some update logic which is called 60 times per second.

If you can restrict the code that runs between frames, you can just replace the logic everywhere between the frames, and not have to worry about what code the threads are executing at this time - since game logic is not running.