diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-04-11 16:50:07 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-06-10 14:00:12 +1000 |
commit | c8392364cc98e5cfb371b62a8df0e7ff8d575e5e (patch) | |
tree | c0f46cf75b3879af3a6f9d6adf57f7463893a11f /jim-load.c | |
parent | 2c29147700b1237815338ac3d6838ba754e70f31 (diff) | |
download | jimtcl-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.c | 26 |
1 files changed, 26 insertions, 0 deletions
@@ -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] */ |