Ignore:
Timestamp:
Jan 21, 2007, 7:42:11 PM (15 years ago)
Author:
titer
Message:

More simplifications

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/fdlimit.c

    r1420 r1425  
    102102    for( j = 0; j < i; j++ )
    103103    {
    104         tr_netClose( s[j] );
     104#ifdef BEOS_NETSERVER
     105            closesocket( s[j] );
     106#else
     107            close( s[j] );
     108#endif
    105109    }
    106110
     
    261265}
    262266
    263 /***********************************************************************
    264  * tr_fdSocketWillCreate
    265  **********************************************************************/
    266 int tr_fdSocketWillCreate( int reserved )
    267 {
    268     int ret;
    269 
    270     tr_lockLock( &gFd->lock );
    271 
    272     if( reserved )
    273     {
    274         if( gFd->reserved < TR_RESERVED_FDS )
    275         {
    276             ret = 0;
    277             (gFd->reserved)++;
    278         }
     267
     268/***********************************************************************
     269 * Sockets
     270 **********************************************************************/
     271typedef struct
     272{
     273    int socket;
     274    int priority;
     275}
     276tr_socket_t;
     277
     278/* Remember the priority of every socket we open, so that we can keep
     279 * track of how many reserved file descriptors we are using */
     280static tr_socket_t * gSockets = NULL;
     281static int gSocketsSize = 0;
     282static int gSocketsCount = 0;
     283static void SocketSetPriority( int s, int priority )
     284{
     285    if( gSocketsSize < 1 )
     286    {
     287        gSocketsSize = 256;
     288        gSockets = malloc( gSocketsSize * sizeof( tr_socket_t ) );
     289    }
     290    if( gSocketsSize <= gSocketsCount )
     291    {
     292        gSocketsSize *= 2;
     293        gSockets = realloc( gSockets, gSocketsSize * sizeof( tr_socket_t ) );
     294    }
     295    gSockets[gSocketsCount].socket = s;
     296    gSockets[gSocketsCount].priority = priority;
     297    gSocketsCount++;
     298}
     299static int SocketGetPriority( int s )
     300{
     301    int i, ret;
     302    for( i = 0; i < gSocketsCount; i++ )
     303        if( gSockets[i].socket == s )
     304            break;
     305    if( i >= gSocketsCount )
     306    {
     307        tr_err( "could not find that socket (%d)!", s );
     308        return -1;
     309    }
     310    ret = gSockets[i].priority;
     311    gSocketsCount--;
     312    memmove( &gSockets[i], &gSockets[i+1],
     313            ( gSocketsCount - i ) * sizeof( tr_socket_t ) );
     314}
     315
     316/***********************************************************************
     317 * tr_fdSocketCreate
     318 **********************************************************************/
     319int tr_fdSocketCreate( int type, int priority )
     320{
     321    int s = -1;
     322
     323    tr_lockLock( &gFd->lock );
     324    if( ( priority && gFd->reserved < TR_RESERVED_FDS ) ||
     325        ( !priority && gFd->normal < gFd->normalMax ) )
     326    {
     327       if( ( s = socket( AF_INET, type, 0 ) ) < 0 )
     328       {
     329           tr_err( "Could not create socket (%s)", strerror( errno ) );
     330       }
     331    }
     332    if( s > -1 )
     333    {
     334        SocketSetPriority( s, priority );
     335        if( priority )
     336            gFd->reserved++;
    279337        else
    280         {
    281             ret = 1;
    282         }
    283     }
     338            gFd->normal++;
     339    }
     340    tr_lockUnlock( &gFd->lock );
     341
     342    return s;
     343}
     344
     345int tr_fdSocketAccept( int b, struct in_addr * addr, in_port_t * port )
     346{
     347    int s = -1;
     348    unsigned len;
     349    struct sockaddr_in sock;
     350
     351    tr_lockLock( &gFd->lock );
     352    if( gFd->normal < gFd->normalMax )
     353    {
     354        len = sizeof( sock );
     355        s = accept( b, (struct sockaddr *) &sock, &len );
     356    }
     357    if( s > -1 )
     358    {
     359        SocketSetPriority( s, 0 );
     360        *addr = sock.sin_addr;
     361        *port = sock.sin_port;
     362        gFd->normal++;
     363    }
     364    tr_lockUnlock( &gFd->lock );
     365
     366    return s;
     367}
     368
     369/***********************************************************************
     370 * tr_fdSocketClose
     371 **********************************************************************/
     372void tr_fdSocketClose( int s )
     373{
     374    tr_lockLock( &gFd->lock );
     375#ifdef BEOS_NETSERVER
     376    closesocket( s );
     377#else
     378    close( s );
     379#endif
     380    if( SocketGetPriority( s ) )
     381        gFd->reserved--;
    284382    else
    285     {
    286         if( gFd->normal < gFd->normalMax )
    287         {
    288             ret = 0;
    289             (gFd->normal)++;
    290         }
    291         else
    292         {
    293             ret = 1;
    294         }
    295     }
    296 
    297     tr_lockUnlock( &gFd->lock );
    298 
    299     return ret;
    300 }
    301 
    302 /***********************************************************************
    303  * tr_fdSocketClosed
    304  **********************************************************************/
    305 void tr_fdSocketClosed( int reserved )
    306 {
    307     tr_lockLock( &gFd->lock );
    308 
    309     if( reserved )
    310     {
    311         (gFd->reserved)--;
    312     }
    313     else
    314     {
    315         (gFd->normal)--;
    316     }
    317 
     383        gFd->normal--;
    318384    tr_lockUnlock( &gFd->lock );
    319385}
Note: See TracChangeset for help on using the changeset viewer.