Tcl Extension Architecture (TEA) Sample Extension

View Ticket
Login
2024-12-12
08:37 Closed ticket [19630c0c49]: Add unload procedure to allow deletion of the sample extension dll plus 5 other changes artifact: ac12f58b56 user: oehhar
08:37 Ticket [19630c0c49]: 4 changes artifact: ac26471c21 user: oehhar
2024-12-10
17:21 Ticket [19630c0c49]: 4 changes artifact: 0b0e442bcf user: oehhar
09:14 Ticket [19630c0c49]: 3 changes artifact: f6f383b4ac user: oehhar
2024-12-09
18:02 Ticket [19630c0c49]: 3 changes artifact: 7d96ce1240 user: oehhar
17:41 Ticket [19630c0c49]: 3 changes artifact: 4a0885fa13 user: jan.nijtmans
17:21 Ticket [19630c0c49]: 4 changes artifact: 9fa703b58b user: oehhar
16:44 Ticket [19630c0c49]: 3 changes artifact: 12547d9a74 user: jan.nijtmans
12:57 Ticket [19630c0c49]: 4 changes artifact: 789da0787b user: oehhar
12:56
Ticket [19630c0c] Propose unload procedure check-in: d1f80795ac user: oehhar tags: 19630c0c-unload
12:52 New ticket [19630c0c49] Add unload procedure to allow deletion of the sample extension dll. artifact: 332440326f user: oehhar

Ticket UUID: 19630c0c49e243fd69ef5f246231d107c78e3909
Title: Add unload procedure to allow deletion of the sample extension dll
Type: RFE Version:
Submitter: oehhar Created on: 2024-12-09 12:52:07
Subsystem: 70. Sample Extension Assigned To: nobody
Priority: 5 Medium Severity: Minor
Status: Closed Last Modified: 2024-12-12 08:37:48
Resolution: Wont Fix Closed By: oehhar
    Closed on: 2024-12-12 08:37:48
Description:

The sample extension has no Sample_Unload procedure and thus, may not be unloaded.

User Comments: oehhar added on 2024-12-12 08:37:10:

It was made clear that the sample extension only shows the minimum. This would add complexity.

Message by Ashok on the core list on this:

Am 12.12.2024 um 09:11 schrieb [email protected]:
The unload command is fraught with too many perils imho to get right in the general case and also of limited value.

I would not clutter the sample extension with either of these but of course your opinion may differ.

/Ashok

Branch and ticket closed. Thank you all, Harald


oehhar added on 2024-12-10 17:21:23:

Emiliano has pointed to interpreter Assoc data.

So, here is the proposed change: [eba8935a06].

I copy some of the information given by Emiliano here:

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).


oehhar added on 2024-12-10 09:14:54:

Ok, checkin [2c5e0e025e] adds thread safety for the sha1 command.

And the command tolkens are also saved in a struct.

But how to get the command tolken struct ot the unload procedure ?

Thanks for any hint, Harald


oehhar added on 2024-12-09 18:02:56:
To late, I am already totally discourraged.
It is sooooo complicated...

Thanks, I may look into this back in a year when I understand at least 5%...

The token must be stored in "clientdata". Something, I never understood....

Thanks,
Harald

jan.nijtmans added on 2024-12-09 17:41:26:

Well, I don't want to discourage you, but ... what if someone does a "rename sha1 somethingelse"? Then the Tcl_DeleteCommand() wont work. Solution: remember the token when the command was created, and remove that.


oehhar added on 2024-12-09 17:21:18:

Yes, for multi interpreter/threads, see ticket [ecf13be4c9].

I tried to remove the commands by commit [37a2611f73].

Thanks for the information.

Learning each day...

Harald


jan.nijtmans added on 2024-12-09 16:44:35:

This won't be sufficient. All memory occupied by the extensions should be released, so the "sha1" and the "::sample::build-info" commands must be removed from the interpreter. Otherwise, those commands can still be called, which leads to a crash (and not only because sha1Contexts and ctxtotalRead are NULL).

B.T.W.: sha1Contexts and ctxtotalRead being global static variables is a bad idea too...... Accessing the "sha1" command from multiple interpreters (or - worse - from multiple threads) will give surprises!


oehhar added on 2024-12-09 12:57:39:

Proposal in commit [d1f80795ac] within branch [19630c0c-unload]