]> git.sesse.net Git - vlc/commitdiff
Split Win32 and POSIX dynamic linker backends
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 12 May 2011 19:33:56 +0000 (22:33 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 12 May 2011 19:43:09 +0000 (22:43 +0300)
configure.ac
src/Makefile.am
src/modules/modules.h
src/modules/os.c [deleted file]
src/posix/plugin.c [new file with mode: 0644]
src/win32/plugin.c [new file with mode: 0644]

index d092604bf4d676a1f994c8d8f940cacecb6ba582..ad85ffebc3370163dbad9d95fc283ab825835a87 100644 (file)
@@ -691,21 +691,6 @@ AC_CHECK_LIB(m,lrintf, [
 dnl Check for dynamic plugins
 ac_cv_have_plugins=no
 
-# HP-UX style
-if test "${ac_cv_have_plugins}" = "no"; then
-  AC_CHECK_HEADERS(dl.h)
-  ac_cv_my_have_shl_load=no
-  AC_CHECK_FUNC(shl_load,
-   [ac_cv_my_have_shl_load=yes,
-    AC_CHECK_LIB(dld, shl_load,
-     [ac_cv_my_have_shl_load=yes
-      VLC_ADD_LIBS([libvlccore],[-ldld])])])
-  if test "${ac_cv_my_have_shl_load}" = "yes"; then
-    AC_DEFINE(HAVE_DL_SHL_LOAD, 1, [Define if you have the shl_load API])
-    ac_cv_have_plugins=yes
-  fi
-fi
-
 # Win32 style
 if test "${ac_cv_have_plugins}" = "no"; then
   if test "${SYS}" = "mingw32" ; then
index 5b0c581501147920f0205148aadd8fbea9395c13..468b84220e6ca2916e37526f18a1cdabc61bb5fa 100644 (file)
@@ -278,6 +278,7 @@ SOURCES_libvlc_darwin = \
        posix/darwin_dirs.c \
        misc/atomic.c \
        posix/filesystem.c \
+       posix/plugin.c \
        posix/thread.c \
        posix/darwin_specific.c \
        $(NULL)
@@ -286,6 +287,7 @@ SOURCES_libvlc_linux = \
        posix/dirs.c \
        misc/atomic.c \
        posix/filesystem.c \
+       posix/plugin.c \
        posix/thread.c \
        posix/linux_specific.c \
        $(NULL)
@@ -294,6 +296,7 @@ SOURCES_libvlc_win32 = \
        win32/dirs.c \
        win32/atomic.c \
        win32/filesystem.c \
+       win32/plugin.c \
        win32/thread.c \
        win32/specific.c \
        win32/winsock.c \
@@ -303,6 +306,7 @@ SOURCES_libvlc_symbian = \
        symbian/path.cpp \
        symbian/dirs.c \
        misc/atomic.c \
+       win32/plugin.c \
        $(NULL)
 
 SOURCES_libvlc_other = \
@@ -310,6 +314,7 @@ SOURCES_libvlc_other = \
        misc/atomic.c \
        posix/filesystem.c \
        posix/thread.c \
+       posix/thread.c \
        posix/specific.c \
        $(NULL)
 
@@ -436,7 +441,6 @@ SOURCES_libvlc_common = \
        modules/modules.c \
        modules/cache.c \
        modules/entry.c \
-       modules/os.c \
        modules/textdomain.c \
        misc/threads.c \
        misc/stats.c \
index 511b40a6ec2bf28a47946cf6cc95f79d44ee797a..d353561397cbdee1aea8bcd111e7e21ec4efd4eb 100644 (file)
@@ -74,8 +74,6 @@ typedef int module_handle_t;
 typedef void * module_handle_t;
 #elif defined(HAVE_DL_DLOPEN)
 typedef void * module_handle_t;
-#elif defined(HAVE_DL_SHL_LOAD)
-typedef shl_t module_handle_t;
 #endif
 
 /**
diff --git a/src/modules/os.c b/src/modules/os.c
deleted file mode 100644 (file)
index 5f5e8fc..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*****************************************************************************
- * os.c : Low-level dynamic library handling
- *****************************************************************************
- * Copyright (C) 2001-2007 the VideoLAN team
- * $Id$
- *
- * Authors: Sam Hocevar <sam@zoy.org>
- *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
- *          Hans-Peter Jansen <hpj@urpla.net>
- *          Gildas Bazin <gbazin@videolan.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <vlc_common.h>
-#include <vlc_plugin.h> /* MODULE_SUFFIX */
-#include <vlc_charset.h>
-#include "libvlc.h"
-#include "modules.h"
-
-#include <stdlib.h>                                      /* free(), strtol() */
-#include <stdio.h>                                              /* sprintf() */
-#include <string.h>                                              /* strdup() */
-
-#include <sys/types.h>
-
-#if !defined(HAVE_DYNAMIC_PLUGINS)
-    /* no support for plugins */
-#elif defined(__APPLE__)
-#   include <dlfcn.h>
-#elif defined(HAVE_DL_WINDOWS)
-#   include <windows.h>
-#elif defined(HAVE_DL_DLOPEN)
-#   if defined(HAVE_DLFCN_H) /* Linux, BSD, Hurd */
-#       include <dlfcn.h>
-#   endif
-#   if defined(HAVE_SYS_DL_H)
-#       include <sys/dl.h>
-#   endif
-#elif defined(HAVE_DL_SHL_LOAD)
-#   if defined(HAVE_DL_H)
-#       include <dl.h>
-#   endif
-#endif
-#ifdef HAVE_VALGRIND_VALGRIND_H
-# include <valgrind/valgrind.h>
-#endif
-
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-#ifdef HAVE_DYNAMIC_PLUGINS
-#if defined(HAVE_DL_WINDOWS)
-static char * GetWindowsError  ( void );
-#endif
-
-/**
- * Load a dynamically linked library using a system dependent method.
- *
- * \param p_this vlc object
- * \param psz_file library file
- * \param p_handle the module handle returned
- * \return 0 on success as well as the module handle.
- */
-int module_Load( vlc_object_t *p_this, const char *psz_file,
-                 module_handle_t *p_handle )
-{
-    module_handle_t handle;
-
-#if defined(HAVE_DL_WINDOWS)
-    wchar_t psz_wfile[MAX_PATH];
-    MultiByteToWideChar( CP_UTF8, 0, psz_file, -1, psz_wfile, MAX_PATH );
-
-#ifndef UNDER_CE
-    /* FIXME: this is not thread-safe -- Courmisch */
-    UINT mode = SetErrorMode (SEM_FAILCRITICALERRORS);
-    SetErrorMode (mode|SEM_FAILCRITICALERRORS);
-#endif
-
-    handle = LoadLibraryW( psz_wfile );
-
-#ifndef UNDER_CE
-    SetErrorMode (mode);
-#endif
-
-    if( handle == NULL )
-    {
-        char *psz_err = GetWindowsError();
-        msg_Warn( p_this, "cannot load module `%s' (%s)", psz_file, psz_err );
-        free( psz_err );
-        return -1;
-    }
-
-#elif defined(HAVE_DL_DLOPEN)
-
-# if defined (RTLD_NOW)
-    const int flags = RTLD_NOW;
-# elif defined (DL_LAZY)
-    const int flags = DL_LAZY;
-# else
-    const int flags = 0;
-# endif
-    char *path = ToLocale( psz_file );
-
-    handle = dlopen( path, flags );
-    if( handle == NULL )
-    {
-        msg_Warn( p_this, "cannot load module `%s' (%s)", path, dlerror() );
-        LocaleFree( path );
-        return -1;
-    }
-    LocaleFree( path );
-
-#elif defined(HAVE_DL_SHL_LOAD)
-    handle = shl_load( psz_file, BIND_IMMEDIATE | BIND_NONFATAL, NULL );
-    if( handle == NULL )
-    {
-        msg_Warn( p_this, "cannot load module `%s' (%m)", psz_file );
-        return -1;
-    }
-
-#else
-#   error "Something is wrong in modules.c"
-
-#endif
-
-    *p_handle = handle;
-    return 0;
-}
-
-/**
- * CloseModule: unload a dynamic library
- *
- * This function unloads a previously opened dynamically linked library
- * using a system dependent method. No return value is taken in consideration,
- * since some libraries sometimes refuse to close properly.
- * \param handle handle of the library
- * \return nothing
- */
-void module_Unload( module_handle_t handle )
-{
-#if defined(HAVE_DL_WINDOWS)
-    FreeLibrary( handle );
-
-#elif defined(HAVE_DL_DLOPEN)
-# ifdef HAVE_VALGRIND_VALGRIND_H
-    if( RUNNING_ON_VALGRIND > 0 )
-        return; /* do not dlclose() so that we get proper stack traces */
-# endif
-    dlclose( handle );
-
-#elif defined(HAVE_DL_SHL_LOAD)
-    shl_unload( handle );
-
-#endif
-    return;
-}
-
-/**
- * Looks up a symbol from a dynamically loaded library
- *
- * This function queries a loaded library for a symbol specified in a
- * string, and returns a pointer to it. We don't check for dlerror() or
- * similar functions, since we want a non-NULL symbol anyway.
- *
- * @param handle handle to the module
- * @param psz_function function name
- * @return NULL on error, or the address of the symbol
- */
-void *module_Lookup( module_handle_t handle, const char *psz_function )
-{
-#if defined(HAVE_DL_WINDOWS) && defined(UNDER_CE)
-    wchar_t wide[strlen( psz_function ) + 1];
-    size_t i = 0;
-    do
-        wide[i] = psz_function[i]; /* UTF-16 <- ASCII */
-    while( psz_function[i++] );
-
-    return (void *)GetProcAddress( handle, wide );
-
-#elif defined(HAVE_DL_WINDOWS) && defined(WIN32)
-    return (void *)GetProcAddress( handle, (char *)psz_function );
-
-#elif defined(HAVE_DL_DLOPEN)
-    return dlsym( handle, psz_function );
-
-#elif defined(HAVE_DL_SHL_LOAD)
-    void *p_sym;
-    shl_findsym( &handle, psz_function, TYPE_UNDEFINED, &p_sym );
-    return p_sym;
-
-#endif
-}
-
-#if defined(HAVE_DL_WINDOWS)
-# include <wchar.h>
-
-static char * GetWindowsError( void )
-{
-    wchar_t wmsg[256];
-    int i = 0, i_error = GetLastError();
-
-    FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-                    NULL, i_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
-                    wmsg, 256, NULL );
-
-    /* Go to the end of the string */
-    while( !wmemchr( L"\r\n\0", wmsg[i], 3 ) )
-        i++;
-
-    snwprintf( wmsg + i, 256 - i, L" (error %i)", i_error );
-    return FromWide( wmsg );
-}
-#endif /* HAVE_DL_WINDOWS */
-#endif /* HAVE_DYNAMIC_PLUGINS */
diff --git a/src/posix/plugin.c b/src/posix/plugin.c
new file mode 100644 (file)
index 0000000..0f2634f
--- /dev/null
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ * os.c : Low-level dynamic library handling
+ *****************************************************************************
+ * Copyright (C) 2001-2007 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Sam Hocevar <sam@zoy.org>
+ *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
+ *          Hans-Peter Jansen <hpj@urpla.net>
+ *          Gildas Bazin <gbazin@videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_charset.h>
+#include "modules/modules.h"
+
+#include <sys/types.h>
+#include <dlfcn.h>
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# include <valgrind/valgrind.h>
+#endif
+
+/**
+ * Load a dynamically linked library using a system dependent method.
+ *
+ * \param p_this vlc object
+ * \param psz_file library file
+ * \param p_handle the module handle returned
+ * \return 0 on success as well as the module handle.
+ */
+int module_Load( vlc_object_t *p_this, const char *psz_file,
+                 module_handle_t *p_handle )
+{
+#if defined (RTLD_NOW)
+    const int flags = RTLD_NOW;
+#elif defined (DL_LAZY)
+    const int flags = DL_LAZY;
+#else
+    const int flags = 0;
+#endif
+    char *path = ToLocale( psz_file );
+
+    module_handle_t handle = dlopen( path, flags );
+    if( handle == NULL )
+    {
+        msg_Warn( p_this, "cannot load module `%s' (%s)", path, dlerror() );
+        LocaleFree( path );
+        return -1;
+    }
+    LocaleFree( path );
+    *p_handle = handle;
+    return 0;
+}
+
+/**
+ * CloseModule: unload a dynamic library
+ *
+ * This function unloads a previously opened dynamically linked library
+ * using a system dependent method. No return value is taken in consideration,
+ * since some libraries sometimes refuse to close properly.
+ * \param handle handle of the library
+ * \return nothing
+ */
+void module_Unload( module_handle_t handle )
+{
+#ifdef HAVE_VALGRIND_VALGRIND_H
+    if( RUNNING_ON_VALGRIND > 0 )
+        return; /* do not dlclose() so that we get proper stack traces */
+#endif
+    dlclose( handle );
+}
+
+/**
+ * Looks up a symbol from a dynamically loaded library
+ *
+ * This function queries a loaded library for a symbol specified in a
+ * string, and returns a pointer to it. We don't check for dlerror() or
+ * similar functions, since we want a non-NULL symbol anyway.
+ *
+ * @param handle handle to the module
+ * @param psz_function function name
+ * @return NULL on error, or the address of the symbol
+ */
+void *module_Lookup( module_handle_t handle, const char *psz_function )
+{
+    return dlsym( handle, psz_function );
+}
diff --git a/src/win32/plugin.c b/src/win32/plugin.c
new file mode 100644 (file)
index 0000000..81a692f
--- /dev/null
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * plugin.c : Low-level dynamic library handling
+ *****************************************************************************
+ * Copyright (C) 2001-2011 the VideoLAN team
+ *
+ * Authors: Sam Hocevar <sam@zoy.org>
+ *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
+ *          Hans-Peter Jansen <hpj@urpla.net>
+ *          Gildas Bazin <gbazin@videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_charset.h>
+#include "modules/modules.h"
+#include <windows.h>
+#include <wchar.h>
+
+static char *GetWindowsError( void )
+{
+    wchar_t wmsg[256];
+    int i = 0, i_error = GetLastError();
+
+    FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                    NULL, i_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                    wmsg, 256, NULL );
+
+    /* Go to the end of the string */
+    while( !wmemchr( L"\r\n\0", wmsg[i], 3 ) )
+        i++;
+
+    snwprintf( wmsg + i, 256 - i, L" (error %i)", i_error );
+    return FromWide( wmsg );
+}
+
+int module_Load( vlc_object_t *p_this, const char *psz_file,
+                 module_handle_t *p_handle )
+{
+    module_handle_t handle;
+
+    wchar_t psz_wfile[MAX_PATH];
+    MultiByteToWideChar( CP_UTF8, 0, psz_file, -1, psz_wfile, MAX_PATH );
+
+#ifndef UNDER_CE
+    /* FIXME: this is not thread-safe -- Courmisch */
+    UINT mode = SetErrorMode (SEM_FAILCRITICALERRORS);
+    SetErrorMode (mode|SEM_FAILCRITICALERRORS);
+#endif
+
+    handle = LoadLibraryW( psz_wfile );
+
+#ifndef UNDER_CE
+    SetErrorMode (mode);
+#endif
+
+    if( handle == NULL )
+    {
+        char *psz_err = GetWindowsError();
+        msg_Warn( p_this, "cannot load module `%s' (%s)", psz_file, psz_err );
+        free( psz_err );
+        return -1;
+    }
+
+    *p_handle = handle;
+    return 0;
+}
+
+void module_Unload( module_handle_t handle )
+{
+    FreeLibrary( handle );
+}
+
+void *module_Lookup( module_handle_t handle, const char *psz_function )
+{
+#ifdef UNDER_CE
+    wchar_t wide[strlen( psz_function ) + 1];
+    size_t i = 0;
+    do
+        wide[i] = psz_function[i]; /* UTF-16 <- ASCII */
+    while( psz_function[i++] );
+
+    return (void *)GetProcAddress( handle, wide );
+
+#else
+    return (void *)GetProcAddress( handle, (char *)psz_function );
+
+#endif
+}