Changeset 584

Show
Ignore:
Timestamp:
05/30/08 10:05:41 (7 months ago)
Author:
LeoD
Message:

comparing each client's sync checks on the server

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/defend/game/Game.d

    r583 r584  
    88 
    99import engine.core.TaskManager; 
     10import engine.math.Vector; 
    1011import engine.input.Input; 
    1112import engine.rend.Renderer; 
  • trunk/src/defend/game/net/Server.d

    r583 r584  
    5656    // Sync checks 
    5757    Queue!(SyncCheckInfo) syncChecks; 
     58    Mutex syncCheckMutex; 
    5859     
    5960    // Update thread 
     
    280281    void onSyncCheck(MessageSyncCheck* message) 
    281282    { 
    282         synchronized 
     283        synchronized(syncCheckMutex) 
    283284            syncChecks.push(message.info); 
    284285         
    285         debug(networking) 
    286             logger.info("check({}:{}): {}", 
     286        version(none) debug(networking) 
     287            logger.spam("check({}:{}): {}", 
    287288                        message.info.file, message.info.line, 
    288289                        message.info.number);    
     
    312313         
    313314        syncChecks.create(2000); 
     315        syncCheckMutex = new Mutex; 
    314316         
    315317        logger = Log.getLogger("server.client.handler." ~ Integer.toString(id)); 
     
    578580    } 
    579581     
     582    // Check for out of sync 
     583    void compareSyncChecks() 
     584    { 
     585        if(cm.numberClients == 1) 
     586            return; 
     587             
     588        foreach(client; cm) 
     589            client.syncCheckMutex.lock(); 
     590             
     591        scope(exit) 
     592        { 
     593            foreach(client; cm) 
     594                client.syncCheckMutex.unlock(); 
     595        } 
     596         
     597        ClientHandler firstClient; 
     598             
     599        foreach(client; cm) 
     600        { 
     601            firstClient = client; 
     602            break; 
     603        } 
     604 
     605        while(firstClient.syncChecks.count) 
     606        { 
     607            SyncCheckInfo info; 
     608 
     609            { 
     610                info = firstClient.syncChecks.top(); 
     611                 
     612                if(info.phase > minPhase) 
     613                    break; 
     614                     
     615                firstClient.syncChecks.pop(); 
     616            } 
     617             
     618            foreach(client; cm) 
     619            { 
     620                if(client is firstClient) 
     621                    continue; 
     622                 
     623                auto check = client.syncChecks.pop(); 
     624                 
     625                if(check.phase != info.phase || 
     626                   check.line != info.line || 
     627                   check.number != info.number) 
     628                { 
     629                    logger.fatal("out of sync: {} vs. {}", check, info); 
     630                    assert(false); 
     631                } 
     632            } 
     633        } 
     634    } 
     635     
    580636    // Calculates the number of simulation steps for a phase's length 
    581637    ushort numberSimulationSteps(ushort length) 
     
    600656                synchronized(phaseMutex) if(currentPhase - minPhase <= 2) 
    601657                { 
    602                     // TODO: Compare sync checks 
     658                    compareSyncChecks(); 
    603659                     
    604660                    int length; 
  • trunk/src/defend/mp/Gateway.d

    r583 r584  
    11module defend.mp.Gateway; 
     2 
     3import tango.util.Convert; 
    24 
    35import engine.math.Vector; 
     
    1214} 
    1315 
    14 //debug = syncChecks; 
     16debug = syncChecks; 
    1517 
    1618struct SyncCheckInfo 
     
    2224     
    2325    uint number; 
     26     
     27    char[] toString() 
     28    { 
     29        return "phase: " ~ to!(char[])(phase) ~ "; file: " ~ file ~ 
     30               "; line: " ~to!(char[])(line) ~ "; number: " ~ to!(char[])(number); 
     31    } 
    2432} 
    2533 
  • trunk/src/defend/mp/PlayerManager.d

    r583 r584  
    3535        players[info.id].info = info; 
    3636 
    37         logger.info("player list entry: {}", info); 
     37        logger.info("new player: {}", info); 
    3838    } 
    3939 
     
    4242        logger.info("player {} disconnected", id); 
    4343 
    44         assert(isPlayer(id), "player does not exist"); 
     44        assert(isPlayer(id), "player doesn't exist, though"); 
    4545        players[id] = null; 
    4646    } 
  • trunk/src/defend/mp/Types.d

    r583 r584  
    11module defend.mp.Types; 
    22 
    3 public import engine.math.Vector; 
     3import engine.math.Vector; 
    44 
    55alias ushort object_id_t; 
  • trunk/src/defend/sim/Core.d

    r583 r584  
    2828import defend.Config; 
    2929import defend.terrain.Map; 
    30 public { import defend.sim.Effector; } 
    3130import defend.sim.Simulation; 
    3231import defend.mp.PlayerManager; 
     
    3433import defend.mp.Phase; 
    3534import defend.mp.Gateway; 
     35 
     36public 
     37{ 
     38    import defend.sim.Effector; 
     39} 
    3640 
    3741// TODO: Find a way to split this file into multiple files, without circular imports. 
     
    13311335        assert(!queueOrders); 
    13321336        queueOrders = true; 
     1337         
     1338        debug(gameobjects) 
     1339            logger.trace("queuing orders"); 
    13331340    } 
    13341341     
     
    13371344        assert(queueOrders); 
    13381345        queueOrders = false; 
     1346     
     1347        debug(gameobjects) 
     1348            logger.trace("sending {} queued orders", orderQueue.length); 
    13391349         
    13401350        foreach(container; orderQueue) 
  • trunk/src/engine/util/Log.d

    r583 r584  
    110110        synchronized(Stdout) 
    111111        { 
    112             Stdout("[ "); 
    113             Stdout(logger); 
     112            Stdout("-+*!@"[level]); 
     113            Stdout(" [ ")(); 
     114            Stdout(logger)(); 
    114115            Stdout(" ] "); 
    115116            Stdout(text).newline;