+++ /dev/null
-/** @file\r
- This file is for single module thread definition. \r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-**/\r
-package org.tianocore.build;\r
-\r
-import java.util.Hashtable;\r
-import java.util.Iterator;\r
-import java.util.LinkedHashSet;\r
-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
-import org.tianocore.build.GenBuildTask;\r
-import org.tianocore.build.fpd.FpdParserForThread;\r
-import org.tianocore.build.global.GenBuildLogger;\r
-import org.tianocore.build.id.FpdModuleIdentification;\r
-import org.tianocore.build.id.ModuleIdentification;\r
-import org.tianocore.common.logger.EdkLog;\r
-\r
-/**\r
- Add more comment here. \r
-\r
- @since GenBuild 1.0\r
-**/\r
-public class GenBuildThread implements Runnable {\r
-\r
- private ModuleIdentification parentModuleId = null;\r
-\r
- private ModuleIdentification moduleId = null;\r
-\r
- private Set<FpdModuleIdentification> dependencies = new LinkedHashSet<FpdModuleIdentification>();\r
- \r
- private int status = FpdParserForThread.STATUS_DEPENDENCY_NOT_READY;\r
-\r
- private Project project = null;\r
-\r
- public Object semaphore = new Object();\r
-\r
- private String arch = null;\r
-\r
- private boolean highPriority = false;\r
-\r
- private Thread thread;\r
-\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
- status = FpdParserForThread.STATUS_START_RUN;\r
-\r
- thread.start();\r
-\r
- return true;\r
- }\r
-\r
- public void run() {\r
-\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
- GenBuildLogger newLogger = null;\r
- while (listenerIter.hasNext()) {\r
- BuildListener item = (BuildListener)listenerIter.next();\r
- if (item instanceof GenBuildLogger) {\r
- newLogger = (GenBuildLogger)((GenBuildLogger)item).clone();\r
- newLogger.setId(fpdModuleId);\r
- newProject.addBuildListener(newLogger);\r
- } else {\r
- newProject.addBuildListener(item);\r
- }\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
- } catch (BuildException be) {\r
- \r
- EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, fpdModuleId + " build error. \n" + be.getMessage());\r
- \r
- if (FpdParserForThread.errorModule == null) {\r
- FpdParserForThread.errorModule = fpdModuleId;\r
- }\r
- \r
- synchronized (FpdParserForThread.deamonSemaphore) {\r
- FpdParserForThread.subCount();\r
- FpdParserForThread.deamonSemaphore.notifyAll();\r
- }\r
- \r
- return ;\r
- }\r
- \r
- status = FpdParserForThread.STATUS_END_RUN;\r
-\r
- EdkLog.log("GenBuild", EdkLog.EDK_ALWAYS, fpdModuleId + " build finished. ");\r
- \r
- //\r
- // \r
- //\r
- synchronized (FpdParserForThread.deamonSemaphore) {\r
- FpdParserForThread.subCount();\r
- FpdParserForThread.deamonSemaphore.notifyAll();\r
- }\r
- }\r
-\r
- public void setArch(String arch) {\r
- this.arch = arch;\r
- }\r
-\r
- public void setDependencies(Set<FpdModuleIdentification> dependencies) {\r
- this.dependencies = dependencies;\r
- }\r
-\r
- public void setModuleId(ModuleIdentification moduleId) {\r
- this.moduleId = moduleId;\r
- }\r
-\r
- public void setParentModuleId(ModuleIdentification parentModuleId) {\r
- this.parentModuleId = parentModuleId;\r
- }\r
-\r
- public void setProject(Project project) {\r
- this.project = project;\r
- }\r
-\r
- public void setHighPriority(boolean highPriority) {\r
- this.highPriority = highPriority;\r
- }\r
-\r
-\r
- public Set<FpdModuleIdentification> getDependencies() {\r
- return dependencies;\r
- }\r
-\r
- public ModuleIdentification getModuleId() {\r
- return moduleId;\r
- }\r
-\r
- public int getStatus() {\r
- //\r
- // Add code here to judge dependency\r
- //\r
- if (status == FpdParserForThread.STATUS_DEPENDENCY_NOT_READY) {\r
- Iterator<FpdModuleIdentification> iter = dependencies.iterator();\r
- boolean flag = true;\r
- while (iter.hasNext()) {\r
- FpdModuleIdentification item = iter.next();\r
- if (FpdParserForThread.allThreads.get(item).getStatus() == 1) {\r
- flag = false;\r
- break ;\r
- }\r
- }\r
- if (flag) {\r
- status = FpdParserForThread.STATUS_DEPENDENCY_READY;\r
- }\r
- }\r
- return status;\r
- }\r
-\r
- public void setStatus(int status) {\r
- this.status = status;\r
- }\r
-}\r