Update of /cvsroot/freenet/freenet/src/freenet/thread
In directory sc8-pr-cvs1:/tmp/cvs-serv8958/src/freenet/thread

Modified Files:
        QThreadFactory.java 
Log Message:
Finer grained locking for Thread creation thread, this smooths out CPU and BW usage a 
_lot_ because now if there is a thread waiting to return as we are creating threads we 
don't create a thread to replace it and then let it return

Index: QThreadFactory.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/thread/QThreadFactory.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- QThreadFactory.java 28 Jul 2003 21:51:19 -0000      1.28
+++ QThreadFactory.java 24 Sep 2003 20:00:04 -0000      1.29
@@ -45,48 +45,61 @@
     }
 
     public void run() {
-        synchronized (this) {
-            while (true) {
-                Throwable lastEx = null;
-                try {
-
-                    if (available < MINIMUM_AVAILABLE_ABS || 
-                        available < active * MINIMUM_AVAILABLE_RATIO) {
-                        
-                        int desired = 
-                            Math.max((int) (active * IDEAL_AVAILABLE_RATIO),
-                                     2 * MINIMUM_AVAILABLE_ABS);
-                        while (available < desired) {
-                            createThread();
-                        }
-                    } else if (available > (3 * MINIMUM_AVAILABLE_ABS) &&
-                               available > active * MAXIMUM_AVAILABLE_RATIO) {
-                        
-                        int desired = 
-                            Math.max((int) (active * IDEAL_AVAILABLE_RATIO),
-                                     2 * MINIMUM_AVAILABLE_ABS);
-                        
-                        
-                        while (available > desired) {
-                            destroyThread();
-                        }
+        while (true) {
+            Throwable lastEx = null;
+            try {
+                int desired=0;
+                while ( true ) {
+                    synchronized(this) {
+                        if (available < MINIMUM_AVAILABLE_ABS || 
+                            available < active * MINIMUM_AVAILABLE_RATIO) {
+
+                            desired = 
+                                Math.max((int) (active * IDEAL_AVAILABLE_RATIO),
+                                         2 * MINIMUM_AVAILABLE_ABS);
+                            if ( available < desired ) {
+                                createThread();
+                            } else break;
+                        } else break;
                     }
-
-                    try {
-                        wait(1000);
-                    } catch (InterruptedException e) {
+                }
+                Core.logger.log(this,"Thread creation thread past creation loop, 
available: " + 
+                                available + ", desired: " + desired + ", active: " + 
active,
+                                Core.logger.DEBUG);
+                while ( true ) {
+                    synchronized(this) {   
+                        if (available > (3 * MINIMUM_AVAILABLE_ABS) &&
+                                   available > active * MAXIMUM_AVAILABLE_RATIO) {
+
+                            desired = 
+                                Math.max((int) (active * IDEAL_AVAILABLE_RATIO),
+                                         2 * MINIMUM_AVAILABLE_ABS);
+
+
+                            if ( available > desired ) {
+                                destroyThread();
+                            } else break;
+                        } else break;
                     }
-                } catch (Throwable e) {
-                    if (lastEx == null || !lastEx.getClass().equals(e.getClass()))
-                        Core.logger.log(this, "Exception in QThreadFactory. "
-                                        + available + " thread available ," 
-                                        + active + " running. Top: " + headerThread, 
-                                        e, Core.logger.ERROR);
-                    lastEx = e;
-                    try {
-                        wait(20); // avoid runaway loop.
-                    } catch (InterruptedException e2) {}
                 }
+                Core.logger.log(this,"Thread creation thread past deletion loop, 
available: " + 
+                                available + ", desired: " + desired + ", active: " + 
active,
+                                Core.logger.DEBUG);
+
+                try {
+                    Thread.currentThread().sleep(1000);
+                } catch (InterruptedException e) {
+                }
+            } catch (Throwable e) {
+                if (lastEx == null || !lastEx.getClass().equals(e.getClass()))
+                    Core.logger.log(this, "Exception in QThreadFactory. "
+                                    + available + " threads available ," 
+                                    + active + " running. Top: " + headerThread, 
+                                        e, Core.logger.ERROR);
+                lastEx = e;
+                try {
+                    Thread.currentThread().sleep(20); // avoid runaway loop.
+                } catch (InterruptedException e2) {}
             }
         }
     }
@@ -166,12 +179,12 @@
     }
 
     private synchronized final void awaken() {
-         if ( ( available < MINIMUM_AVAILABLE_ABS) ||
-              ( available < active * MINIMUM_AVAILABLE_RATIO) || 
-              ( ( available > (3 * MINIMUM_AVAILABLE_ABS)) &&
-                ( available > active * MAXIMUM_AVAILABLE_RATIO))) {
-             notifyAll();
-         }
+        if ( ( available < MINIMUM_AVAILABLE_ABS) ||
+             ( available < active * MINIMUM_AVAILABLE_RATIO) || 
+             ( ( available > (3 * MINIMUM_AVAILABLE_ABS)) &&
+             ( available > active * MAXIMUM_AVAILABLE_RATIO))) {
+            notifyAll();
+        }
     }
 
     private final class QThread extends Thread implements PooledThread {

_______________________________________________
cvs mailing list
[EMAIL PROTECTED]
http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to