import java.util.Set;\r
import java.util.Vector;\r
\r
+import org.apache.tools.ant.BuildException;\r
import org.apache.tools.ant.BuildListener;\r
import org.apache.tools.ant.Project;\r
import org.apache.tools.ant.taskdefs.Property;\r
\r
private Thread thread;\r
\r
- public GenBuildThread() {\r
- thread = new Thread(this);\r
+ public GenBuildThread(ModuleIdentification moduleId, String arch) {\r
+ this.moduleId = moduleId;\r
+ this.arch = arch;\r
+ thread = new Thread(FpdParserForThread.tg, this, moduleId + ":" + arch);\r
}\r
\r
public boolean start() {\r
if (highPriority) {\r
thread.setPriority(Thread.MAX_PRIORITY);\r
}\r
- \r
+\r
status = FpdParserForThread.STATUS_START_RUN;\r
thread.start();\r
return true;\r
}\r
\r
public void run() {\r
- \r
- FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
-\r
- //\r
- // Prepare pass down properties\r
- // ARCH, MODULE_GUID, MODULE_VERSION, PACKAGE_GUID, PACKAGE_VERSION, PLATFORM_FILE\r
- //\r
- Vector<Property> properties = new Vector<Property>();\r
- Property property = new Property();\r
- property.setName("ARCH");\r
- property.setValue(arch);\r
- properties.add(property);\r
-\r
- property = new Property();\r
- property.setName("MODULE_GUID");\r
- property.setValue(moduleId.getGuid());\r
- properties.add(property);\r
-\r
- property = new Property();\r
- property.setName("MODULE_VERSION");\r
- if (moduleId.getVersion() == null) {\r
- property.setValue("");\r
- } else {\r
- property.setValue(moduleId.getVersion());\r
- }\r
- properties.add(property);\r
-\r
- property = new Property();\r
- property.setName("PACKAGE_GUID");\r
- property.setValue(moduleId.getPackage().getGuid());\r
- properties.add(property);\r
-\r
- property = new Property();\r
- property.setName("PACKAGE_VERSION");\r
- if (moduleId.getPackage().getVersion() == null) {\r
- property.setValue("");\r
- } else {\r
- property.setValue(moduleId.getPackage().getVersion());\r
- }\r
- properties.add(property);\r
-\r
- // property = new Property();\r
- // property.setName("PLATFORM_FILE");\r
- // property.setValue(arch);\r
- // properties.add(property);\r
\r
- //\r
- // Build the Module\r
- //\r
- GenBuildTask genBuildTask = new GenBuildTask();\r
-\r
- Project newProject = new Project();\r
-\r
- Hashtable passdownProperties = project.getProperties();\r
- Iterator iter = passdownProperties.keySet().iterator();\r
- while (iter.hasNext()) {\r
- String item = (String) iter.next();\r
- newProject.setProperty(item, (String) passdownProperties.get(item));\r
- }\r
-\r
- newProject.setInputHandler(project.getInputHandler());\r
-\r
- Iterator listenerIter = project.getBuildListeners().iterator();\r
- while (listenerIter.hasNext()) {\r
- BuildListener item = (BuildListener) listenerIter.next();\r
+ FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
+ \r
+ try {\r
+ //\r
+ // Prepare pass down properties\r
+ // ARCH, MODULE_GUID, MODULE_VERSION, PACKAGE_GUID, PACKAGE_VERSION, PLATFORM_FILE\r
+ //\r
+ Vector<Property> properties = new Vector<Property>();\r
+ Property property = new Property();\r
+ property.setName("ARCH");\r
+ property.setValue(arch);\r
+ properties.add(property);\r
+ \r
+ property = new Property();\r
+ property.setName("MODULE_GUID");\r
+ property.setValue(moduleId.getGuid());\r
+ properties.add(property);\r
+ \r
+ property = new Property();\r
+ property.setName("MODULE_VERSION");\r
+ if (moduleId.getVersion() == null) {\r
+ property.setValue("");\r
+ } else {\r
+ property.setValue(moduleId.getVersion());\r
+ }\r
+ properties.add(property);\r
+ \r
+ property = new Property();\r
+ property.setName("PACKAGE_GUID");\r
+ property.setValue(moduleId.getPackage().getGuid());\r
+ properties.add(property);\r
+ \r
+ property = new Property();\r
+ property.setName("PACKAGE_VERSION");\r
+ if (moduleId.getPackage().getVersion() == null) {\r
+ property.setValue("");\r
+ } else {\r
+ property.setValue(moduleId.getPackage().getVersion());\r
+ }\r
+ properties.add(property);\r
+ \r
+ //\r
+ // Build the Module\r
+ //\r
+ GenBuildTask genBuildTask = new GenBuildTask();\r
+ \r
+ Project newProject = new Project();\r
+ \r
+ Hashtable passdownProperties = project.getProperties();\r
+ Iterator iter = passdownProperties.keySet().iterator();\r
+ while (iter.hasNext()) {\r
+ String item = (String) iter.next();\r
+ newProject.setProperty(item, (String) passdownProperties.get(item));\r
+ }\r
+ \r
+ newProject.setInputHandler(project.getInputHandler());\r
+ \r
+ Iterator listenerIter = project.getBuildListeners().iterator();\r
+ while (listenerIter.hasNext()) {\r
+ newProject.addBuildListener((BuildListener)listenerIter.next());\r
+ }\r
+ \r
+ project.initSubProject(newProject);\r
+ \r
+ genBuildTask.setProject(newProject);\r
+ \r
+ genBuildTask.setExternalProperties(properties);\r
+ \r
+ genBuildTask.parentId = parentModuleId;\r
+ \r
+ genBuildTask.execute();\r
+ } catch (BuildException be) {\r
+ FpdParserForThread.tg.interrupt();\r
+ EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, moduleId + " with Arch " + arch +" build error. \n" + be.getMessage());\r
+ FpdParserForThread.isError = true; \r
\r
-// if (item instanceof BuildLogger) {\r
-// BuildLogger newLogger = new GenBuildLogger(newProject);\r
-// BuildLogger oldLogger = (BuildLogger)item;\r
-// newLogger.setEmacsMode(true);\r
-// EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, "########");\r
-// } else {\r
- newProject.addBuildListener(item);\r
-// }\r
+ synchronized (FpdParserForThread.deamonSemaphore) {\r
+ FpdParserForThread.deamonSemaphore.notifyAll();\r
+ }\r
+ return ;\r
}\r
-\r
- project.initSubProject(newProject);\r
-\r
- genBuildTask.setProject(newProject);\r
-\r
- genBuildTask.setExternalProperties(properties);\r
-\r
- genBuildTask.parentId = parentModuleId;\r
-\r
- genBuildTask.perform();\r
-\r
+ \r
status = FpdParserForThread.STATUS_END_RUN;\r
\r
EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, fpdModuleId + " build finished. ");\r
\r
List<String> queueList = new ArrayList<String>();\r
\r
- public static Object deamonSemaphore = new Object();\r
+ public final static Object deamonSemaphore = new Object();\r
\r
- static Object countSemaphore = new Object();\r
+ private final static Object countSemaphore = new Object();\r
\r
public static int STATUS_DEPENDENCY_NOT_READY = 1;\r
\r
\r
public static int remainNumber = 0;\r
\r
+ public static ThreadGroup tg = new ThreadGroup("Framework");\r
+ \r
+ public static boolean isError = false;\r
+ \r
/**\r
Public construct method. It is necessary for ANT task.\r
**/\r
\r
try {\r
deamonSemaphore.wait();\r
+ if (isError) {\r
+ GenBuildLogger.setCacheEnable(false);\r
+ EdkLog.flushLogToFile(new File(buildDir + File.separatorChar + "build.log"));\r
+ \r
+ GenBuildLogger.maskAllLog(true);\r
+ FpdParserForThread.tg.destroy();\r
+ GenBuildLogger.maskAllLog(false);\r
+ \r
+ throw new BuildException("One thread error. ");\r
+ }\r
} catch (InterruptedException ex) {\r
BuildException e = new BuildException("Thread wait Error. \n" + ex.getMessage());\r
e.setStackTrace(ex.getStackTrace());\r
}\r
}\r
}\r
+ \r
GenBuildLogger.setCacheEnable(false);\r
//\r
// call fvs, postbuild\r
//\r
// Generate GenBuildThread\r
//\r
- GenBuildThread genBuildThread = new GenBuildThread();\r
- genBuildThread.setArch(fpdModuleId.getArch());\r
+ GenBuildThread genBuildThread = new GenBuildThread(fpdModuleId.getModule(), fpdModuleId.getArch());\r
genBuildThread.setParentModuleId(null);\r
- genBuildThread.setModuleId(fpdModuleId.getModule());\r
genBuildThread.setProject(getProject());\r
\r
Set<FpdModuleIdentification> dependencies = new LinkedHashSet<FpdModuleIdentification>();\r
//\r
// Create thread for library instances\r
//\r
- GenBuildThread liBuildThread = new GenBuildThread();\r
- liBuildThread.setArch(fpdModuleId.getArch());\r
+ GenBuildThread liBuildThread = new GenBuildThread(libinstances[i], fpdModuleId.getArch());\r
liBuildThread.setParentModuleId(fpdModuleId.getModule());\r
- liBuildThread.setModuleId(libinstances[i]);\r
liBuildThread.setProject(getProject());\r
liBuildThread.setStatus(STATUS_DEPENDENCY_READY);\r
liBuildThread.setHighPriority(true);\r
updateFvs("libqueue", libFpdModuleId);\r
}\r
\r
- genBuildThread.setDependencies(dependencies); \r
+ genBuildThread.setDependencies(dependencies);\r
+ \r
// if (dependencies.size() == 0) {\r
genBuildThread.setStatus(STATUS_DEPENDENCY_READY);\r
// }\r