Ignore:
Timestamp:
Jan 12, 2006, 6:29:20 PM (15 years ago)
Author:
root
Message:

Update 2005-11-17

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/fdlimit.c

    r1 r3  
    3535#define STATUS_UNUSED  2
    3636#define STATUS_USED    4
     37#define STATUS_CLOSING 8
    3738    int        status;
    3839
     
    112113            !strcmp( path, f->open[i].path ) )
    113114        {
     115            if( f->open[i].status & STATUS_CLOSING )
     116            {
     117                /* Wait until the file is closed */
     118                tr_lockUnlock( f->lock );
     119                tr_wait( 10 );
     120                tr_lockLock( f->lock );
     121                i = -1;
     122                continue;
     123            }
    114124            winner = i;
    115125            goto done;
     
    135145        for( i = 0; i < TR_MAX_OPEN_FILES; i++ )
    136146        {
    137             if( f->open[i].status & STATUS_USED )
     147            if( !( f->open[i].status & STATUS_UNUSED ) )
    138148            {
    139149                continue;
     
    148158        if( winner >= 0 )
    149159        {
     160            /* Close the file: we mark it as closing then release the
     161               lock while doing so, because fclose may take same time
     162               and we don't want to block other threads */
    150163            tr_dbg( "Closing %s", f->open[winner].path );
     164            f->open[winner].status = STATUS_CLOSING;
     165            tr_lockUnlock( f->lock );
    151166            fclose( f->open[winner].file );
     167            tr_lockLock( f->lock );
    152168            goto open;
    153169        }
Note: See TracChangeset for help on using the changeset viewer.