You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by bl...@apache.org on 2001/12/19 22:00:04 UTC
cvs commit: jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/event DefaultQueue.java
bloritsch 01/12/19 13:00:03
Modified: src/scratchpad/org/apache/avalon/excalibur/event
DefaultQueue.java
Log:
Most efficient implementation for DefaultQueue--though still not as efficient as FixedSizeQueue
Revision Changes Path
1.5 +89 -13 jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/event/DefaultQueue.java
Index: DefaultQueue.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/event/DefaultQueue.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DefaultQueue.java 2001/12/19 14:08:39 1.4
+++ DefaultQueue.java 2001/12/19 21:00:03 1.5
@@ -7,7 +7,7 @@
*/
package org.apache.avalon.excalibur.event;
-import java.util.ArrayList;
+import org.apache.avalon.excalibur.collections.CircularBuffer;
import org.apache.avalon.excalibur.concurrent.Mutex;
/**
@@ -18,33 +18,88 @@
*/
public final class DefaultQueue extends AbstractQueue
{
- private final ArrayList m_elements;
+ private final CircularBuffer m_elements;
private final Mutex m_mutex;
+ private int m_reserve;
+ private final int m_maxSize;
- public DefaultQueue()
+ public DefaultQueue( int size )
{
- m_elements = new ArrayList();
+ int maxSize;
+
+ if ( size > 0 )
+ {
+ m_elements = new CircularBuffer( size );
+ maxSize = size;
+ }
+ else
+ {
+ m_elements = new CircularBuffer();
+ maxSize = -1;
+ }
+
m_mutex = new Mutex();
+ m_reserve = 0;
+ m_maxSize = maxSize;
+ }
+
+ public DefaultQueue()
+ {
+ this( -1 );
}
public int size()
+ {
+ return m_elements.getContentSize();
+ }
+
+ public int maxSize()
{
- return m_elements.size();
+ return m_maxSize;
}
public PreparedEnqueue prepareEnqueue( final QueueElement[] elements )
throws SourceException
{
- return new DefaultPreparedEnqueue( this, elements );
+ PreparedEnqueue enqueue = null;
+
+ try
+ {
+ m_mutex.acquire();
+
+ if ( maxSize() > 0 && elements.length + m_reserve + size() > maxSize() )
+ {
+ throw new SourceFullException("Not enough room to enqueue these elements.");
+ }
+
+ enqueue = new DefaultPreparedEnqueue( this, elements );
+ }
+ catch ( InterruptedException ie )
+ {
+ }
+ finally
+ {
+ m_mutex.release();
+ }
+
+ return enqueue;
}
public boolean tryEnqueue( final QueueElement element )
{
boolean success = false;
+
try
{
m_mutex.acquire();
- success = m_elements.add( element );
+
+ if ( maxSize() > 0 && 1 + m_reserve + size() > maxSize() )
+ {
+ return false;
+ }
+
+ m_elements.append( element );
+ success = true;
}
catch ( InterruptedException ie )
{
@@ -65,10 +120,14 @@
try
{
m_mutex.acquire();
+ if ( maxSize() > 0 && elements.length + m_reserve + size() > maxSize() )
+ {
+ throw new SourceFullException("Not enough room to enqueue these elements.");
+ }
for ( int i = 0; i < len; i++ )
{
- m_elements.add( elements[i] );
+ m_elements.append( elements[i] );
}
}
catch ( InterruptedException ie )
@@ -86,7 +145,12 @@
try
{
m_mutex.acquire();
- m_elements.add( element );
+ if ( maxSize() > 0 && 1 + m_reserve + size() > maxSize() )
+ {
+ throw new SourceFullException("Not enough room to enqueue these elements.");
+ }
+
+ m_elements.append( element );
}
catch ( InterruptedException ie )
{
@@ -112,11 +176,16 @@
{
m_mutex.attempt( m_timeout );
+ if ( size() < numElements )
+ {
+ arraySize = size();
+ }
+
elements = new QueueElement[ arraySize ];
for ( int i = 0; i < arraySize; i++ )
{
- elements[i] = (QueueElement) m_elements.remove( 0 );
+ elements[i] = (QueueElement) m_elements.get();
}
}
catch ( InterruptedException ie )
@@ -137,9 +206,13 @@
try
{
m_mutex.attempt( m_timeout );
+
+ elements = new QueueElement[ size() ];
- elements = (QueueElement[]) m_elements.toArray( new QueueElement [] {} );
- m_elements.clear();
+ for ( int i = 0; i < elements.length; i++ )
+ {
+ elements[i] = (QueueElement) m_elements.get();
+ }
}
catch ( InterruptedException ie )
{
@@ -162,7 +235,7 @@
if ( size() > 0 )
{
- element = (QueueElement) m_elements.remove( 0 );
+ element = (QueueElement) m_elements.get();
}
}
catch ( InterruptedException ie )
@@ -187,6 +260,7 @@
m_elements = elements;
}
+
public void commit()
{
if ( null == m_elements )
@@ -197,6 +271,7 @@
try
{
m_parent.enqueue( m_elements );
+ m_parent.m_reserve -= m_elements.length;
m_elements = null;
}
catch (Exception e)
@@ -213,6 +288,7 @@
throw new IllegalStateException("This PreparedEnqueue has already been processed!");
}
+ m_parent.m_reserve -= m_elements.length;
m_elements = null;
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>