+ /* We can release the list, interesting modules were yielded */
+ vlc_list_release( p_all );
+
+ /* Parse the linked list and use the first successful module */
+ p_tmp = p_first;
+ while( p_tmp != NULL )
+ {
+ if( p_tmp->p_module->pf_activate
+ && p_tmp->p_module->pf_activate( p_this ) == VLC_SUCCESS )
+ {
+ break;
+ }
+
+ vlc_object_release( p_tmp->p_module );
+ p_tmp = p_tmp->p_next;
+ }
+
+ /* Store the locked module value */
+ if( p_tmp != NULL )
+ {
+ p_module = p_tmp->p_module;
+ p_tmp = p_tmp->p_next;
+ }
+ else
+ {
+ p_module = NULL;
+ }
+
+ /* Unlock the remaining modules */
+ while( p_tmp != NULL )
+ {
+ vlc_object_release( p_tmp->p_module );
+ p_tmp = p_tmp->p_next;
+ }
+
+ free( p_list );
+
+ if( p_module != NULL )
+ {
+ msg_Info( p_module, "using %s module \"%s\"",
+ psz_capability, p_module->psz_object_name );
+ }
+ else if( p_first == NULL )
+ {
+ msg_Err( p_this, "no %s module matched \"%s\"",
+ psz_capability, (psz_name && *psz_name) ? psz_name : "any" );
+ }
+ else if( psz_name != NULL && *psz_name )
+ {
+ msg_Err( p_this, "no %s module matching \"%s\" could be loaded",
+ psz_capability, (psz_name && *psz_name) ? psz_name : "any" );
+ }
+
+ if( psz_shortcuts )
+ {
+ free( psz_shortcuts );
+ }
+
+ if( psz_var )
+ {
+ free( psz_var );
+ }
+
+ /* Don't forget that the module is still locked */
+ return p_module;