aboutsummaryrefslogtreecommitdiff
path: root/jim-load.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-04-11 16:50:07 +1000
committerSteve Bennett <steveb@workware.net.au>2011-06-10 14:00:12 +1000
commitc8392364cc98e5cfb371b62a8df0e7ff8d575e5e (patch)
treec0f46cf75b3879af3a6f9d6adf57f7463893a11f /jim-load.c
parent2c29147700b1237815338ac3d6838ba754e70f31 (diff)
downloadjimtcl-c8392364cc98e5cfb371b62a8df0e7ff8d575e5e.zip
jimtcl-c8392364cc98e5cfb371b62a8df0e7ff8d575e5e.tar.gz
jimtcl-c8392364cc98e5cfb371b62a8df0e7ff8d575e5e.tar.bz2
Unload dlopen() handles on freeing interpreter
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-load.c')
-rw-r--r--jim-load.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/jim-load.c b/jim-load.c
index 8877260..bb14260 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -63,7 +63,15 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
"No %s symbol found in extension %s", initsym, 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_StackPush(interp->loadHandles, handle);
+
Jim_SetEmptyResult(interp);
+
return JIM_OK;
}
}
@@ -72,6 +80,20 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
}
return JIM_ERR;
}
+
+static void JimFreeOneLoadHandle(void *handle)
+{
+ dlclose(handle);
+}
+
+void Jim_FreeLoadHandles(Jim_Interp *interp)
+{
+ if (interp->loadHandles) {
+ Jim_FreeStackElements(interp->loadHandles, JimFreeOneLoadHandle);
+ Jim_Free(interp->loadHandles);
+ }
+}
+
#else /* JIM_DYNLIB */
int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
{
@@ -81,6 +103,10 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
Jim_SetResultString(interp, "the Jim binary has no support for [load]", -1);
return JIM_ERR;
}
+
+void Jim_FreeLoadHandles(Jim_Interp *interp)
+{
+}
#endif /* JIM_DYNLIB */
/* [load] */