sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/manager/BackgroundLoader.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/manager/BackgroundLoader.java Thu Feb 11 15:32:31 2010 +0200
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.carbide.cpp.internal.pi.manager;
+
+import java.util.Hashtable;
+import java.util.Vector;
+
+/**
+ * A utility for predictively resolving classes
+ * This can be used to help offset one of the biggest detractors from
+ * the Java language: Class loading delays.
+ *
+ **/
+
+public class BackgroundLoader implements Runnable
+{
+ /**
+ * Thread used to load classes in the background
+ **/
+
+ private static Thread controlThread;
+
+ /**
+ * Storage for the class names still to be resolved
+ **/
+
+ private static Vector queue;
+
+ static
+ {
+ try
+ {
+ // This is an IBM-specific code that prevents a nasty error in the IBM resource lookup code -JDM
+ java.text.DateFormat.getDateInstance();
+ }
+ catch (Exception e)
+ {
+ }
+
+ queue = new Vector();
+ }
+
+ /**
+ * Private constructor, to enforce singleton status
+ * Creation date: (12/20/99 3:10:32 PM)
+ **/
+
+ private BackgroundLoader()
+ {
+ }
+
+ /**
+ * Enqueue a class for background loading
+ * Creation date: (12/20/99 3:23:28 PM)
+ * @param className java.lang.String
+ **/
+
+ public static void enqueueClass(String className)
+ {
+ synchronized(queue)
+ {
+ queue.addElement(className);
+
+ if (controlThread == null)
+ start();
+ else
+ queue.notify();
+ }
+ }
+
+ /**
+ * Start loading
+ * Creation date: (12/20/99 3:15:29 PM)
+ **/
+
+ public void run()
+ {
+ if (Thread.currentThread() != controlThread)
+ return;
+
+ Hashtable done = new Hashtable();
+
+ while (controlThread.isAlive())
+ {
+ String className;
+
+ synchronized(queue)
+ {
+ if (queue.isEmpty())
+ {
+ try
+ {
+ queue.wait();
+ }
+ catch (InterruptedException ie)
+ {
+ }
+ }
+
+ if (!queue.isEmpty())
+ {
+ className = (String) queue.elementAt(0);
+ queue.removeElementAt(0);
+ }
+ else
+ continue;
+ }
+
+ if (!done.containsKey(className))
+ {
+ try
+ {
+ Class resolved = Class.forName(className);
+ done.put(resolved.getName(), resolved);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ className = null;
+ }
+
+ controlThread = null;
+ }
+
+ /**
+ * Insert the method's description here.
+ * Creation date: (4/5/00 3:24:04 PM)
+ */
+
+ private static void start()
+ {
+ controlThread = new Thread(new BackgroundLoader());
+
+ try
+ {
+ controlThread.setName(Messages.getString("BackgroundLoader.backgroundLoader")); //$NON-NLS-1$
+ controlThread.setPriority((Thread.MIN_PRIORITY + Thread.NORM_PRIORITY) / 2);
+ }
+ catch (Exception e)
+ {
+ }
+
+ controlThread.start();
+ }
+}