aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2014-01-04 08:37:57 +1000
committerSteve Bennett <steveb@workware.net.au>2014-01-15 07:14:17 +1000
commit73a0367ef52e3c9651b8920d06ebbbe526c96c60 (patch)
treee837c38eaf5472298b27c3fd439561fd836f5ab1
parent9c1e2d993c6d1819833a8eef4e3d5b4e8eaa843d (diff)
downloadjimtcl-73a0367ef52e3c9651b8920d06ebbbe526c96c60.zip
jimtcl-73a0367ef52e3c9651b8920d06ebbbe526c96c60.tar.gz
jimtcl-73a0367ef52e3c9651b8920d06ebbbe526c96c60.tar.bz2
load: use AssocData to free load handles
Instead of an explicit call in jim.c, store load handles as AssocData so that it is automatically cleaned up. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-load.c22
-rw-r--r--jim.c3
2 files changed, 14 insertions, 11 deletions
diff --git a/jim-load.c b/jim-load.c
index f9255dc..e694cbd 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -20,6 +20,8 @@
#define RTLD_LOCAL 0
#endif
+static void JimFreeLoadHandles(Jim_Interp *interp, void *data);
+
/**
* Note that Jim_LoadLibrary() requires a path to an existing file.
*
@@ -66,11 +68,13 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
}
else if (onload(interp) != JIM_ERR) {
/* Add this handle to the stack of handles to be freed */
- if (!interp->loadHandles) {
- interp->loadHandles = Jim_Alloc(sizeof(*interp->loadHandles));
- Jim_InitStack(interp->loadHandles);
+ Jim_Stack *loadHandles = Jim_GetAssocData(interp, "load::handles");
+ if (loadHandles == NULL) {
+ loadHandles = Jim_Alloc(sizeof(*loadHandles));
+ Jim_InitStack(loadHandles);
+ Jim_SetAssocData(interp, "load::handles", JimFreeLoadHandles, loadHandles);
}
- Jim_StackPush(interp->loadHandles, handle);
+ Jim_StackPush(loadHandles, handle);
Jim_SetEmptyResult(interp);
@@ -88,11 +92,13 @@ static void JimFreeOneLoadHandle(void *handle)
dlclose(handle);
}
-void Jim_FreeLoadHandles(Jim_Interp *interp)
+static void JimFreeLoadHandles(Jim_Interp *interp, void *data)
{
- if (interp->loadHandles) {
- Jim_FreeStackElements(interp->loadHandles, JimFreeOneLoadHandle);
- Jim_Free(interp->loadHandles);
+ Jim_Stack *handles = data;
+
+ if (handles) {
+ Jim_FreeStackElements(handles, JimFreeOneLoadHandle);
+ Jim_Free(handles);
}
}
diff --git a/jim.c b/jim.c
index ebd3d39..2b96ec6 100644
--- a/jim.c
+++ b/jim.c
@@ -5484,9 +5484,6 @@ void Jim_FreeInterp(Jim_Interp *i)
Jim_Free(cf);
cf = nextcf;
}
-#ifdef jim_ext_load
- Jim_FreeLoadHandles(i);
-#endif
/* Free the interpreter structure. */
Jim_Free(i);