Changeset fdb990bd55f690131f00a443f187577fc82c8aa6

Show
Ignore:
Timestamp:
01/21/08 21:35:19 (8 months ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1200947719 +0000
git-parent:

[d9b511137a52356cbf7941abd1e6a46ea078f9bc]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1200947719 +0000
Message:

Remove potential deadlocks in waitpipe with net_*

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/misc/objects.c

    rd9b5111 rfdb990b  
    556556        vlc_spin_lock (&internals->spin); 
    557557        signaled = internals->b_signaled; 
    558         if ((!signaled) && (internals->pipes[0] == -1)
     558        if (internals->pipes[0] == -1
    559559        { 
    560560            internals->pipes[0] = pfd[0]; 
    561561            internals->pipes[1] = pfd[1]; 
    562562        } 
     563        else 
     564            race = VLC_TRUE; 
    563565    } 
    564566    vlc_spin_unlock (&internals->spin); 
    565567 
    566     if (race || signaled
    567     { 
     568    if (race
     569    {   /* Race condition: two threads call pipe() - unlikely */ 
    568570        close (pfd[0]); 
    569571        close (pfd[1]); 
    570  
    571         if (signaled) 
    572         {   /* vlc_object_signal() was already invoked! */ 
    573             errno = EINTR; 
    574             return -1; 
    575         } 
    576     } 
     572    } 
     573 
     574    if (signaled) 
     575        /* Race condition: lc_object_signal() already invoked! */ 
     576        while (write (internals->pipes[1], &(char){ 0 }, 1) < 0); 
    577577 
    578578    return internals->pipes[0]; 
  • src/network/io.c

    r98a7a01 rfdb990b  
    259259 * Reads from a network socket. 
    260260 * If waitall is true, then we repeat until we have read the right amount of 
    261  * data; in that case, a short count means EOF has been reached. 
     261 * data; in that case, a short count means EOF has been reached or the VLC 
     262 * object has been signaled. 
    262263 *****************************************************************************/ 
    263264ssize_t 
     
    271272    }; 
    272273 
    273     vlc_object_lock (p_this); 
    274     ufd[1].fd = vlc_object_waitpipe (p_this); 
    275  
    276274    while (i_buflen > 0) 
    277275    { 
    278276        int val; 
    279277 
    280         if (!vlc_object_alive (p_this)) 
    281         { 
    282 #if defined(WIN32) || defined(UNDER_CE) 
    283             WSASetLastError (WSAEINTR); 
    284 #else 
    285             errno = EINTR; 
    286 #endif 
    287             goto error; 
     278        ufd[1].fd = vlc_object_waitpipe (p_this); 
     279        if (ufd[1].fd == -1) 
     280        { 
    288281        } 
    289282        ufd[0].revents = ufd[1].revents = 0; 
    290283 
    291         vlc_object_unlock (p_this); 
    292284        val = poll (ufd, sizeof (ufd) / sizeof (ufd[0]), -1); 
    293         vlc_object_lock (p_this); 
    294285 
    295286        if (val < 0) 
     
    299290        { 
    300291            msg_Dbg (p_this, "socket %d polling interrupted", fd); 
    301             vlc_object_wait (p_this); 
    302             msg_Dbg (p_this, "socket %d polling restarting", fd); 
    303             continue; 
     292            if (i_total == 0) 
     293            { 
     294#if defined(WIN32) || defined(UNDER_CE) 
     295                WSASetLastError (WSAEINTR); 
     296#else 
     297                errno = EINTR; 
     298#endif 
     299                goto error; 
     300            } 
     301            break; 
    304302        } 
    305303 
     
    379377    } 
    380378 
    381     vlc_object_unlock (p_this); 
    382379    return i_total; 
    383380 
    384381error: 
    385382    msg_Err (p_this, "Read error: %m"); 
    386  
    387     vlc_object_unlock (p_this); 
    388383    return -1; 
    389384} 
  • src/network/tcp.c

    rcc227c7 rfdb990b  
    287287    assert( pi_fd != NULL ); 
    288288 
    289     vlc_object_lock (p_this); 
    290289    evfd = vlc_object_waitpipe (p_this); 
    291290 
    292     while (vlc_object_alive (p_this)
     291    for (;;
    293292    { 
    294293        unsigned n = 0; 
     
    304303            ufd[i].revents = 0; 
    305304        } 
    306  
    307         vlc_object_unlock (p_this); 
     305        if (evfd == -1) 
     306            n--; /* avoid EBADF */ 
     307 
    308308        switch (poll (ufd, n, timeout)) 
    309309        { 
     
    314314                return -1; /* NOTE: p_this already unlocked */ 
    315315        } 
    316         vlc_object_lock (p_this); 
    317316 
    318317        if (ufd[n].revents) 
    319318        { 
    320             vlc_object_wait (p_this); 
    321319            errno = EINTR; 
    322320            break; 
     
    339337            memmove (pi_fd + i, pi_fd + i + 1, n - (i + 1)); 
    340338            pi_fd[n - 1] = sfd; 
    341             vlc_object_unlock (p_this); 
    342339            return fd; 
    343340        } 
    344341    } 
    345     vlc_object_unlock (p_this); 
    346342    return -1; 
    347343}