erlang/otp — pull request #301 by vinoski (2014-03-19 16:07:56+00:00)
Title: fix sys:get_state/1,2 and sys:replace_state/2,3 when sys suspended

Add two new system callbacks `Module:system_get_state/1` and `Module:system_replace_state/2` to allow `sys:get_state/1,2` and `sys:replace_state/2,3` to operate correctly even if a process is sys suspended. Modify `gen_server`, `gen_fsm`, and `gen_event` to support the new callbacks.

If a callback module does not export these functions, then by default the `Misc` value (the same as that passed as the final argument to `sys:handle_system_msg/6`, and returned as part of the return value of `sys:get_status/1,2`) is treated as the callback module's state.

The previous behaviour of intercepting the system message and passing a tuple of size 2 as the last argument to `sys:handle_system_msg/6` is no longer supported.

Add tests to verify the correctness of `sys:get_state/1,2` and `sys:replace_state/2,3` when processes are sys suspended. Add two tests for modules that implement special processes, one that exports `system_get_state/1` and `system_replace_state/2` and one that doesn't.

Much of the credit for this patch goes to James Fish (@fishcakez), who reported the initial problem and implemented much of the fix. With @fishcakez approval, this pull request replaces [this previous one](https://github.com/erlang/otp/pull/53).

Also, in a separate commit, remove tuple funs from special process documentation. Support for tuple funs was removed in R16B but the documentation for special processes, sys, and proc_lib in the OTP Design Principles still showed examples using them, and those examples no longer worked. Fix the examples to use regular functions instead and fix the documentation to reflect the changes.