package com.intellij.flex.compiler; import flex2.compiler.ILocalizableMessage; import flex2.compiler.common.Configuration; public class CompilationThread extends Thread { private static int omitTraceCompilationsCount = 0; private static int traceCompilationsCount = 0; private static final Object lock = new Object(); private final boolean mySwf; private final SdkSpecificHandler mySdkSpecificHandler; private final String[] myParams; private final OutputLogger myLogger; public CompilationThread(final boolean isSwf, final SdkSpecificHandler sdkSpecificHandler, final String[] params, final OutputLogger logger) { mySwf = isSwf; mySdkSpecificHandler = sdkSpecificHandler; myParams = params; myLogger = logger; } static { // initialize static data to avoid multithreaded collisions caused by partially initialized arrays or collections try { Configuration.getAliases(); macromedia.asc.embedding.LintEvaluator.getWarningDefaults(); } catch (Throwable t) {/*API changed*/} } public void run() { try { mySdkSpecificHandler.initThreadLocals(myLogger); final boolean omitTrace = mySdkSpecificHandler.isOmitTrace(mySwf, myParams); try { acquire(omitTrace); mySdkSpecificHandler.setupOmitTraceOption(omitTrace); if (mySwf) { mySdkSpecificHandler.compileSwf(myParams); } else { mySdkSpecificHandler.compileSwc(myParams); } } finally { release(omitTrace); } /*if (outputFileSize > 0) { final File outputFile = (builder instanceof Application) ? ((Application)builder).getOutput() : ((Library)builder).getOutput(); myLogger.log(outputFile.getCanonicalPath() + " (" + outputFileSize + " bytes)"); if (linkReportFileName != null) { final File linkReportFile = new File(linkReportFileName); FlexCompilerUtil.ensureFileCanBeCreated(linkReportFile); final Report report = builder.getReport(); final FileWriter writer = new FileWriter(linkReportFile); report.writeLinkReport(writer); writer.close(); } } else if (!myLogger.wereErrorsReported()) { myLogger.log(OutputLogger.ERROR_MARKER + "Flex compiler failed to create output file"); }*/ } catch (final Exception e) { logError(e); } catch (final Throwable t) { logError(t); System.exit(1); } finally { myLogger.log(FlexCompiler.COMPILATION_FINISHED); mySdkSpecificHandler.cleanThreadLocals(); System.gc(); } } private static void acquire(final boolean omitTrace) throws InterruptedException { synchronized (lock) { while ((omitTrace && traceCompilationsCount > 0) || (!omitTrace && omitTraceCompilationsCount > 0)) { lock.wait(); } if (omitTrace) { omitTraceCompilationsCount++; } else { traceCompilationsCount++; } } } private static void release(final boolean omitTrace) { synchronized (lock) { if (omitTrace) { omitTraceCompilationsCount--; } else { traceCompilationsCount--; } lock.notifyAll(); } } private void logError(final Throwable e) { if (e instanceof ILocalizableMessage) { myLogger.log((ILocalizableMessage)e); } else { myLogger.log(OutputLogger.ERROR_MARKER + e.toString()); for (final StackTraceElement stackTraceElement : e.getStackTrace()) { myLogger.log("\tat " + stackTraceElement.toString()); } } } }