Re: sample extension: how to beam created proc tolkens to unload procedure

Liste des GroupesRevenir à cl tcl 
Sujet : Re: sample extension: how to beam created proc tolkens to unload procedure
De : wortkarg3 (at) *nospam* yahoo.com (Harald Oehlmann)
Groupes : comp.lang.tcl
Date : 10. Dec 2024, 16:41:53
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vj9ng1$t4fh$2@dont-email.me>
References : 1 2
User-Agent : Mozilla Thunderbird
Am 10.12.2024 um 16:13 schrieb Emiliano:
On Tue, 10 Dec 2024 10:35:46 +0100
Harald Oehlmann <wortkarg3@yahoo.com> wrote:
 
Hi Wizards,
>
I am soooo desperate with the sample extension.
>
Standard functionality like the build-info and the dll unload feels so
complicated. How can we put all this burden to the poor extension
developpers?
>
Ok, enough moaning !
>
See here:
https://core.tcl-lang.org/sampleextension/info/2c5e0e025efd0b9f
>
The two commands sha1 and ::sha1::build-info are created in the init
procedure.
They have to be deleted in the unload procedure.
How do I beam the two "tolkens" to the unload procedure ?
 
Sample_Init:
struct CmdClientData *cmdClientDataPtr;
cmdClientDataPtr = ckalloc(sizeof(struct Sha1ClientData));
-------------------------------------------^
Shouldn't this be "struct CmdClientDataPtr"?
cmdClientDataPtr->sha1CmdTolken = Tcl_CreateObjCommand(
    interp, "sha1", (Tcl_ObjCmdProc *)Sha1_Cmd,
              sha1ClientDataPtr, Sha1_CmdDeleteProc);
---------------^
Shouldn't this be "cmdClientDataPtr"?
 
Sample_Unload:
??? How to get cmdClientDataPtr access here ???
Tcl_DeleteCommandFromToken(interp, cmdClientDataPtr->sha1CmdTolken);
ckfree(cmdClientDataPtr);
 You get (at least!) three "levels" for storing cliendata to Tcl:
 * Per command, using the clientdata argument of Tcl_CreateObjCommand().
* Per interp, using Tcl_{Set|Get}AssocData().
* Per thread, using Tcl_GetThreadData().
 In this case, Tcl_GetAssocData is to be used, since you want to wipe the
command out from the current interpreter, leaving other interps alone.
A simple example (untested !!!)
 #define MY_PKG_KEY "My great package key"
Tcl_InterpDeleteProc pkgInterpDeleted; /* called when the interp is deleted */
struct CmdClientData {
     Tcl_Command sha1CmdToken;
};
 Sample_Init:
     struct CmdClientData *cmdClientDataPtr;
     cmdClientDataPtr = ckalloc(sizeof(struct CmdClientData));
     Tcl_SetAssocData(interp, MY_PKG_KEY, pkgInterpDeleted, cmdClientDataPtr);
     cmdClientDataPtr->sha1CmdToken = Tcl_CreateObjCommand(
         interp, "sha1", (Tcl_ObjCmdProc *)Sha1_Cmd,
         cmdClientDataPtr, Sha1_CmdDeleteProc);
 Sample_Unload:
     struct CmdClientData *cmdClientDataPtr = (struct CmdClientData *)
         Tcl_GetAssocData(interp, MY_PKG_KEY, NULL);
     /* check whether the pointer is not NULL */
     Tcl_DeleteCommandFromToken(interp, cmdClientDataPtr->sha1CmdToken);
     ckfree(cmdClientDataPtr);
     Tcl_DeleteAssocData(interp, MY_PKG_KEY);
 Of course you have to juggle the interaction of Sample_Unload,
Sha1CmdDeleteProc and pkgInterpDeleted, since they can be called when:
 * [sha1] cmd is deleted (Sha1_CmdDeleteProc is called).
* interp is destroyed (pkgInterpDeleted is called).
* [unload] is called on the external library (Sample_Unload is called).
 Hope this helps.
Hi Emiliano,
yes, thanks, it helps a lot. It is worse than expected...
So, it is also a good idea, to handle the command clientData via the command delete proc. This is hopefully called in all cases and is disjunct to the other cases.
So, we basically have a cleanup-routine, which may be called:
- on interpreter destruction
- on dll unload
So, the dll is not automatically unloaded on interpreter destruction.
If the commands were destroyed by other means (rename sha1 ""), I suppose, the Tcl_DeleteCommandFromToken will fail but nothing more.
Thanks for all,
Harald

Date Sujet#  Auteur
10 Dec 24 * sample extension: how to beam created proc tolkens to unload procedure9Harald Oehlmann
10 Dec 24 `* Re: sample extension: how to beam created proc tolkens to unload procedure8Emiliano
10 Dec 24  +- Re: sample extension: how to beam created proc tolkens to unload procedure1Harald Oehlmann
10 Dec 24  +* Re: sample extension: how to beam created proc tolkens to unload procedure5Harald Oehlmann
10 Dec 24  i`* Re: sample extension: how to beam created proc tolkens to unload procedure4Emiliano
10 Dec 24  i +* Re: sample extension: how to beam created proc tolkens to unload procedure2Harald Oehlmann
10 Dec 24  i i`- Re: sample extension: how to beam created proc tolkens to unload procedure1Ralf Fassel
10 Dec 24  i `- Re: sample extension: how to beam created proc tolkens to unload procedure1Harald Oehlmann
11 Dec 24  `- Re: sample extension: how to beam created proc tolkens to unload procedure1Harald Oehlmann

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal