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 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: 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 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