<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TIP SYSTEM "http://www.tcl.tk/cgi-bin/tct/tip/tipxml.dtd">
<!-- Converted at Wed May 22 10:45:02 GMT 2013 -->
<!-- TIP AutoGenerator - written by Donal K. Fellows -->

<TIP number='121'>
<header><title>Controlled Application Shutdown via Tcl_Exit</title><author address="mailto:joe@mistachkin.com">Joe Mistachkin</author><status type='project' state='final' tclversion="8.5" vote='after'>$Revision: 1.8 $</status><history></history><created day='5' month='dec' year='2002' /></header>
<abstract>This TIP will allow all applications to perform a controlled shutdown (or do nothing) in the event that <emph style="italic">Tcl_Exit()</emph> is called.</abstract>
<body><section title="Rationale">
<para>For most applications written in C that use Tcl, calling the runtime <emph style="italic">exit()</emph> function is normally a reasonable way to shutdown the application. Unfortunately, this is not always the case. Applications written in other languages (and very complex C applications) may have very specific application shutdown requirements. This is especially true in multi-threaded environments. The problem is further compounded by extensions that use <emph style="italic">Tcl_Exit</emph>.</para>
</section>
<section title="Versus Exit Handlers">
<para>There are distinct advantages to using this method instead of using normal exit handlers in some cases. The normal exit handler cannot defer (or in an emergency, prevent) the application shutdown because <emph style="italic">Tcl_Finalize()</emph> has already been called. From the perspective of the exit handler, we have no way of knowing what other exit handlers have been called and/or their subsystems destroyed. In addition, even if it could somehow cause <emph style="italic">Tcl_Finalize()</emph> to defer the application shutdown, some or all of the other exit handlers may have already been executed, which would leave the application in an inconsistent state. This relatively simple change allows the programmer to get control very early during the application shutdown process.</para>
</section>
<section title="Proposed Changes">
<para>First, this TIP proposes a new Tcl API function called <emph style="italic">Tcl_SetExitProc()</emph> or something similar. This function accepts a <emph style="italic">Tcl_ExitProc</emph> pointer and returns a <emph style="italic">Tcl_ExitProc</emph> pointer. The return value is the old exit proc pointer.</para>
<para>Second, the <emph style="italic">Tcl_Exit()</emph> Tcl API function would be modified to allow for the handler to be called.</para>
<para>Third, the documentation for <emph style="italic">Tcl_Exit()</emph> would be updated to include <emph style="italic">Tcl_SetExitProc()</emph> and a warning that any custom exit proc should NOT return.</para>
</section>
<section title="Tcl_SetExitProc">
<verbatim><vline encoding='base64'>VGNsX0V4aXRQcm9jICo=</vline><vline encoding='base64'>VGNsX1NldEV4aXRQcm9jKHByb2Mp</vline><vline encoding='base64'>ICAgIFRjbF9FeGl0UHJvYyAqcHJvYzsgLyogbmV3IGV4aXQgaGFuZGxlciBmb3IgYXBwIG9yIE5VTEwgKi8=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'>ICAgIFRjbF9FeGl0UHJvYyAqcHJldkV4aXRQcm9jOyAvKiByZXR1cm4gcHJldiBleGl0IGhhbmRsZXIgdG8gY2FsbGVyICov</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIFRjbF9NdXRleExvY2soJmV4aXRNdXRleCk7</vline><vline encoding='base64'>ICAgIHByZXZFeGl0UHJvYyA9IGFwcEV4aXRQdHI7IC8qIGdldCBvbGQgYXBwIGV4aXQgcHRyICov</vline><vline encoding='base64'>ICAgIGFwcEV4aXRQdHIgPSBwcm9jOyAvKiBzZXQgbmV3IGFwcCBleGl0IHB0ciAqLw==</vline><vline encoding='base64'>ICAgIFRjbF9NdXRleFVubG9jaygmZXhpdE11dGV4KTs=</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIHJldHVybiBwcmV2RXhpdFByb2M7</vline><vline encoding='base64'>fQ==</vline></verbatim>
</section>
<section title="Tcl_Exit">
<verbatim><vline encoding='base64'>dm9pZA==</vline><vline encoding='base64'>VGNsX0V4aXQoc3RhdHVzKQ==</vline><vline encoding='base64'>ICAgIGludCBzdGF0dXM7CQkJLyogRXhpdCBzdGF0dXMgZm9yIGFwcGxpY2F0aW9uOyAgdHlwaWNhbGx5</vline><vline encoding='base64'>CQkJCSAqIDAgZm9yIG5vcm1hbCByZXR1cm4sIDEgZm9yIGVycm9yIHJldHVybi4gKi8=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'>ICAgIFRjbF9FeGl0UHJvYyAqY3VycmVudEFwcEV4aXRQdHI7</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIFRjbF9NdXRleExvY2soJmV4aXRNdXRleCk7</vline><vline encoding='base64'>ICAgIGN1cnJlbnRBcHBFeGl0UHRyID0gYXBwRXhpdFB0cjs=</vline><vline encoding='base64'>ICAgIFRjbF9NdXRleFVubG9jaygmZXhpdE11dGV4KTs=</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIGlmIChjdXJyZW50QXBwRXhpdFB0cikgew==</vline><vline encoding='base64'>ICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw==</vline><vline encoding='base64'>ICAgICAgLyogV0FSTklORzogVGhpcyBjb2RlIFNIT1VMRCBOT1QgcmV0dXJuLCBhcyB0aGVyZSBpcyBjb2RlICAqLw==</vline><vline encoding='base64'>ICAgICAgLyogICAgICAgICAgdGhhdCBkZXBlbmRzIG9uIFRjbF9FeGl0IG5ldmVyIHJldHVybmluZy4gICAgICAqLw==</vline><vline encoding='base64'>ICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw==</vline><vline encoding='base64'>ICAgICAgY3VycmVudEFwcEV4aXRQdHIoKENsaWVudERhdGEpIHN0YXR1cyk7</vline><vline encoding='base64'>ICAgIH0gZWxzZSB7</vline><vline encoding='base64'>ICAgICAgVGNsX0ZpbmFsaXplKCk7</vline><vline encoding='base64'>ICAgICAgVGNscEV4aXQoc3RhdHVzKTs=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIFRjbF9QYW5pYyAoImV4aXRQcm9jIHJldHVybmVkISIpOw==</vline><vline encoding='base64'>fQ==</vline></verbatim>
</section>
<section title="Example">
<verbatim><vline encoding='base64'>dm9pZCBNeUFwcEV4aXRQcm9jKENsaWVudERhdGEgY2xpZW50RGF0YSk=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'>ICAvKiAjMS4gUGVyZm9ybSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBzaHV0ZG93biBjb2RlLi4uICAgICov</vline><vline encoding='base64'>ICAvKiAjMi4gV2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBncmFjZWZ1bGx5IHNodXRkb3duLi4uICov</vline><vline encoding='base64'></vline><vline encoding='base64'>ICBleGl0KDApOw==</vline><vline encoding='base64'></vline><vline encoding='base64'>ICByZXR1cm47IC8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8=</vline><vline encoding='base64'>fQ==</vline><vline encoding='base64'></vline><vline encoding='base64'></vline><vline encoding='base64'>IC4uLiBzb21ldGltZSBkdXJpbmcgYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24gLi4u</vline><vline encoding='base64'></vline><vline encoding='base64'>IC8qIGZyb20gdGhpcyBwb2ludCBvbiBNeUFwcEV4aXRQcm9jIHdpbGwgaGFuZGxlIFRjbF9FeGl0IHJlcXVlc3RzICov</vline><vline encoding='base64'>IFRjbF9TZXRFeGl0UHJvYyhNeUFwcEV4aXRQcm9jKTs=</vline><vline encoding='base64'></vline><vline encoding='base64'>IC4uLiBvcHRpb25hbGx5LCBzb21ldGltZSBsYXRlciAuLi4=</vline><vline encoding='base64'></vline><vline encoding='base64'>IC8qIGZyb20gdGhpcyBwb2ludCBvbiB0aGUgb2xkIChkZWZhdWx0KSBoYW5kbGluZyB3aWxsIGJlIHVzZWQgKi8=</vline><vline encoding='base64'>IFRjbF9TZXRFeGl0UHJvYyhOVUxMKTs=</vline></verbatim>
</section>
<section title="Reference Implementation">
<para>A patch that implements everything suggested in this TIP is available at the URL:</para>
<para><url ref="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=649313&amp;group_id=10894&amp;atid=310894"/></para>
</section>
<section title="Consequences">
<para>There is no change for current users of the <emph style="italic">Tcl_Exit()</emph> function, including the [exit] command, if <emph style="italic">Tcl_SetExitProc()</emph> is never called explicitly by the application.</para>
</section>
<section title="Copyright">
<para>This document is hereby placed in the public domain.</para>
</section>
</body></TIP>
