All pastes #277448 Raw Edit

Someone

public text v1 · immutable
·published 2006-12-13 05:38 UTC
rendered paste body
static void
metasort( void )
/* Sort the server list in a manner similiar to how the metaserver
   sorts the servers.  Useful for when the order of servers in the
   UDP metacache does not reflect the current player counts.  Or when
   a request for updated server stats make one server more populated
   than it was before */
{
    struct servers *sp;
    char tempaddress[LINE];
    int tempport, tempage;
    time_t tempwhen;
    int temprefresh, templifetime, tempplayers, tempstatus;
    char temptypeflag;
    char tempcomment[LINE];
#ifdef METAPING
    u_long tempip_addr;
    DWORD temppkt_rtt[RTT_AVG_BUFLEN];
#endif
    int i, j, change;

    /* Tracks if we performed a sorting action */
    change = 0;

    /* Only need to sort to the 2nd to last server, since we compare that
       server to the one above it on the list. */
    for (i = 0; i < (num_servers - 1); i++)
    {
        sp = serverlist;
        
        /* Sorting order is: status, then player_count/queue_size */
        
        /* If status is equal, the server with more players should be higher */
        if (serverlist[i].status == serverlist[i+1].status)
        {
            if (serverlist[i].players > serverlist[i+1].players)
                change = 1;
        }
        else
        {
            /* If the server above it has a wait queue, don't swap. */
            if (serverlist[i+1].status != statusWait)
            {
            	/* Server has wait queue?  Swap up (since we know the one above
            	   doesn't have a queue */
                if (serverlist[i].status == statusWait)
                    change = 1;
                /* Server has lower status?  Swap up */
                else if (serverlist[i].status < serverlist[i+1].status)
                    change = 1;
            }  
        }
        if (change)
        {
            /* Copy bottom entry (i) into temp space */
            strcpy (tempaddress, serverlist[i].address);
            tempport = serverlist[i].port;
            tempage = serverlist[i].age;
            tempwhen = serverlist[i].when;
            temprefresh = serverlist[i].refresh;
            templifetime = serverlist[i].lifetime;
            tempplayers = serverlist[i].players;
            tempstatus = serverlist[i].status;
            temptypeflag = serverlist[i].typeflag;
            strcpy (tempcomment, serverlist[i].comment);
#ifdef METAPING
            tempip_addr = serverlist[i].ip_addr;
            for (j = 0; j < RTT_AVG_BUFLEN; j++)
                temppkt_rtt[j] = serverlist[i].pkt_rtt[j];
#endif
            /* Move top entry (i+1) into bottom entry (i) */
            strcpy (serverlist[i].address, serverlist[i+1].address);
            serverlist[i].port = serverlist[i+1].port;
            serverlist[i].age = serverlist[i+1].age;
            serverlist[i].when = serverlist[i+1].when;
            serverlist[i].refresh = serverlist[i+1].refresh;
            serverlist[i].lifetime = serverlist[i+1].lifetime;
            serverlist[i].players = serverlist[i+1].players;
            serverlist[i].status = serverlist[i+1].status;
            serverlist[i].typeflag = serverlist[i+1].typeflag;
            strcpy (serverlist[i].comment, serverlist[i+1].comment);
#ifdef METAPING
            serverlist[i].ip_addr = serverlist[i+1].ip_addr;
            for (j = 0; j < RTT_AVG_BUFLEN; j++)
                serverlist[i].pkt_rtt[j] = serverlist[i+1].pkt_rtt[j];
#endif
            /* Copy temp entry into top entry (i+1) */
            strcpy (serverlist[i+1].address, tempaddress);
            serverlist[i+1].port = tempport;
            serverlist[i+1].age = tempage;
            serverlist[i+1].when = tempwhen;
            serverlist[i+1].refresh = temprefresh;
            serverlist[i+1].lifetime = templifetime;
            serverlist[i+1].players = tempplayers;
            serverlist[i+1].status = tempstatus;
            serverlist[i+1].typeflag = temptypeflag;
            strcpy (serverlist[i+1].comment, tempcomment);
#ifdef METAPING
            serverlist[i+1].ip_addr = tempip_addr;
            for (j = 0; j < RTT_AVG_BUFLEN; j++)
                serverlist[i+1].pkt_rtt[j] = temppkt_rtt[j];
#endif
            /* Start back at beginning - could be more efficient */
            i = 0;	
            change = 0;
        }
    }
}