[vlc-devel] [PATCH 5/7] upnp: the callback is always SD::MediaServerList::Callback() when used

Steve Lhomme robux4 at videolabs.io
Wed Jun 1 16:38:08 CEST 2016


---
 modules/services_discovery/upnp.cpp | 20 ++++++++------------
 modules/services_discovery/upnp.hpp |  7 +++----
 2 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/modules/services_discovery/upnp.cpp b/modules/services_discovery/upnp.cpp
index 5db4d0c..73f335a 100644
--- a/modules/services_discovery/upnp.cpp
+++ b/modules/services_discovery/upnp.cpp
@@ -239,7 +239,7 @@ static int Open( vlc_object_t *p_this )
         return VLC_ENOMEM;
     }
 
-    p_sys->p_upnp = UpnpInstanceWrapper::get( p_this, SD::MediaServerList::Callback, p_sys->p_server_list );
+    p_sys->p_upnp = UpnpInstanceWrapper::get( p_this, p_sys->p_server_list );
     if ( !p_sys->p_upnp )
     {
         delete p_sys->p_server_list;
@@ -641,9 +641,8 @@ void MediaServerList::removeServer( const std::string& udn )
 /*
  * Handles servers listing UPnP events
  */
-int MediaServerList::Callback( Upnp_EventType event_type, void* p_event, void* p_user_data )
+int MediaServerList::Callback( Upnp_EventType event_type, void* p_event, MediaServerList* self )
 {
-    MediaServerList* self = static_cast<MediaServerList*>( p_user_data );
     services_discovery_t* p_sd = self->m_sd;
 
     switch( event_type )
@@ -1105,7 +1104,7 @@ static int Open( vlc_object_t *p_this )
         return VLC_ENOMEM;
 
     p_access->p_sys = p_sys;
-    p_sys->p_upnp = UpnpInstanceWrapper::get( p_this, NULL, NULL );
+    p_sys->p_upnp = UpnpInstanceWrapper::get( p_this, NULL );
     if ( !p_sys->p_upnp )
     {
         delete p_sys;
@@ -1130,7 +1129,6 @@ static void Close( vlc_object_t* p_this )
 UpnpInstanceWrapper::UpnpInstanceWrapper()
     : m_handle( -1 )
     , m_opaque( NULL )
-    , m_callback( NULL )
     , m_refcount( 0 )
 {
     vlc_mutex_init( &m_callback_lock );
@@ -1143,7 +1141,7 @@ UpnpInstanceWrapper::~UpnpInstanceWrapper()
     vlc_mutex_destroy( &m_callback_lock );
 }
 
-UpnpInstanceWrapper *UpnpInstanceWrapper::get(vlc_object_t *p_obj, Upnp_FunPtr callback, SD::MediaServerList *opaque)
+UpnpInstanceWrapper *UpnpInstanceWrapper::get(vlc_object_t *p_obj, SD::MediaServerList *opaque)
 {
     vlc_mutex_locker lock( &s_lock );
     if ( s_instance == NULL )
@@ -1193,12 +1191,11 @@ UpnpInstanceWrapper *UpnpInstanceWrapper::get(vlc_object_t *p_obj, Upnp_FunPtr c
     }
     s_instance->m_refcount++;
     // This assumes a single UPNP SD instance
-    if (callback && opaque)
+    if (opaque)
     {
         vlc_mutex_locker lock( &s_instance->m_callback_lock );
-        assert(!s_instance->m_callback && !s_instance->m_opaque);
+        assert(!s_instance->m_opaque);
         s_instance->m_opaque = opaque;
-        s_instance->m_callback = callback;
     }
     return s_instance;
 }
@@ -1209,7 +1206,6 @@ void UpnpInstanceWrapper::release(bool isSd)
     if ( isSd )
     {
         vlc_mutex_locker lock( &m_callback_lock );
-        m_callback = NULL;
         m_opaque = NULL;
     }
     if (--s_instance->m_refcount == 0)
@@ -1228,8 +1224,8 @@ int UpnpInstanceWrapper::Callback(Upnp_EventType event_type, void *p_event, void
 {
     UpnpInstanceWrapper* self = static_cast<UpnpInstanceWrapper*>( p_user_data );
     vlc_mutex_locker lock( &self->m_callback_lock );
-    if ( !self->m_callback )
+    if ( !self->m_opaque )
         return 0;
-    self->m_callback( event_type, p_event, self->m_opaque );
+    SD::MediaServerList::Callback( event_type, p_event, self->m_opaque );
     return 0;
 }
diff --git a/modules/services_discovery/upnp.hpp b/modules/services_discovery/upnp.hpp
index 4b46c52..65f1072 100644
--- a/modules/services_discovery/upnp.hpp
+++ b/modules/services_discovery/upnp.hpp
@@ -58,7 +58,7 @@ class UpnpInstanceWrapper
 {
 public:
     // This increases the refcount before returning the instance
-    static UpnpInstanceWrapper* get(vlc_object_t* p_obj, Upnp_FunPtr callback, SD::MediaServerList *opaque);
+    static UpnpInstanceWrapper* get(vlc_object_t* p_obj, SD::MediaServerList *opaque);
     void release(bool isSd);
     UpnpClient_Handle handle() const;
 
@@ -72,9 +72,8 @@ private:
     static UpnpInstanceWrapper* s_instance;
     static vlc_mutex_t s_lock;
     UpnpClient_Handle m_handle;
-    vlc_mutex_t m_callback_lock; // protect opaque_ and callback_
+    vlc_mutex_t m_callback_lock; // protect m_opaque
     SD::MediaServerList* m_opaque;
-    Upnp_FunPtr m_callback;
     int m_refcount;
 };
 
@@ -105,7 +104,7 @@ public:
     bool addServer(MediaServerDesc *desc );
     void removeServer(const std::string &udn );
     MediaServerDesc* getServer( const std::string& udn );
-    static int Callback( Upnp_EventType event_type, void* p_event, void* p_user_data );
+    static int Callback( Upnp_EventType event_type, void* p_event, MediaServerList* self );
 
 private:
     void parseNewServer( IXML_Document* doc, const std::string& location );
-- 
2.8.1



More information about the vlc-devel mailing list