summaryrefslogtreecommitdiff
path: root/libguile/dynl-dl.c
diff options
context:
space:
mode:
authorMarius Vollmer <mvo@zagadka.de>1997-06-16 19:09:11 +0000
committerMarius Vollmer <mvo@zagadka.de>1997-06-16 19:09:11 +0000
commit419e9e117fa110de24b87ace73984f133887078c (patch)
treef70d0d329433545effbc249fe2e4f98a7f6a79c6 /libguile/dynl-dl.c
parentcc0b33128194d56e08b3deabe3916b8753a30f9f (diff)
downloadguile-419e9e117fa110de24b87ace73984f133887078c.tar.gz
* dynl.c (scm_dynamic_call, scm_dynamic_args_call): Wrap dynamic
function call in SCM_DEFER_INTS/SCM_ALLOW_INTS. (scm_dynamic_link, scm_dynamic_unlink, scm_dynamic_func): Always call the sysdep functions with deferred ints. * dynl.c, dynl-dl.c, dynl-dld.c, dynl-shl.c (sysdep_dynl_link, sysdep_dynl_unlink, sysdep_dynl_func): Expect to be called with deferred interrupts and insert SCM_ALLOW_INTS before throwing an error. * dynl.c (scm_dynamic_unlink, scm_dynamic_call): Return SCM_UNSPECIFIED.
Diffstat (limited to 'libguile/dynl-dl.c')
-rw-r--r--libguile/dynl-dl.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/libguile/dynl-dl.c b/libguile/dynl-dl.c
index 9655b7fa5..d8fb0c49d 100644
--- a/libguile/dynl-dl.c
+++ b/libguile/dynl-dl.c
@@ -60,7 +60,10 @@ sysdep_dynl_link (fname, subr)
{
void *handle = dlopen (fname, DLOPEN_MODE);
if (NULL == handle)
+ {
+ SCM_ALLOW_INTS;
scm_misc_error (subr, (char *)dlerror (), SCM_EOL);
+ }
return handle;
}
@@ -69,13 +72,11 @@ sysdep_dynl_unlink (handle, subr)
void *handle;
char *subr;
{
- int status;
-
- SCM_DEFER_INTS;
- status = dlclose (handle);
- SCM_ALLOW_INTS;
- if(status)
+ if (dlclose (handle))
+ {
+ SCM_ALLOW_INTS;
scm_misc_error (subr, (char *)dlerror (), SCM_EOL);
+ }
}
static void *
@@ -87,13 +88,13 @@ sysdep_dynl_func (symb, handle, subr)
void *fptr;
char *err;
- SCM_DEFER_INTS;
fptr = dlsym (handle, symb);
err = (char *)dlerror ();
- SCM_ALLOW_INTS;
-
if (!fptr)
+ {
+ SCM_ALLOW_INTS;
scm_misc_error (subr, err? err : "symbol has NULL address", SCM_EOL);
+ }
return fptr;
}