[hornetq-commits] JBoss hornetq SVN: r8371 - branches/ClebertCallback/src/main/org/hornetq/core/journal/impl.

do-not-reply at jboss.org do-not-reply at jboss.org
Sun Nov 22 22:30:52 EST 2009


Author: clebert.suconic at jboss.com
Date: 2009-11-22 22:30:52 -0500 (Sun, 22 Nov 2009)
New Revision: 8371

Modified:
   branches/ClebertCallback/src/main/org/hornetq/core/journal/impl/TimedBuffer.java
Log:
Improving flush time for NIO with callbacks

Modified: branches/ClebertCallback/src/main/org/hornetq/core/journal/impl/TimedBuffer.java
===================================================================
--- branches/ClebertCallback/src/main/org/hornetq/core/journal/impl/TimedBuffer.java	2009-11-23 02:51:06 UTC (rev 8370)
+++ branches/ClebertCallback/src/main/org/hornetq/core/journal/impl/TimedBuffer.java	2009-11-23 03:30:52 UTC (rev 8371)
@@ -259,36 +259,55 @@
       }
    }
 
-   public synchronized void flush()
+   public void flush()
    {
-      if (buffer.writerIndex() > 0)
+      ByteBuffer bufferToFlush = null;
+      
+      boolean useSync = false;
+      
+      List<IOAsyncTask> callbacksToCall = null;
+      
+      synchronized (this)
       {
-         latchTimer.up();
+         if (buffer.writerIndex() > 0)
+         {
+            latchTimer.up();
+   
+            int pos = buffer.writerIndex();
+   
+            if (logRates)
+            {
+               bytesFlushed += pos;
+            }
+   
+            bufferToFlush = bufferObserver.newBuffer(bufferSize, pos);
+   
+            // Putting a byteArray on a native buffer is much faster, since it will do in a single native call.
+            // Using bufferToFlush.put(buffer) would make several append calls for each byte
+   
+            bufferToFlush.put(buffer.array(), 0, pos);
 
-         int pos = buffer.writerIndex();
-
-         if (logRates)
-         {
-            bytesFlushed += pos;
+            callbacksToCall = callbacks;
+            
+            callbacks = new LinkedList<IOAsyncTask>();
+   
+            useSync = pendingSync;
+            
+            active = false;
+            pendingSync = false;
+   
+            buffer.clear();
+            bufferLimit = 0;
          }
+      }
+      
+      // Execute the flush outside of the lock
+      // This is important for NIO performance while we are using NIO Callbacks
+      if (bufferToFlush != null)
+      {
+         bufferObserver.flushBuffer(bufferToFlush, useSync, callbacksToCall);
+      }
 
-         ByteBuffer directBuffer = bufferObserver.newBuffer(bufferSize, pos);
-
-         // Putting a byteArray on a native buffer is much faster, since it will do in a single native call.
-         // Using directBuffer.put(buffer) would make several append calls for each byte
-
-         directBuffer.put(buffer.array(), 0, pos);
-
-         bufferObserver.flushBuffer(directBuffer, pendingSync, callbacks);
-
-         callbacks = new LinkedList<IOAsyncTask>();
-
-         active = false;
-         pendingSync = false;
-
-         buffer.clear();
-         bufferLimit = 0;
-      }
    }
 
    // Package protected ---------------------------------------------



More information about the hornetq-commits mailing list