Commit bdc46e27 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Inline module_Call()

parent ae5e3537
...@@ -1059,21 +1059,35 @@ static module_t * AllocatePlugin( vlc_object_t * p_this, const char *psz_file ) ...@@ -1059,21 +1059,35 @@ static module_t * AllocatePlugin( vlc_object_t * p_this, const char *psz_file )
p_module->b_loaded = true; p_module->b_loaded = true;
/* Initialize the module: fill p_module, default config */ /* Initialize the module: fill p_module, default config */
if( module_Call( p_this, p_module ) != 0 ) static const char entry[] = "vlc_entry" MODULE_SUFFIX;
/* Try to resolve the symbol */
int (*pf_symbol)(module_t * p_module)
= (int (*)(module_t *)) module_Lookup( p_module->handle,entry );
if( pf_symbol == NULL )
{ {
/* We couldn't call module_init() */ msg_Warn( p_this, "cannot find symbol \"%s\" in plugin `%s'",
free( p_module->psz_filename ); entry, psz_file );
module_release( p_module ); goto error;
module_Unload( handle ); }
return NULL; else
/* We can now try to call the symbol */
if( pf_symbol( p_module ) != 0 )
{
/* With a well-written module we shouldn't have to print an
* additional error message here, but just make sure. */
msg_Err( p_this, "cannot initialize plugin `%s'", psz_file );
goto error;
} }
DupModule( p_module ); DupModule( p_module );
assert( !p_module->b_builtin );
/* Everything worked fine ! The module is ready to be added to the list. */
p_module->b_builtin = false;
return p_module; return p_module;
error:
free( p_module->psz_filename );
module_release( p_module );
module_Unload( handle );
return NULL;
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -144,7 +144,7 @@ int vlc_bindtextdomain (const char *); ...@@ -144,7 +144,7 @@ int vlc_bindtextdomain (const char *);
/* Low-level OS-dependent handler */ /* Low-level OS-dependent handler */
int module_Load (vlc_object_t *, const char *, module_handle_t *); int module_Load (vlc_object_t *, const char *, module_handle_t *);
int module_Call (vlc_object_t *obj, module_t *); void *module_Lookup (module_handle_t, const char *);
void module_Unload (module_handle_t); void module_Unload (module_handle_t);
/* Plugins cache */ /* Plugins cache */
......
...@@ -66,62 +66,10 @@ ...@@ -66,62 +66,10 @@
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
#ifdef HAVE_DYNAMIC_PLUGINS #ifdef HAVE_DYNAMIC_PLUGINS
static void *module_Lookup( module_handle_t, const char * );
#if defined(HAVE_DL_WINDOWS) #if defined(HAVE_DL_WINDOWS)
static char * GetWindowsError ( void ); static char * GetWindowsError ( void );
#endif #endif
/**
* module Call
*
* Call a symbol given its name and a module structure. The symbol MUST
* refer to a function returning int and taking a module_t* as an argument.
* \param p_module the modules
* \return 0 if it pass and -1 in case of a failure
*/
int module_Call( vlc_object_t *obj, module_t *p_module )
{
static const char psz_name[] = "vlc_entry" MODULE_SUFFIX;
int (* pf_symbol) ( module_t * p_module );
/* Try to resolve the symbol */
pf_symbol = (int (*)(module_t *)) module_Lookup( p_module->handle,
psz_name );
if( pf_symbol == NULL )
{
#if defined(HAVE_DL_WINDOWS)
char *psz_error = GetWindowsError();
msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%s)",
psz_name, p_module->psz_filename, psz_error );
free( psz_error );
#elif defined(HAVE_DL_DLOPEN)
msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%s)",
psz_name, p_module->psz_filename, dlerror() );
#elif defined(HAVE_DL_SHL_LOAD)
msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%m)",
psz_name, p_module->psz_filename );
#else
# error "Something is wrong in modules.c"
#endif
return -1;
}
/* We can now try to call the symbol */
if( pf_symbol( p_module ) != 0 )
{
/* With a well-written module we shouldn't have to print an
* additional error message here, but just make sure. */
msg_Err( obj, "Failed to call symbol \"%s\" in file `%s'",
psz_name, p_module->psz_filename );
return -1;
}
/* Everything worked fine, we can return */
return 0;
}
/** /**
* Load a dynamically linked library using a system dependent method. * Load a dynamically linked library using a system dependent method.
* *
...@@ -235,7 +183,7 @@ void module_Unload( module_handle_t handle ) ...@@ -235,7 +183,7 @@ void module_Unload( module_handle_t handle )
* @param psz_function function name * @param psz_function function name
* @return NULL on error, or the address of the symbol * @return NULL on error, or the address of the symbol
*/ */
static void *module_Lookup( module_handle_t handle, const char *psz_function ) void *module_Lookup( module_handle_t handle, const char *psz_function )
{ {
#if defined(HAVE_DL_WINDOWS) && defined(UNDER_CE) #if defined(HAVE_DL_WINDOWS) && defined(UNDER_CE)
wchar_t wide[strlen( psz_function ) + 1]; wchar_t wide[strlen( psz_function ) + 1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment