Changeset ace8caefad8be422bc4b478d4c8b2474189801f0

Show
Ignore:
Timestamp:
22/06/08 14:30:30 (6 months ago)
Author:
Rémi Denis-Courmont <rdenis@simphalempin.com>
git-committer:
Rémi Denis-Courmont <rdenis@simphalempin.com> 1214137830 +0300
git-parent:

[6c790747f3847ae2c88a03d6a053968143ad76e6]

git-author:
Rémi Denis-Courmont <rdenis@simphalempin.com> 1214137830 +0300
Message:

LibVLC: wait until all threads are terminated

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/libvlc.c

    r57c3ecd race8cae  
    198198    vlc_mutex_init( &priv->config_lock ); 
    199199 
     200    priv->threads_count = 0; 
     201    vlc_mutex_init (&priv->threads_lock); 
     202    vlc_cond_init (NULL, &priv->threads_wait); 
     203 
    200204    /* Store data for the non-reentrant API */ 
    201205    p_static_vlc = p_libvlc; 
     
    987991#endif 
    988992 
     993    /* Make sure all threads are completed before we start looking for 
     994     * reference leaks and deinitializing core LibVLC subsytems. */ 
     995    vlc_mutex_lock (&priv->threads_lock); 
     996    while (priv->threads_count) 
     997    { 
     998        msg_Dbg (p_libvlc, "waiting for %u remaining threads", 
     999                 priv->threads_count); 
     1000        vlc_cond_wait (&priv->threads_wait, &priv->threads_lock); 
     1001    } 
     1002    vlc_mutex_unlock (&priv->threads_lock); 
     1003 
    9891004    bool b_clean = true; 
    9901005    FOREACH_ARRAY( input_item_t *p_del, priv->input_items ) 
     
    10671082    vlc_mutex_destroy( &priv->config_lock ); 
    10681083    vlc_mutex_destroy( &priv->timer_lock ); 
     1084    vlc_cond_destroy (&priv->threads_wait); 
     1085    vlc_mutex_destroy (&priv->threads_lock); 
    10691086 
    10701087    if( b_release ) vlc_object_release( p_libvlc ); 
  • src/libvlc.h

    r5277e0f race8cae  
    245245                                          /// (needs cleanup) 
    246246 
     247    /* Singleton objects */ 
    247248    module_t          *p_memcpy_module;  ///< Fast memcpy plugin used 
    248249    playlist_t        *p_playlist; //< the playlist singleton 
     
    253254    /* Private playlist data (FIXME - playlist_t is too public...) */ 
    254255    sout_instance_t   *p_sout; ///< kept sout instance (for playlist) 
     256 
     257    /* Thread support */ 
     258    unsigned           threads_count; 
     259    vlc_mutex_t        threads_lock; 
     260    vlc_cond_t         threads_wait; 
    255261} libvlc_priv_t; 
    256262 
  • src/misc/threads.c

    r7e413aa race8cae  
    468468    func (obj); 
    469469    msg_Dbg (obj, "thread ended"); 
     470 
     471    libvlc_priv_t *libpriv = libvlc_priv (obj->p_libvlc); 
     472    vlc_mutex_lock (&libpriv->threads_lock); 
     473    if (--libpriv->threads_count == 0) 
     474        vlc_cond_signal (&libpriv->threads_wait); 
     475    vlc_mutex_unlock (&libpriv->threads_lock); 
    470476    return THREAD_RVAL; 
    471477} 
     
    483489    int i_ret; 
    484490    vlc_object_internals_t *p_priv = vlc_internals( p_this ); 
     491    libvlc_priv_t *libpriv = libvlc_priv (p_this->p_libvlc); 
    485492 
    486493    struct vlc_thread_boot *boot = malloc (sizeof (*boot)); 
     
    489496    boot->entry = func; 
    490497    boot->object = p_this; 
     498 
     499    vlc_mutex_lock (&libpriv->threads_lock); 
     500    libpriv->threads_count++; 
     501    vlc_mutex_unlock (&libpriv->threads_lock); 
    491502 
    492503    vlc_object_lock( p_this ); 
     
    597608 
    598609    vlc_object_unlock( p_this ); 
     610 
     611    if (i_ret) 
     612    { 
     613        vlc_mutex_lock (&libpriv->threads_lock); 
     614        if (--libpriv->threads_count == 0) 
     615            vlc_cond_signal (&libpriv->threads_wait); 
     616        vlc_mutex_unlock (&libpriv->threads_lock); 
     617    } 
    599618    return i_ret; 
    600619}