void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p_item ) { vlc_gc_incref( p_item ); vlc_mutex_lock( &p_preparser->lock ); INSERT_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, p_preparser->i_waiting, p_item ); if( !p_preparser->b_live ) { if( vlc_clone_detach( NULL, Thread, p_preparser, VLC_THREAD_PRIORITY_LOW ) ) msg_Warn( p_preparser->object, "cannot spawn pre-parser thread" ); else p_preparser->b_live = true; } vlc_mutex_unlock( &p_preparser->lock ); }
int background_worker_Push( struct background_worker* worker, void* entity, void* id, int timeout ) { struct bg_queued_item* item = malloc( sizeof( *item ) ); if( unlikely( !item ) ) return VLC_EGENERIC; item->id = id; item->entity = entity; item->timeout = timeout < 0 ? worker->conf.default_timeout : timeout; vlc_mutex_lock( &worker->lock ); int i_ret = vlc_array_append( &worker->tail.data, item ); vlc_cond_signal( &worker->tail.wait ); if( i_ret != 0 ) { free( item ); return VLC_EGENERIC; } if( worker->head.active == false ) { worker->head.probe_request = false; worker->head.active = !vlc_clone_detach( NULL, Thread, worker, VLC_THREAD_PRIORITY_LOW ); } if( worker->head.active ) worker->conf.pf_hold( item->entity ); int ret = worker->head.active ? VLC_SUCCESS : VLC_EGENERIC; vlc_mutex_unlock( &worker->lock ); return ret; }
void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p_item, input_item_meta_request_option_t i_options ) { preparser_entry_t *p_entry = malloc( sizeof(preparser_entry_t) ); if ( !p_entry ) return; p_entry->p_item = p_item; p_entry->i_options = i_options; vlc_gc_incref( p_entry->p_item ); vlc_mutex_lock( &p_preparser->lock ); INSERT_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, p_preparser->i_waiting, p_entry ); if( !p_preparser->b_live ) { if( vlc_clone_detach( NULL, Thread, p_preparser, VLC_THREAD_PRIORITY_LOW ) ) msg_Warn( p_preparser->object, "cannot spawn pre-parser thread" ); else p_preparser->b_live = true; } vlc_mutex_unlock( &p_preparser->lock ); }