You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/04/25 04:20:46 UTC
svn commit: r164519 - in
/directory/network/trunk/src/java/org/apache/mina/util: BaseThreadPool.java
Event.java
Author: trustin
Date: Sun Apr 24 19:20:46 2005
New Revision: 164519
URL: http://svn.apache.org/viewcvs?rev=164519&view=rev
Log:
Optimized BaseThreadPool by recent benchmark result.
Added:
directory/network/trunk/src/java/org/apache/mina/util/Event.java (with props)
Modified:
directory/network/trunk/src/java/org/apache/mina/util/BaseThreadPool.java
Modified: directory/network/trunk/src/java/org/apache/mina/util/BaseThreadPool.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/util/BaseThreadPool.java?rev=164519&r1=164518&r2=164519&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/util/BaseThreadPool.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/util/BaseThreadPool.java Sun Apr 24 19:20:46 2005
@@ -49,15 +49,15 @@
private static volatile int threadId = 0;
- private Map buffers = new IdentityHashMap();
+ private final Map buffers = new IdentityHashMap();
- private Stack followers = new Stack();
+ private final Stack followers = new Stack();
- private Worker leader;
+ private final BlockingSet readySessionBuffers = new BlockingSet();
- private BlockingSet readySessionBuffers = new BlockingSet();
+ private final Set busySessionBuffers = new HashSet();
- private Set busySessionBuffers = new HashSet();
+ private Worker leader;
private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE;
@@ -173,12 +173,15 @@
protected void fireEvent( Object nextFilter, Session session,
EventType type, Object data )
{
- SessionBuffer buf = getSessionBuffer( session );
+ final BlockingSet readySessionBuffers = this.readySessionBuffers;
+ final Set busySessionBuffers = this.busySessionBuffers;
+ final SessionBuffer buf = getSessionBuffer( session );
+ final Queue eventQueue = buf.eventQueue;
+ final Event event = new Event( type, nextFilter, data );
+
synchronized( buf )
{
- buf.nextFilters.push( nextFilter );
- buf.eventTypes.push( type );
- buf.eventDatum.push( data );
+ eventQueue.push( event );
}
synchronized( readySessionBuffers )
@@ -199,6 +202,7 @@
private SessionBuffer getSessionBuffer( Session session )
{
+ final Map buffers = this.buffers;
SessionBuffer buf = ( SessionBuffer ) buffers.get( session );
if( buf == null )
{
@@ -217,9 +221,11 @@
private void removeSessionBuffer( SessionBuffer buf )
{
+ final Map buffers = this.buffers;
+ final Session session = buf.session;
synchronized( buffers )
{
- buffers.remove( buf.session );
+ buffers.remove( session );
}
}
@@ -227,11 +233,7 @@
{
private final Session session;
- private final Queue nextFilters = new Queue();
-
- private final Queue eventTypes = new Queue();
-
- private final Queue eventDatum = new Queue();
+ private final Queue eventQueue = new Queue();
private SessionBuffer( Session session )
{
@@ -251,6 +253,7 @@
public void lead()
{
+ final Object promotionLock = this.promotionLock;
synchronized( promotionLock )
{
leader = this;
@@ -284,6 +287,7 @@
private SessionBuffer fetchBuffer()
{
SessionBuffer buf = null;
+ BlockingSet readySessionBuffers = BaseThreadPool.this.readySessionBuffers;
synchronized( readySessionBuffers )
{
do
@@ -311,10 +315,10 @@
buf = ( SessionBuffer ) it.next();
it.remove();
}
- while( buf != null && buf.nextFilters.isEmpty()
+ while( buf != null && buf.eventQueue.isEmpty()
&& it.hasNext() );
}
- while( buf != null && buf.nextFilters.isEmpty() );
+ while( buf != null && buf.eventQueue.isEmpty() );
}
return buf;
@@ -322,27 +326,26 @@
private void processEvents( SessionBuffer buf )
{
- Session session = buf.session;
+ final Session session = buf.session;
+ final Queue eventQueue = buf.eventQueue;
for( ;; )
{
- Object nextFilter;
- EventType type;
- Object data;
+ Event event;
synchronized( buf )
{
- nextFilter = buf.nextFilters.pop();
- if( nextFilter == null )
+ event = ( Event ) eventQueue.pop();
+ if( event == null )
break;
-
- type = ( EventType ) buf.eventTypes.pop();
- data = buf.eventDatum.pop();
}
- processEvent( nextFilter, session, type, data );
+ processEvent( event.getNextFilter(), session,
+ event.getType(), event.getData() );
}
}
private void follow()
{
+ final Object promotionLock = this.promotionLock;
+ final Stack followers = BaseThreadPool.this.followers;
synchronized( promotionLock )
{
if( this != leader )
@@ -357,10 +360,14 @@
private void releaseBuffer( SessionBuffer buf )
{
+ final BlockingSet readySessionBuffers = BaseThreadPool.this.readySessionBuffers;
+ final Set busySessionBuffers = BaseThreadPool.this.busySessionBuffers;
+ final Queue eventQueue = buf.eventQueue;
+
synchronized( readySessionBuffers )
{
busySessionBuffers.remove( buf );
- if( buf.nextFilters.isEmpty() )
+ if( eventQueue.isEmpty() )
{
removeSessionBuffer( buf );
}
@@ -373,6 +380,8 @@
private boolean waitForPromotion()
{
+ final Object promotionLock = this.promotionLock;
+
synchronized( promotionLock )
{
if( this != leader )
@@ -411,6 +420,7 @@
private void giveUpLead()
{
+ final Stack followers = BaseThreadPool.this.followers;
Worker worker;
synchronized( followers )
{
Added: directory/network/trunk/src/java/org/apache/mina/util/Event.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/util/Event.java?rev=164519&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/util/Event.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/util/Event.java Sun Apr 24 19:20:46 2005
@@ -0,0 +1,57 @@
+/*
+ * @(#) $Id$
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+/**
+ * MINA Event used by {@link BaseThreadPool} internally.
+ *
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+class Event
+{
+ private final EventType type;
+ private final Object nextFilter;
+ private final Object data;
+
+ public Event( EventType type, Object nextFilter, Object data )
+ {
+ this.type = type;
+ this.nextFilter = nextFilter;
+ this.data = data;
+ }
+
+ public Object getData()
+ {
+ return data;
+ }
+
+
+ public Object getNextFilter()
+ {
+ return nextFilter;
+ }
+
+
+ public EventType getType()
+ {
+ return type;
+ }
+}
\ No newline at end of file
Propchange: directory/network/trunk/src/java/org/apache/mina/util/Event.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision