Advertisement
Nik

Untitled

Nik
Oct 28th, 2012
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.42 KB | None | 0 0
  1. Index: L2GameClient.java
  2. ===================================================================
  3. --- L2GameClient.java   (revision 895)
  4. +++ L2GameClient.java   (working copy)
  5. @@ -20,6 +20,8 @@
  6.  import java.sql.Connection;
  7.  import java.sql.PreparedStatement;
  8.  import java.sql.ResultSet;
  9. +import java.util.LinkedHashSet;
  10. +import java.util.Set;
  11.  import java.util.concurrent.ArrayBlockingQueue;
  12.  import java.util.concurrent.Future;
  13.  import java.util.concurrent.RejectedExecutionException;
  14. @@ -116,6 +118,8 @@
  15.    
  16.     private final ArrayBlockingQueue<ReceivablePacket<L2GameClient>> _packetQueue;
  17.     private final ReentrantLock _queueLock = new ReentrantLock();
  18. +   protected final Set<ServerPacketSendThread> _serverPacketQueue;
  19. +   protected final ReentrantLock _serverPacketQueueLock = new ReentrantLock();
  20.    
  21.     private int[][] trace;
  22.    
  23. @@ -128,6 +132,7 @@
  24.         _stats = new ClientStats();
  25.        
  26.         _packetQueue = new ArrayBlockingQueue<>(Config.CLIENT_PACKET_QUEUE_SIZE);
  27. +       _serverPacketQueue = new LinkedHashSet<>();
  28.        
  29.         try
  30.         {
  31. @@ -277,6 +282,11 @@
  32.             return;
  33.         }
  34.        
  35. +       if (gsp.waitForOtherPackets() > 0)
  36. +       {
  37. +           new ServerPacketSendThread(gsp).run();
  38. +       }
  39. +      
  40.         getConnection().sendPacket(gsp);
  41.         gsp.runImpl();
  42.     }
  43. @@ -855,6 +865,56 @@
  44.         }
  45.     }
  46.    
  47. +   protected class ServerPacketSendThread extends Thread
  48. +   {
  49. +       L2GameServerPacket _packet;
  50. +       protected ServerPacketSendThread(L2GameServerPacket packet)
  51. +       {
  52. +           _packet = packet;
  53. +       }
  54. +      
  55. +       @Override
  56. +       public void run()
  57. +       {
  58. +           try
  59. +           {
  60. +               _serverPacketQueueLock.lock();
  61. +              
  62. +               if (_serverPacketQueue.add(this))
  63. +               {
  64. +                   // Unlock because the thread is going to sleep, we dont want the lock to sleep too :P
  65. +                   _serverPacketQueueLock.unlock();
  66. +                  
  67. +                   try
  68. +                   {
  69. +                       sleep(_packet.waitForOtherPackets());
  70. +                   }
  71. +                   catch (InterruptedException e)
  72. +                   {
  73. +                       _log.log(Level.WARNING, "Packet send interrupted while waiting: ", e);
  74. +                   }
  75. +                  
  76. +                   getConnection().sendPacket(_packet);
  77. +                   _packet.runImpl();
  78. +                  
  79. +                   // Lock again to make sure we properly remove this
  80. +                   _serverPacketQueueLock.lock();
  81. +                   _serverPacketQueue.remove(this);
  82. +               }
  83. +           }
  84. +           finally
  85. +           {
  86. +               _serverPacketQueueLock.unlock();
  87. +           }
  88. +       }
  89. +      
  90. +       @Override
  91. +       public boolean equals(Object obj)
  92. +       {
  93. +           return _packet.equals(obj);
  94. +       }
  95. +   }
  96. +  
  97.     protected class CleanupTask implements Runnable
  98.     {
  99.         @Override
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement