http://wiki.blackboxframework.org/index.php?title=ModuleUnloading&feed=atom&action=historyModuleUnloading - Revision history2024-03-29T15:32:36ZRevision history for this page on the wikiMediaWiki 1.37.1http://wiki.blackboxframework.org/index.php?title=ModuleUnloading&diff=402&oldid=prevJosef templ at 10:41, 18 November 20162016-11-18T10:41:38Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 10:41, 18 November 2016</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1">Line 1:</td>
<td colspan="2" class="diff-lineno">Line 1:</td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Unloading a module happens frequently when developing new code. It is an inherent part of the edit-compile-go cycle unless BlackBox is restarted as a whole for every iteration. During normal operation of a BlackBox application module unloading <del style="font-weight: bold; text-decoration: none;">it </del>is not expected to occur, i.e. the end user will <del style="font-weight: bold; text-decoration: none;">typically </del>never be bothered with any problems caused by module unloading.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Unloading a module happens frequently when developing new code. It is an inherent part of the edit-compile-go cycle unless BlackBox is restarted as a whole for every iteration. During normal operation of a BlackBox application module unloading is not expected to occur, i.e. the end user will never be bothered with any problems caused by module unloading.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>In traditional ETH Oberon systems unloading a module is well known to cause various kinds of problems, depending on the way modules are handled by the runtime system. The problem in general is caused by the fact that after a module has been unloaded any procedure variables (including type bound procedures, of course) pointing to the module are not valid any longer. Calling such a procedure results in a trap or in a system crash.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>In traditional ETH Oberon systems unloading a module is well known to cause various kinds of problems, depending on the way modules are handled by the runtime system. The problem in general is caused by the fact that after a module has been unloaded any procedure variables (including type bound procedures, of course) pointing to the module are not valid any longer. Calling such a procedure results in a trap or in a system crash.</div></td></tr>
</table>Josef templhttp://wiki.blackboxframework.org/index.php?title=ModuleUnloading&diff=401&oldid=prevJosef templ at 09:06, 18 November 20162016-11-18T09:06:35Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 09:06, 18 November 2016</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l16">Line 16:</td>
<td colspan="2" class="diff-lineno">Line 16:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action <del style="font-weight: bold; text-decoration: none;">can </del>decide itself if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the <del style="font-weight: bold; text-decoration: none;">beginning </del>or at the end of the action's Do method. An action that calls Services.DoLater at the end will only produce a single trap, not an endless sequence of recurring traps.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action)<ins style="font-weight: bold; text-decoration: none;">. In this case there is no real danger of producing recursive traps caused by the trap handler broadcasting messages but there is another problem viz. recurrent traps. The observed behavior is close to a system crash if a periodic action opens a large number of trap windows</ins>. In BlackBox an action <ins style="font-weight: bold; text-decoration: none;">must therefore </ins>decide itself if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the <ins style="font-weight: bold; text-decoration: none;">begin </ins>or at the end of the action's Do method. An action that calls Services.DoLater at the end will only produce a single trap, not an endless sequence of recurring traps.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td></tr>
</table>Josef templhttp://wiki.blackboxframework.org/index.php?title=ModuleUnloading&diff=400&oldid=prevJosef templ at 08:55, 18 November 20162016-11-18T08:55:09Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 08:55, 18 November 2016</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l10">Line 10:</td>
<td colspan="2" class="diff-lineno">Line 10:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>(2) from recursive traps, where the trap handler produces another trap that produces another trap etc. A trap handler that opens a window and displays the stack trace unavoidably broadcasts messages to all views (both in ETH Oberon and BlackBox) and thereby can easily produce recursive traps.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>(2) from recursive traps, where the trap handler produces another trap that produces another trap etc. A trap handler that opens a window and displays the stack trace unavoidably broadcasts messages to all views (both in ETH Oberon and BlackBox) and thereby can easily produce recursive traps.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In BlackBox (1) cannot happen because the module's code memory is never reused. Also (2) is cared for in BlackBox for the most important situation, viz. Views.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In BlackBox (1) cannot happen because the module's code memory is never reused<ins style="font-weight: bold; text-decoration: none;">. It is only marked as unusable</ins>. Also (2) is cared for in BlackBox for the most important situation, viz. Views.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>In BlackBox a trapping view is deactivated automatically and shows a greyed</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>In BlackBox a trapping view is deactivated automatically and shows a greyed</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>representation of itself. This is not only done for traps resulting from unloaded</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>representation of itself. This is not only done for traps resulting from unloaded</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l16">Line 16:</td>
<td colspan="2" class="diff-lineno">Line 16:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action can decide itself if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the beginning or at the end of the action's Do method.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action can decide itself if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the beginning or at the end of the action's Do method<ins style="font-weight: bold; text-decoration: none;">. An action that calls Services.DoLater at the end will only produce a single trap, not an endless sequence of recurring traps</ins>.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td></tr>
</table>Josef templhttp://wiki.blackboxframework.org/index.php?title=ModuleUnloading&diff=399&oldid=prevJosef templ at 08:25, 18 November 20162016-11-18T08:25:18Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 08:25, 18 November 2016</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l16">Line 16:</td>
<td colspan="2" class="diff-lineno">Line 16:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>has some potential for producing a recursive trap.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action can decide <del style="font-weight: bold; text-decoration: none;">themselves </del>if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the beginning or at the end of the action's Do method.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action can decide <ins style="font-weight: bold; text-decoration: none;">itself </ins>if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the beginning or at the end of the action's Do method.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div></td></tr>
</table>Josef templhttp://wiki.blackboxframework.org/index.php?title=ModuleUnloading&diff=398&oldid=prevJosef templ: Created page with "Unloading a module happens frequently when developing new code. It is an inherent part of the edit-compile-go cycle unless BlackBox is restarted as a whole for every iteration..."2016-11-18T08:05:47Z<p>Created page with "Unloading a module happens frequently when developing new code. It is an inherent part of the edit-compile-go cycle unless BlackBox is restarted as a whole for every iteration..."</p>
<p><b>New page</b></p><div>Unloading a module happens frequently when developing new code. It is an inherent part of the edit-compile-go cycle unless BlackBox is restarted as a whole for every iteration. During normal operation of a BlackBox application module unloading it is not expected to occur, i.e. the end user will typically never be bothered with any problems caused by module unloading.<br />
<br />
In traditional ETH Oberon systems unloading a module is well known to cause various kinds of problems, depending on the way modules are handled by the runtime system. The problem in general is caused by the fact that after a module has been unloaded any procedure variables (including type bound procedures, of course) pointing to the module are not valid any longer. Calling such a procedure results in a trap or in a system crash.<br />
There are two main sources of procedure pointers: Views and Actions.<br />
<br />
This note tries to shed some light on the way BlackBox deals with such problems. Based on years of experience with the original ETH Oberon system these problems were well known to the ominc people right from the start of the BlackBox development and BlackBox solves them cleanly.<br />
<br />
A trap is considered to be the expected outcome of calling a procedure that does no longer exist. A trap allows one to see that something went wrong and also gives an indication what it was, where it happened, etc. This is not considered a problem as long as it does not lead to a system crash. A system crash can result for two reasons:<br />
(1) reusing the memory of the unloaded module for something else. This leads to random code being executed when calling an unloaded procedure.<br />
(2) from recursive traps, where the trap handler produces another trap that produces another trap etc. A trap handler that opens a window and displays the stack trace unavoidably broadcasts messages to all views (both in ETH Oberon and BlackBox) and thereby can easily produce recursive traps.<br />
<br />
In BlackBox (1) cannot happen because the module's code memory is never reused. Also (2) is cared for in BlackBox for the most important situation, viz. Views.<br />
In BlackBox a trapping view is deactivated automatically and shows a greyed<br />
representation of itself. This is not only done for traps resulting from unloaded<br />
modules but for all traps that are produced from a view because any trap in a view<br />
has some potential for producing a recursive trap.<br />
<br />
Another important source of procedure pointers are Actions (Services.Action). In BlackBox an action can decide themselves if it is to be reactivated after a trap or not. This is expressed by calling Services.DoLater either at the beginning or at the end of the action's Do method.<br />
<br />
For any situation beyond views and actions, BlackBox offers the CLOSE section of a module. This can be used for doing cleanup work upon module unloading.</div>Josef templ