<div dir="ltr">Hi list,<div><br></div><div>I was watching this nice youtube talk where Andrew Tanenbaum talks about work his students have done to port MINIX 3 to NetBSD[0]. Observations:</div><div><br></div><div>* "MINIX 3" is basically "Erlang/OTP" </div><div>* Restarts of processes through a "reincarnation server" (read: supervisor).</div><div>* Isolated memory spaces of drivers through MMU</div><div>* Capability oriented: Only the disk driver is allowed to manipulate disk driver registers. The audio driver may only do stuff with sound. It may not talk to the network.</div><div>* Hot code upgrades of drivers.</div><div><br></div><div>Now the last part has a trick which I had not seen before. Suppose we have a function code_change/2 (not /3 for simplicity) allowing us to up and downgrade between versions. Then they do:</div><div><br></div><div>upgrade(OldVsn, NextVsn, State) -></div><div>    NextState = code_change(NextVsn, State),</div><div>    case code_change({down, OldVsn}, NextState) of</div><div>        State -> {ok, NextState};</div><div>        _ -> {error, abort_code_upgrade}</div><div>    end.</div><div><br></div><div>That is, they upgrade the state and immediately downgrade it again. If there is any discrepancy here, then they abort the upgrade. According to Tanenbaum this captures a remarkable number of botched upgrades.</div><div><br></div><div>If we are not doing this, we may want to transplant the idea into OTP.</div><div><br></div><div>[0] <a href="https://www.youtube.com/watch?v=0pebP891V0c">https://www.youtube.com/watch?v=0pebP891V0c</a><br clear="all"><div><br></div>-- <br><div class="gmail_signature">J.</div>
</div></div>