bloritsch 02/02/15 12:12:10
Modified: src/java/org/apache/avalon/excalibur/component
ExcaliburComponentManager.java
ExcaliburComponentSelector.java
Added: src/java/org/apache/avalon/excalibur/collections
BucketMap.java
Log:
reduce load on ECM by 50%
Revision Changes Path
1.1
jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/collections/BucketMap.java
Index: BucketMap.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.avalon.excalibur.collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
/**
* A BucketMap is an efficient ThreadSafe implementation of a Map. The
* map only supports get(), put(), and contains().
*
* @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/02/15 20:12:10 $
* @since 4.0
*/
public final class BucketMap
{
private static final int DEFAULT_BUCKETS = 256;
private final Node[] m_buckets;
private final Object[] m_locks;
/**
*/
public BucketMap()
{
this( DEFAULT_BUCKETS );
}
public BucketMap( int numBuckets )
{
int size = ( numBuckets >= 16 ) ? numBuckets : 16;
m_buckets = new Node[size];
m_locks = new Object[size];
for ( int i = 0; i < size; i++ )
{
m_locks[i] = new Object();
}
}
private final int getHash( Object key )
{
final int hash = key.hashCode() % m_buckets.length;
return (hash < 0) ? hash * -1 : hash;
}
/**
* Add an object into the buffer.
*
* @throws BufferOverflowException if adding this element exceeds the
* buffer's capacity.
*/
public Set keySet()
{
Set keySet = new HashSet();
for (int i = 0; i < m_buckets.length; i++ )
{
synchronized( m_locks[i] )
{
Node n = m_buckets[i];
while( n != null )
{
keySet.add(n.key);
n = n.next;
}
}
}
return keySet;
}
/**
* Add an object into the buffer.
*
* @throws BufferOverflowException if adding this element exceeds the
* buffer's capacity.
*/
public void put( final Object key, final Object value )
{
if ( null == key || null == value )
{
return;
}
int hash = getHash( key );
synchronized( m_locks[hash] )
{
Node n = m_buckets[hash];
if ( n == null )
{
n = new Node();
n.key = key;
n.value = value;
m_buckets[hash] = n;
return;
}
while ( n.next != null )
{
if ( n.key.equals(key) )
{
n.value = value;
return;
}
n = n.next;
}
Node newNode = new Node();
newNode.key = key;
newNode.value = value;
n.next = newNode;
}
}
/**
* Add an object into the buffer.
*
* @throws BufferOverflowException if adding this element exceeds the
* buffer's capacity.
*/
public Object get( final Object key )
{
if ( null == key )
{
return null;
}
int hash = getHash( key );
synchronized( m_locks[hash] )
{
Node n = m_buckets[hash];
while ( n != null )
{
if ( n.key.equals(key) )
{
return n.value;
}
n = n.next;
}
}
return null;
}
/**
* Add an object into the buffer.
*
* @throws BufferOverflowException if adding this element exceeds the
* buffer's capacity.
*/
public boolean containsKey( final Object key )
{
if ( null == key )
{
return false;
}
int hash = getHash( key );
synchronized( m_locks[hash] )
{
Node n = m_buckets[hash];
while ( n != null )
{
if ( n.key.equals(key) )
{
return true;
}
n = n.next;
}
}
return false;
}
/**
* Removes the next object from the buffer.
*
* @throws BufferUnderflowException if the buffer is already empty
*/
public Object remove( Object key )
{
if ( null == key )
{
return null;
}
int hash = getHash( key );
synchronized( m_locks[hash] )
{
Node n = m_buckets[hash];
Node prev = null;
while ( n != null )
{
if ( n.key.equals( key ) )
{
if ( null == prev )
{
m_buckets[hash] = n.next;
}
else
{
prev.next = n.next;
}
return n.value;
}
prev = n;
n = n.next;
}
}
return null;
}
private final static class Node
{
protected Object key;
protected Object value;
protected Node next;
}
}
1.17 +5 -7
jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentManager.java
Index: ExcaliburComponentManager.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentManager.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- ExcaliburComponentManager.java 30 Jan 2002 16:49:04 -0000 1.16
+++ ExcaliburComponentManager.java 15 Feb 2002 20:12:10 -0000 1.17
@@ -28,12 +28,14 @@
import org.apache.avalon.excalibur.logger.LogKitManager;
import org.apache.avalon.excalibur.logger.LogKitManageable;
+import org.apache.avalon.excalibur.collections.BucketMap;
+
/**
* Default component manager for Avalon's components.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Paul Russell</a>
- * @version CVS $Revision: 1.16 $ $Date: 2002/01/30 16:49:04 $
+ * @version CVS $Revision: 1.17 $ $Date: 2002/02/15 20:12:10 $
* @since 4.0
*/
public class ExcaliburComponentManager
@@ -58,11 +60,11 @@
/** Static component mapping handlers.
*/
- private Map m_componentMapping;
+ private final BucketMap m_componentMapping = new BucketMap();
/** Static component handlers.
*/
- private Map m_componentHandlers;
+ private final BucketMap m_componentHandlers = new BucketMap();
/** RoleInfos.
*/
@@ -103,10 +105,6 @@
}
m_parentManager = manager;
-
- // Setup the maps.
- m_componentHandlers = Collections.synchronizedMap( new HashMap() );
- m_componentMapping = Collections.synchronizedMap( new HashMap() );
}
/** Create the ComponentManager with a parent ComponentManager */
1.11 +8 -10
jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentSelector.java
Index: ExcaliburComponentSelector.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/component/ExcaliburComponentSelector.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ExcaliburComponentSelector.java 30 Jan 2002 16:49:05 -0000 1.10
+++ ExcaliburComponentSelector.java 15 Feb 2002 20:12:10 -0000 1.11
@@ -30,12 +30,14 @@
import org.apache.avalon.excalibur.logger.LogKitManager;
import org.apache.avalon.excalibur.logger.LogKitManageable;
+import org.apache.avalon.excalibur.collections.BucketMap;
+
/**
* Default component selector for Avalon's components.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Paul Russell</a>
- * @version CVS $Revision: 1.10 $ $Date: 2002/01/30 16:49:05 $
+ * @version CVS $Revision: 1.11 $ $Date: 2002/02/15 20:12:10 $
* @since 4.0
*/
public class ExcaliburComponentSelector
@@ -69,17 +71,17 @@
*/
private ComponentManager m_componentManager;
- /** Dynamic component handlers mapping.
- */
- private Map m_componentMapping;
-
/** Static configuraiton object.
*/
private Configuration m_configuration;
/** Static component handlers.
*/
- private Map m_componentHandlers;
+ private BucketMap m_componentHandlers = new BucketMap();
+
+ /** Dynamic component handlers mapping.
+ */
+ private BucketMap m_componentMapping = new BucketMap();
/** Flag for if this is disposed or not.
*/
@@ -114,10 +116,6 @@
{
m_loader = loader;
}
-
- // Setup the maps.
- m_componentHandlers = Collections.synchronizedMap( new HashMap() );
- m_componentMapping = Collections.synchronizedMap( new HashMap() );
}
/** Provide the application Context.
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>