emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-25 da8c7ca 2/3: Port better to FreeBSD’s dlfunc vs


From: Paul Eggert
Subject: [Emacs-diffs] emacs-25 da8c7ca 2/3: Port better to FreeBSD’s dlfunc vs dlsym
Date: Tue, 24 Nov 2015 03:01:56 +0000

branch: emacs-25
commit da8c7ca2647d2e111a415f59c6b59053a19bdb61
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Port better to FreeBSD’s dlfunc vs dlsym
    
    This avoids warnings when converting between void * and
    function pointers, which strict C11 does not allow.
    * configure.ac (dlfunc): Check for existence.
    * src/dynlib.c (dlfunc) [!HAVE_DLFUNC]: New macro.
    (dynlib_func): New function.
    * src/dynlib.h (dynlib_function_ptr, dynlib_func): New decls.
    * src/emacs-module.c (Fmodule_load): Use dynlib_func, not
    dynlib_sym, for function pointers.
---
 configure.ac       |    5 +++++
 src/dynlib.c       |   10 ++++++++++
 src/dynlib.h       |    2 ++
 src/emacs-module.c |    5 +++--
 4 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index d5638bf..b2fa1ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3316,6 +3316,11 @@ if test "${with_modules}" != "no"; then
 
   if test "${HAVE_MODULES}" = no; then
     AC_MSG_ERROR([Dynamic modules are not supported on your system])
+  else
+    SAVE_LIBS=$LIBS
+    LIBS="$LIBS $LIBMODULES"
+    AC_CHECK_FUNCS([dlfunc])
+    LIBS=$SAVE_LIBS
   fi
 fi
 
diff --git a/src/dynlib.c b/src/dynlib.c
index 47ffb41..a41bed8 100644
--- a/src/dynlib.c
+++ b/src/dynlib.c
@@ -206,3 +206,13 @@ dynlib_close (dynlib_handle_ptr h)
 #error "No dynamic loading for this system"
 
 #endif
+
+#if !HAVE_DLFUNC
+# define dlfunc dynlib_sym
+#endif
+
+dynlib_function_ptr
+dynlib_func (dynlib_handle_ptr h, const char *sym)
+{
+  return (dynlib_function_ptr) dlfunc (h, sym);
+}
diff --git a/src/dynlib.h b/src/dynlib.h
index 1282c4f..1c19b5d 100644
--- a/src/dynlib.h
+++ b/src/dynlib.h
@@ -25,6 +25,8 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
 typedef void *dynlib_handle_ptr;
 dynlib_handle_ptr dynlib_open (const char *path);
 void *dynlib_sym (dynlib_handle_ptr h, const char *sym);
+typedef struct dynlib_function_ptr_nonce *(*dynlib_function_ptr) (void);
+dynlib_function_ptr dynlib_func (dynlib_handle_ptr h, const char *sym);
 bool dynlib_addr (void *ptr, const char **path, const char **sym);
 const char *dynlib_error (void);
 int dynlib_close (dynlib_handle_ptr h);
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 1a5e253..209f99b 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -710,7 +710,7 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0,
   if (!gpl_sym)
     error ("Module %s is not GPL compatible", SDATA (file));
 
-  module_init = (emacs_init_function) dynlib_sym (handle, "emacs_module_init");
+  module_init = (emacs_init_function) dynlib_func (handle, 
"emacs_module_init");
   if (!module_init)
     error ("Module %s does not have an init function.", SDATA (file));
 
@@ -937,7 +937,8 @@ allocate_emacs_value (emacs_env *env, struct 
emacs_value_storage *storage,
 
 /* Mark all objects allocated from local environments so that they
    don't get garbage-collected.  */
-void mark_modules (void)
+void
+mark_modules (void)
 {
   for (Lisp_Object tem = Vmodule_environments; CONSP (tem); tem = XCDR (tem))
     {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]