Deutsch   English   Français   Italiano  
<20241210121305.783c35bc867324876cf3ec2b@example.invalid>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Emiliano <emil.g@example.invalid>
Newsgroups: comp.lang.tcl
Subject: Re: sample extension: how to beam created proc tolkens to unload
 procedure
Date: Tue, 10 Dec 2024 12:13:05 -0300
Organization: A noiseless patient Spider
Lines: 91
Message-ID: <20241210121305.783c35bc867324876cf3ec2b@example.invalid>
References: <vj921g$t4fh$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Tue, 10 Dec 2024 16:13:10 +0100 (CET)
Injection-Info: dont-email.me; posting-host="35c604c332529d27293aecbe85641275";
	logging-data="1076909"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18+ioNlAL+Ry2esS+LU9nUMzS+Q1d0DM3c="
Cancel-Lock: sha1:VSwnvdXjSr6bm75f/g+m/ftBJDs=
X-Newsreader: Sylpheed 3.8.0beta1 (GTK+ 2.24.33; x86_64-pc-linux-gnu)
Bytes: 4213

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.

> And of cause, the git magic is not working for build-info - it does not 
> build any more without git - info how this may work is nowhere...
> 
> But that is the next step.

No idea here, sorry.

> Thanks for any idea!
> Harald


-- 
Emiliano