X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess_output%2Fbonjour.c;h=d4dc8f6abda9af944c025f2c964a3bd07754a96f;hb=1440fe0773e1478191e108c5cc3c464ee0ca7bfa;hp=d02240b3e3497af3b4a4eae14ce95b3827ec06ba;hpb=3561b9b28f58eb7a4183e158a8fd973800d31ceb;p=vlc diff --git a/modules/access_output/bonjour.c b/modules/access_output/bonjour.c index d02240b3e3..d4dc8f6abd 100644 --- a/modules/access_output/bonjour.c +++ b/modules/access_output/bonjour.c @@ -36,10 +36,8 @@ #include #include -#ifdef HAVE_AVAHI_06 -# include -# include -#endif +#include +#include #include #include #include @@ -48,18 +46,11 @@ /***************************************************************************** * Structures *****************************************************************************/ -typedef struct poll_thread_t -{ - VLC_COMMON_MEMBERS - - AvahiSimplePoll *simple_poll; -} poll_thread_t; - typedef struct bonjour_t { vlc_object_t *p_log; - poll_thread_t *poll_thread; + vlc_thread_t thread; AvahiSimplePoll *simple_poll; AvahiEntryGroup *group; AvahiClient *client; @@ -81,6 +72,7 @@ static void entry_group_callback( AvahiEntryGroup *g, AvahiEntryGroupState state, void *userdata ) { + (void)g; bonjour_t *p_sys = (bonjour_t *)userdata; if( state == AVAHI_ENTRY_GROUP_ESTABLISHED ) @@ -121,11 +113,7 @@ static int create_service( bonjour_t *p_sys ) } error = avahi_entry_group_add_service( p_sys->group, AVAHI_IF_UNSPEC, -#ifdef HAVE_AVAHI_06 AVAHI_PROTO_UNSPEC, 0, p_sys->psz_name, -#else - AVAHI_PROTO_UNSPEC, p_sys->psz_name, -#endif p_sys->psz_stype, NULL, NULL, p_sys->i_port, p_sys->psz_txt, NULL ); @@ -166,12 +154,8 @@ static void client_callback( AvahiClient *c, if( p_sys->group != NULL ) avahi_entry_group_reset( p_sys->group ); } -#ifdef HAVE_AVAHI_06 else if( state == AVAHI_CLIENT_FAILURE && (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) ) -#else - else if( state == AVAHI_CLIENT_DISCONNECTED ) -#endif { msg_Err( p_sys->p_log, "avahi client disconnected" ); avahi_simple_poll_quit( p_sys->simple_poll ); @@ -181,13 +165,20 @@ static void client_callback( AvahiClient *c, /***************************************************************************** * poll_iterate_thread *****************************************************************************/ -static void poll_iterate_thread( poll_thread_t *p_pt ) +static void *poll_iterate_thread( void *data ) { - vlc_thread_ready( p_pt ); + AvahiSimplePoll *simple_poll = data; - while( !p_pt->b_die ) - if( avahi_simple_poll_iterate( p_pt->simple_poll, 100 ) != 0 ) + for( ;; ) + { + vlc_testcancel(); + int canc = vlc_savecancel(); + int ret = avahi_simple_poll_iterate( p_pt->simple_poll, 100 ); + vlc_restorecancel( canc ); + if (ret) break; + } + return NULL; } /***************************************************************************** @@ -197,36 +188,23 @@ void *bonjour_start_service( vlc_object_t *p_log, const char *psz_stype, const char *psz_name, int i_port, char *psz_txt ) { int err; - bonjour_t *p_sys; - p_sys = (bonjour_t *)malloc( sizeof(*p_sys) ); + bonjour_t* p_sys = calloc( 1, sizeof(*p_sys) ); if( p_sys == NULL ) - { - msg_Err( p_log, "out of memory" ); return NULL; - } - - memset( p_sys, 0, sizeof(*p_sys) ); p_sys->p_log = p_log; - p_sys->i_port = i_port; p_sys->psz_name = avahi_strdup( psz_name ); p_sys->psz_stype = avahi_strdup( psz_stype ); if( p_sys->psz_name == NULL || p_sys->psz_stype == NULL ) - { - msg_Err( p_sys->p_log, "out of memory" ); goto error; - } if( psz_txt != NULL ) { p_sys->psz_txt = avahi_strdup( psz_txt ); if( p_sys->psz_txt == NULL ) - { - msg_Err( p_sys->p_log, "out of memory" ); goto error; - } } p_sys->simple_poll = avahi_simple_poll_new(); @@ -237,9 +215,7 @@ void *bonjour_start_service( vlc_object_t *p_log, const char *psz_stype, } p_sys->client = avahi_client_new( avahi_simple_poll_get(p_sys->simple_poll), -#ifdef HAVE_AVAHI_06 0, -#endif client_callback, p_sys, &err ); if( p_sys->client == NULL ) { @@ -248,18 +224,9 @@ void *bonjour_start_service( vlc_object_t *p_log, const char *psz_stype, goto error; } - p_sys->poll_thread = vlc_object_create( p_sys->p_log, - sizeof(poll_thread_t) ); - if( p_sys->poll_thread == NULL ) - { - msg_Err( p_sys->p_log, "out of memory" ); - goto error; - } - p_sys->poll_thread->simple_poll = p_sys->simple_poll; - - if( vlc_thread_create( p_sys->poll_thread, "Avahi Poll Iterate Thread", - poll_iterate_thread, - VLC_THREAD_PRIORITY_HIGHEST, false ) ) + if( vlc_clone( &p_sys->thread, + poll_iterate_thread, p_sys->simple_poll, + VLC_THREAD_PRIORITY_HIGHEST ) ) { msg_Err( p_sys->p_log, "failed to create poll iterate thread" ); goto error; @@ -268,8 +235,6 @@ void *bonjour_start_service( vlc_object_t *p_log, const char *psz_stype, return (void *)p_sys; error: - if( p_sys->poll_thread != NULL ) - vlc_object_release( p_sys->poll_thread ); if( p_sys->client != NULL ) avahi_client_free( p_sys->client ); if( p_sys->simple_poll != NULL ) @@ -281,7 +246,7 @@ error: if( p_sys->psz_txt != NULL ) avahi_free( p_sys->psz_txt ); - free( (void *)p_sys ); + free( p_sys ); return NULL; } @@ -293,9 +258,8 @@ void bonjour_stop_service( void *_p_sys ) { bonjour_t *p_sys = (bonjour_t *)_p_sys; - vlc_object_kill( p_sys->poll_thread ); - vlc_thread_join( p_sys->poll_thread ); - vlc_object_release( p_sys->poll_thread ); + vlc_cancel( p_sys->thread ); + vlc_join( p_sys->thread, NULL ); if( p_sys->group != NULL ) avahi_entry_group_free( p_sys->group );