diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/load.n | 9 | ||||
-rw-r--r-- | doc/unload.n | 151 |
2 files changed, 158 insertions, 2 deletions
@@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: load.n,v 1.7 2002/07/01 18:24:39 jenglish Exp $ +'\" RCS: @(#) $Id: load.n,v 1.8 2004/02/24 22:58:45 dkf Exp $ '\" .so man.macros .TH load n 7.5 Tcl "Tcl Built-In Commands" @@ -73,7 +73,12 @@ in an application. If a given \fIfileName\fR is loaded into multiple interpreters, then the first \fBload\fR will load the code and call the initialization procedure; subsequent \fBload\fRs will call the initialization procedure without loading the code again. -It is not possible to unload or reload a package. +.VS 8.5 +For Tcl versions lower than 8.5, it is not possible to unload or reload a +package. From version 8.5 however, the \fBunload\fR command allows the unloading +of libraries loaded with \fBload\fR, for libraries that are aware of the +Tcl's unloading mechanism. +.VE 8.5 .PP The \fBload\fR command also supports packages that are statically linked with the application, if those packages have been registered diff --git a/doc/unload.n b/doc/unload.n new file mode 100644 index 0000000..4fc41dd --- /dev/null +++ b/doc/unload.n @@ -0,0 +1,151 @@ +'\" +'\" Copyright (c) 2003 George Petasis, petasis@iit.demokritos.gr. +'\" +'\" See the file "license.terms" for information on usage and redistribution +'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. +'\" +'\" RCS: @(#) $Id: unload.n,v 1.1 2004/02/24 22:58:45 dkf Exp $ +'\" +.so man.macros +.TH unload n 8.5 Tcl "Tcl Built-In Commands" +.BS +'\" Note: do not modify the .SH NAME line immediately below! +.SH NAME +unload \- Unload machine code. +.SH SYNOPSIS +\fBunload \fR?\fIswitches\fR? \fIfileName\fR +.br +\fBunload \fR?\fIswitches\fR? \fIfileName packageName\fR +.br +\fBunload \fR?\fIswitches\fR? \fIfileName packageName interp\fR +.BE + +.SH DESCRIPTION +.PP +This command tries to unload shared libraries previously loaded +with \fBload\fR from the application's address space. \fIfileName\fR +is the name of the file containing the library file to be unload; it +must be the same as the filename provided to \fBload\fR for +loading the library. +\fIpackageName\fR is the name of the package, and is used to +compute the name of the unload procedure. +\fIinterp\fR is the path name of the interpreter from which to unload +the package (see the \fBinterp\fR manual entry for details); +if \fIinterp\fR is omitted, it defaults to the +interpreter in which the \fBunload\fR command was invoked. +.LP +If the initial arguments to \fBunload\fR start with \fB\-\fR then +they are treated as switches. The following switches are +currently supported: +.TP +\fB\-nocomplain\fR +Supresses all error messages. If this switch is given \fBunload\fR will +never report an error. +.TP +\fB\-keeplibrary\fR +This switch will prevent \fBunload\fR from issuing the operating system call +that will unload the library from the process. +.TP +\fB\-\|\-\fR +Marks the end of switches. The argument following this one will +be treated as a \fIfileName\fR even if it starts with a \fB\-\fR. +.PP +When a file containing a shared library is loaded through the +\fBload\fR command, Tcl associates two reference counts to the library +file. The first counter shows how many times the library has been +loaded into normal (trusted) interpreters while the second describes how many +times the library has been loaded into safe interpreters. As a file containing +a shared library can be loaded only once by Tcl (with the first \fBload\fR +call on the file), these counters track how many interpreters use the library. +Each subsequent call to \fBload\fR after the first, simply increaments the +proper reference count. +.PP +\fBunload\fR works in the opposite direction. As a first step, \fBunload\fR +will check whether the library is unloadable: an unloadable library exports +a special unload procedure. The name of the unload procedure is determined by +\fIpackageName\fR and whether or not the target interpreter +is a safe one. For normal interpreters the name of the initialization +procedure will have the form \fIpkg\fB_Unload\fR, where \fIpkg\fR +is the same as \fIpackageName\fR except that the first letter is +converted to upper case and all other letters +are converted to lower case. For example, if \fIpackageName\fR is +\fBfoo\fR or \fBFOo\fR, the initialization procedure's name will +be \fBFoo_Unload\fR. +If the target interpreter is a safe interpreter, then the name +of the initialization procedure will be \fIpkg\fB_SafeUnload\fR +instead of \fIpkg\fB_Unload\fR. +.PP +If \fBunload\fR determines that a library is not unloadable (or unload +functionality has been disabled during compilation), an error will be returned. +If the library is unloadable, then \fBunload\fR will call the unload +procedure. If the unload procedure returns TCL_OK, \fBunload\fR will proceed +and decrease the proper reference count (depending on the target interpreter +type). When both reference counts have reached 0, the library will be +detached from the process. +.PP +The unload procedure must match the following prototype: +.CS +typedef int Tcl_PackageUnloadProc(Tcl_Interp *\fIinterp\fR, int \fIflags\fR); +.CE +The \fIinterp\fR argument identifies the interpreter from which the +library is to be unloaded. The unload procedure must return +\fBTCL_OK\fR or \fBTCL_ERROR\fR to indicate whether or not it completed +successfully; in the event of an error it should set the interpreter's result +to point to an error message. In this case, the result of the +\fBunload\fR command will be the result returned by the unload procedure. +.CE +The \fIflags\fR argument can be either \fBTCL_UNLOAD_DETACH_FROM_INTERPRETER\fR +or \fBTCL_UNLOAD_DETACH_FROM_PROCESS\fR. In case the library will remain +attached to the process after the unload procedure returns (i.e. because +the library is used by other interpreters), +\fBTCL_UNLOAD_DETACH_FROM_INTERPRETER\fR will be defined. However, if the +library is used only by the target interpreter and the library will be +detached from the application as soon as the unload procedure returns, +the \fIflags\fR argument will be set to \fBTCL_UNLOAD_DETACH_FROM_PROCESS\fR. +.PP +The \fBunload\fR command cannot unload libraries that are statically +linked with the application. +If \fIfileName\fR is an empty string, then \fIpackageName\fR must +be specified. +.PP +If \fIpackageName\fR is omitted or specified as an empty string, +Tcl tries to guess the name of the package. +This may be done differently on different platforms. +The default guess, which is used on most UNIX platforms, is to +take the last element of \fIfileName\fR, strip off the first +three characters if they are \fBlib\fR, and use any following +.VS +alphabetic and underline characters as the module name. +.VE +For example, the command \fBunload libxyz4.2.so\fR uses the module +name \fBxyz\fR and the command \fBunload bin/last.so {}\fR uses the +module name \fBlast\fR. + +.SH "PORTABILITY ISSUES" +.TP +\fBUnix\fR\0\0\0\0\0 +. +Not all unix operating systems support library unloading. Under such +an operating system \fBunload\fR returns an error (unless -nocomplain has +been specified). +.TP +\fBMacintosh\fR\0\0\0\0\0 +. +<Somebody to comment on this?> + +.SH BUGS +.PP +If the same file is \fBload\fRed by different \fIfileName\fRs, it will +be loaded into the process's address space multiple times. The +behavior of this varies from system to system (some systems may +detect the redundant loads, others may not). In case a library has been +silently detached by the operating system (and as a result Tcl thinks the +library is still loaded), it may be dangerous to use +\fBunload\fR on such a library (as the library will be completely detached +from the application while some interpreters will continue to use it). + +.SH "SEE ALSO" +info sharedlibextension, load, safe(n) + +.SH KEYWORDS +binary code, unloading, safe interpreter, shared library |