<div dir="ltr">Regarding how to ensure gen_server:terminate/2 is called...<div><br></div><div>Maybe I'm being too pedantic (big word, sorry!), but the official documentation still confuses me.  I created/ran several tests to better understand what actually is going on. LYSE says it best IMO, and using smaller words and shorter sentences (always good for me :>). My remaining comments are included in-line below.<br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 11, 2015 at 4:20 PM, Fred Hebert <span dir="ltr"><<a href="mailto:mononcqc@ferd.ca" target="_blank">mononcqc@ferd.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 03/11, Youngkin, Rich wrote:<br>
> "terminate/2 will also be called when its parent (the process that spawned<br>
> it) dies, if and only if the gen_server is trapping exits."<br>
><br>
</span>> [...]<br>
<span class="">><br>
> The Erlang documentation on Supervisors states "Note that all child<br>
> processes implemented using the standard OTP behavior modules automatically<br>
> adhere to the shutdown protocol.". I'm having trouble reconciling these<br>
> LYSE with the Erlang Supervisor docs.<br></span></blockquote><div><br></div><div>The Erlang documentation on Supervisors leads me to believe that no special treatment is needed in order to for terminate/2 to be called, i.e., "...automatically adhere to the shutdown protocol". That said, I should have looked at the documentation on the "shutdown protocol". More below...</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
><br>
</span>> Thanks,<br>
> Rich<br>
<br>
The references I found to the shutdown protocol is:<br>
<br>
<a href="http://www.erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html#shutdown" target="_blank">http://www.erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html#shutdown</a><br>
<br>
"The supervisor process sends an exit signal to the child process and<br>
waits for acknowledgment. The child process should handle the<br>
{'EXIT',ParentPid,shutdown} message and terminate with reason shutdown<br>
if it traps exit signals."<br></blockquote><div><br></div><div>In my tests I didn't have to handle(_info) {'EXIT', ParentPid, shutdown). terminate/2 just gets called as a result of trapping exits when the supervisor directs the child to terminate (i.e., when the application is shutting down). So terminate/2 gets called, with reason "shutdown", not handle_info({'EXIT', ParentPid, shutdown}). But maybe... {'EXIT', ParentPid, shutdown} would be sent if the supervisor failed??? I didn't test that, but supervisors don't fail, right?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
The last line here is important -- if it traps exit signals. This is in<br>
agreement with what LYSE mentions. If you don't trap exit signals, you<br>
can't get the signal, it just kills the process directly.<br></blockquote><div><br></div><div>WRT to trap exit, yes.  WRT "The child process should handle the {'EXIT', ParentPid, shutdown} message...", no.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Regards,<br>
Fred.<br>
</blockquote></div><br></div></div></div>