You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2005/03/31 08:38:38 UTC
svn commit: r159562 - in directory/sandbox/trunk/asn1-new-codec/src:
java/org/apache/asn1/ber/ java/org/apache/asn1/util/pools/
perfs/org/apache/ans1/ber/ test/org/apache/asn1/ldap/codec/
Author: elecharny
Date: Wed Mar 30 22:38:36 2005
New Revision: 159562
URL: http://svn.apache.org/viewcvs?view=rev&rev=159562
Log:
Added a switch to allocate memory either directly (using new) or using pools. The pooled mechanism is 15% faster ...
Modified:
directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/Asn1Decoder.java
directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/LocalPoolManager.java
directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolEnum.java
directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolObject.java
directory/sandbox/trunk/asn1-new-codec/src/perfs/org/apache/ans1/ber/LdapDecoderPerf.java
directory/sandbox/trunk/asn1-new-codec/src/test/org/apache/asn1/ldap/codec/LdapDecoderTest.java
Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/Asn1Decoder.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/Asn1Decoder.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/Asn1Decoder.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/Asn1Decoder.java Wed Mar 30 22:38:36 2005
@@ -72,19 +72,36 @@
/** The local pool Manager */
private LocalPoolManager poolMgr;
-
+
+ /** A flag to set the memory mechanism to use */
+ private boolean isPooled;
+
//~ Constructors -------------------------------------------------------------------------------
/**
- * A private constructor to avoid a new instanciation of this class. A
- * public constructor
+ * A public constructor of an Asn1 Decoder.
+ *
+ * @param isPooled Set the memory allocation mechanism. If <code>true</code>,
+ * a pooled mechanism will be used
+ */
+ public Asn1Decoder(boolean isPooled)
+ {
+ this.indefiniteLengthAllowed = false;
+ this.maxLengthLength = 1;
+ this.maxTagLength = 1;
+ poolMgr = new LocalPoolManager(isPooled);
+ }
+
+ /**
+ * A public constructor of an Asn1 Decoder.
*/
public Asn1Decoder()
{
this.indefiniteLengthAllowed = false;
this.maxLengthLength = 1;
this.maxTagLength = 1;
- poolMgr = new LocalPoolManager();
+ isPooled = true;
+ poolMgr = new LocalPoolManager(isPooled);
}
//~ Methods ------------------------------------------------------------------------------------
@@ -260,21 +277,29 @@
throws DecoderException
{
- if ( DEBUG )
- {
-
- Tag tag = container.getCurrentTLV().getTag();
- log.debug( tag.toString() + " has been decoded" );
- }
-
- // After having decoded a tag, we have to execute the action
- // which controls if this tag is allowed and well formed.
- container.getGrammar().executeAction( container );
-
- // Switch to the next state, which is the Length decoding
- container.setState( TLVStateEnum.LENGTH_STATE_START );
-
- return MORE;
+ try
+ {
+ if ( DEBUG )
+ {
+
+ Tag tag = container.getCurrentTLV().getTag();
+ log.debug( tag.toString() + " has been decoded" );
+ }
+
+ // After having decoded a tag, we have to execute the action
+ // which controls if this tag is allowed and well formed.
+ container.getGrammar().executeAction( container );
+
+ // Switch to the next state, which is the Length decoding
+ container.setState( TLVStateEnum.LENGTH_STATE_START );
+
+ return MORE;
+ }
+ catch (NullPointerException npe)
+ {
+ npe.printStackTrace();
+ throw new DecoderException("Null pinter exception");
+ }
}
/**
@@ -817,8 +842,14 @@
*/
public PoolObject allocate( int pool ) throws PoolException
{
-
- return poolMgr.allocate( pool );
+ if (isPooled)
+ {
+ return poolMgr.allocate( pool );
+ }
+ else
+ {
+ return PoolEnum.allocate( pool );
+ }
}
/**
@@ -829,5 +860,4 @@
return poolMgr;
}
-
} // end class TLVTagDecoder
Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/LocalPoolManager.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/LocalPoolManager.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/LocalPoolManager.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/LocalPoolManager.java Wed Mar 30 22:38:36 2005
@@ -53,6 +53,9 @@
/** Array of pools */
private LocalPool[] pools = new LocalPool[PoolEnum.POOL_NUMBER];
+
+ /** A flag that sets the memory allocation mechanism */
+ private boolean isPooled;
//~ Constructors -------------------------------------------------------------------------------
@@ -60,34 +63,38 @@
* Creates a new LocalPoolManager object. All the objects that could be allocated are stored in
* local pools.
*/
- public LocalPoolManager()
+ public LocalPoolManager(boolean isPooled)
{
-
- // We have to initialize the pools.
- // Tag and TLV pool will be bigger than others, because PDU may contain many of them
- // for only one POJO generated.
- //
- // TODO It has to be improved. Picocontainer?
- pools[PoolEnum.TLV_POOL] = new LocalPool( PoolEnum.TLV_POOL, 10240,
- 1024 );
-
- pools[PoolEnum.SIMPLE_AUTH_POJO_POOL] = new LocalPool(
- PoolEnum.SIMPLE_AUTH_POJO_POOL, 1024, 1024 );
-
- pools[PoolEnum.SASL_AUTH_POJO_POOL] = new LocalPool( PoolEnum.SASL_AUTH_POJO_POOL,
- 1024, 1024 );
-
- pools[PoolEnum.BIND_RESPONSE_POJO_POOL] = new LocalPool(
- PoolEnum.BIND_RESPONSE_POJO_POOL, 1024, 1024 );
-
- pools[PoolEnum.BIND_REQUEST_POJO_POOL] = new LocalPool(
- PoolEnum.BIND_REQUEST_POJO_POOL, 1024, 1024 );
-
- pools[PoolEnum.LDAP_MESSAGE_CONTAINER_POOL] = new LocalPool(
- PoolEnum.LDAP_MESSAGE_CONTAINER_POOL, 1024, 1024 );
-
- pools[PoolEnum.LDAP_MESSAGE_POJO_POOL] = new LocalPool(
- PoolEnum.LDAP_MESSAGE_POJO_POOL, 1024, 1024 );
+ this.isPooled = isPooled;
+
+ if (isPooled)
+ {
+ // We have to initialize the pools.
+ // Tag and TLV pool will be bigger than others, because PDU may contain many of them
+ // for only one POJO generated.
+ //
+ // TODO It has to be improved. Picocontainer?
+ pools[PoolEnum.TLV_POOL] = new LocalPool( PoolEnum.TLV_POOL, 10240,
+ 1024 );
+
+ pools[PoolEnum.SIMPLE_AUTH_POJO_POOL] = new LocalPool(
+ PoolEnum.SIMPLE_AUTH_POJO_POOL, 1024, 1024 );
+
+ pools[PoolEnum.SASL_AUTH_POJO_POOL] = new LocalPool( PoolEnum.SASL_AUTH_POJO_POOL,
+ 1024, 1024 );
+
+ pools[PoolEnum.BIND_RESPONSE_POJO_POOL] = new LocalPool(
+ PoolEnum.BIND_RESPONSE_POJO_POOL, 1024, 1024 );
+
+ pools[PoolEnum.BIND_REQUEST_POJO_POOL] = new LocalPool(
+ PoolEnum.BIND_REQUEST_POJO_POOL, 1024, 1024 );
+
+ pools[PoolEnum.LDAP_MESSAGE_CONTAINER_POOL] = new LocalPool(
+ PoolEnum.LDAP_MESSAGE_CONTAINER_POOL, 1024, 1024 );
+
+ pools[PoolEnum.LDAP_MESSAGE_POJO_POOL] = new LocalPool(
+ PoolEnum.LDAP_MESSAGE_POJO_POOL, 1024, 1024 );
+ }
}
//~ Methods ------------------------------------------------------------------------------------
@@ -101,10 +108,14 @@
*/
public PoolObject allocate( int poolId ) throws PoolException
{
-
- PoolObject object = ( PoolObject ) pools[poolId].allocate();
-
- return object;
+ if (isPooled)
+ {
+ return ( PoolObject ) pools[poolId].allocate();
+ }
+ else
+ {
+ return PoolEnum.allocate(poolId);
+ }
}
/**
@@ -120,7 +131,14 @@
*/
public void free( PoolObject object ) throws PoolStackFullException
{
- pools[object.getPoolId()].free( object );
+ if (isPooled)
+ {
+ pools[object.getPoolId()].free( object );
+ }
+ else
+ {
+ object = null;
+ }
}
//~ Inner Classes ------------------------------------------------------------------------------
Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolEnum.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolEnum.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolEnum.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolEnum.java Wed Mar 30 22:38:36 2005
@@ -16,6 +16,14 @@
*/
package org.apache.asn1.util.pools;
+import org.apache.asn1.ber.tlv.TLV;
+import org.apache.asn1.ldap.codec.LdapMessageContainer;
+import org.apache.asn1.ldap.pojo.BindRequestPOJO;
+import org.apache.asn1.ldap.pojo.BindResponsePOJO;
+import org.apache.asn1.ldap.pojo.LdapMessagePOJO;
+import org.apache.asn1.ldap.pojo.SaslAuthenticationPOJO;
+import org.apache.asn1.ldap.pojo.SimpleAuthenticationPOJO;
+
/**
* This is where all the different pools are named. To add a new pool, we have to
* add an entry to the list, and to modify the getType method.
@@ -87,5 +95,26 @@
{
return "UNKNOWN POOL";
}
+ }
+
+ /**
+ * Allocate a new object the classic way.
+ * @param poolId The object pool Id
+ * @return An object
+ */
+ public static PoolObject allocate(int poolId)
+ {
+ switch (poolId)
+ {
+ case 0 : return new TLV();
+ case 1 : return new SimpleAuthenticationPOJO();
+ case 2 : return new SaslAuthenticationPOJO();
+ case 3 : return new BindResponsePOJO();
+ case 4 : return new BindRequestPOJO();
+ case 5 : return new LdapMessageContainer();
+ case 6 : return new LdapMessagePOJO();
+
+ default : return null;
+ }
}
}
Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolObject.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolObject.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolObject.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/util/pools/PoolObject.java Wed Mar 30 22:38:36 2005
@@ -80,6 +80,9 @@
*/
public void free()
{
- pool.free( this );
+ if (pool != null)
+ {
+ pool.free( this );
+ }
}
}
Modified: directory/sandbox/trunk/asn1-new-codec/src/perfs/org/apache/ans1/ber/LdapDecoderPerf.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/perfs/org/apache/ans1/ber/LdapDecoderPerf.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/perfs/org/apache/ans1/ber/LdapDecoderPerf.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/perfs/org/apache/ans1/ber/LdapDecoderPerf.java Wed Mar 30 22:38:36 2005
@@ -57,8 +57,8 @@
*/
public void run()
{
- Asn1Decoder ldapDecoder = new Asn1Decoder();
-
+ Asn1Decoder ldapDecoder = new Asn1Decoder(false);
+
ByteBuffer stream = ByteBuffer.allocate( 0x35 );
stream.put(
new byte[]
@@ -128,6 +128,8 @@
IAsn1Container ldapMessageContainer = ( IAsn1Container ) ldapDecoder.allocate(
PoolEnum.LDAP_MESSAGE_CONTAINER_POOL );
+ ldapMessageContainer.setGrammar( LdapMessageGrammar.getInstance() );
+ ldapMessageContainer.setPoolManager( ldapDecoder.getPoolManager() );
ldapDecoder.decode( stream, ldapMessageContainer );
@@ -176,8 +178,8 @@
LdapDecoderPerf ldpt4 = new LdapDecoderPerf();
ldpt1.start();
- ldpt2.start();
- ldpt3.start();
- ldpt4.start();
+ //ldpt2.start();
+ //ldpt3.start();
+ //ldpt4.start();
}
}
Modified: directory/sandbox/trunk/asn1-new-codec/src/test/org/apache/asn1/ldap/codec/LdapDecoderTest.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/test/org/apache/asn1/ldap/codec/LdapDecoderTest.java?view=diff&r1=159561&r2=159562
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/test/org/apache/asn1/ldap/codec/LdapDecoderTest.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/test/org/apache/asn1/ldap/codec/LdapDecoderTest.java Wed Mar 30 22:38:36 2005
@@ -313,7 +313,7 @@
return;
}
- Assert.fail("Should never arrive here...");
+ Assert.fail("Should never reach this point..");
}
/**
@@ -370,7 +370,7 @@
return;
}
- Assert.fail("Should never arrive here...");
+ Assert.fail("Should never reach this point.");
}
/**
@@ -396,7 +396,7 @@
'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
( byte ) 0x80, 0x08, // authentication AuthenticationChoice
// AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING, ...
- 'p', 'a', 's', 's', 'w', 'o', 'r'
+ 'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
} );
stream.flip();
@@ -427,6 +427,6 @@
return;
}
- Assert.fail("Should never arrive here...");
+ Assert.fail("Should never reach this point.");
}
}