Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2008, 2010 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: IBM Corporation - initial API and implementation /
 
 
 package org.eclipse.jdt.internal.compiler;
 
 
 
 public class ReadManager implements Runnable {
 	char[][] contentsRead;
 	char[] readInProcessMarker = new char[0];
 
 	static final int START_CUSHION = 5;
 	public static final int THRESHOLD = 10;
 	static final int CACHE_SIZE = 15; // do not waste memory by keeping too many files in memory
 
 public ReadManager(ICompilationUnit[] filesint length) {
 	// start the background threads to read the file's contents
 	int threadCount = 0;
 	try {
 		Class runtime = Class.forName("java.lang.Runtime"); //$NON-NLS-1$
 		java.lang.reflect.Method m = runtime.getDeclaredMethod("availableProcessors"new Class[0]); //$NON-NLS-1$
 		if (m != null) {
 			Integer result = (Integerm.invoke(Runtime.getRuntime(), null);
 			threadCount = result.intValue() + 1;
 			if (threadCount < 2)
 				threadCount = 0;
 			else if (threadCount > )
 				threadCount = ;
 		}
 	} catch (IllegalAccessException ignored) { // ignored
 	} catch (ClassNotFoundException e) { // ignored
 	} catch (SecurityException e) { // ignored
 	} catch (NoSuchMethodException e) { // ignored
 	} catch (IllegalArgumentException e) { // ignored
 	} catch (InvocationTargetException e) { // ignored
 	}
 
 	if (threadCount > 0) {
 		synchronized (this) {
 			this. = new ICompilationUnit[length];
 			System.arraycopy(files, 0, this., 0, length);
 			this. = // skip some files to reduce the number of times we have to wait
 			this. = new char[][];
 			this. = 0;
 			this. = 0;
 			this. = new Thread[threadCount];
 			for (int i = threadCount; --i >= 0;) {
 				this.[i] = new Thread(this"Compiler Source File Reader"); //$NON-NLS-1$
 				this.[i].setDaemon(true);
 				this.[i].start();
 			}
 		}
 	}
 }
 
 public char[] getContents(ICompilationUnit unitthrows Error {
 	if (this. == null || this..length == 0) {
 		if (this. != null) {
 			// rethrow the caught exception from the readingThreads in the main compiler thread
 			if (this. instanceof Error)
 				throw (Errorthis.;
 		}
 		return unit.getContents();
 	}
 
 	boolean yield = false;
 	char[] result = null;
 	synchronized (this) {
 		if (unit == this.[this.]) {
 			result = this.[this.];
 			while (result == this. || result == null) {
 				// let the readingThread know we're waiting
 				//System.out.print('|');
 				this.[this.] = null;
 				try {
 					wait(250);
 				} catch (InterruptedException ignore) { // ignore
 				}
				if (this. != null) {
					// rethrow the caught exception from the readingThreads in the main compiler thread
					if (this. instanceof Error)
						throw (Errorthis.;
				}
				result = this.[this.];
			}
			// free spot for next file
			this.[this.] = null;
			this.[this.] = null;
			if (++this. >= this..length)
			if (this. > 0) {
				//System.out.print('+');
				//System.out.print(this.nextFileToRead);
				yield = this. == this..length;
			}
else {
			// must make sure we're reading ahead of the unit
			int unitIndex = 0;
			for (int l = this..lengthunitIndex < lunitIndex++)
				if (this.[unitIndex] == unitbreak;
			if (unitIndex == this..length) {
				// attempting to read a unit that was not included in the initial files - should not happen
				this. = new ICompilationUnit[0]; // stop looking for more
else if (unitIndex >= this.) {
				// start over
				//System.out.println(unitIndex + " vs " + this.nextFileToRead);
				this. = unitIndex + ;
				this. = new char[][];
			}
		}
	}
	if (yield)
		Thread.yield(); // ensure other threads get a chance
	if (result != null)
		return result;
	//System.out.print('-');
	return unit.getContents();
public void run() {
	try {
		while (this. != null && this. < this..length) {
			ICompilationUnit unit = null;
			int position = -1;
			synchronized (this) {
				if (this. == nullreturn;
				while (this.[this.] != null) {
					try {
						wait(250); // wait until a spot in contents is available
catch (InterruptedException e) { // ignore
					}
					if (this. == nullreturn;
				}
				if (this. >= this..lengthreturn;
				unit = this.[this.++];
				position = this.;
				if (++this. >= this..length)
				this.[position] = unit;
				this.[position] = this.// mark the spot so we know its being read
			}
			char[] result = unit.getContents();
			synchronized (this) {
				if (this.[position] == unit) {
					if (this.[position] == null// wake up main thread which is waiting for this file
					this.[position] = result;
				}
			}
		}
catch (Error e) {
		synchronized (this) {
			this. = e;
		}
		return;
catch (RuntimeException e) {
		synchronized (this) {
			this. = e;
		}
		return;
	}
public synchronized void shutdown() {
	this. = null// mark the read manager as shutting down so that the reading threads stop
New to GrepCode? Check out our FAQ X