view src/share/tools/ProjectCreator/FileTreeCreatorVC7.java @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents bd0e82136b03
children
line wrap: on
line source

import static java.nio.file.FileVisitResult.CONTINUE;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Stack;
import java.util.Vector;

public class FileTreeCreatorVC7 extends FileTreeCreator {

      public FileTreeCreatorVC7(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
         super(startDir, allConfigs, wg);
      }

      @Override
      public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
         DirAttributes currentFileAttr = attributes.peek().clone();
         boolean usePch = false;
         boolean disablePch = false;
         boolean useIgnore = false;
         String fileName = file.getFileName().toString();

         // usePch applies to all configs for a file.
         if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
            usePch = true;
         }

         for (BuildConfig cfg : allConfigs) {
            if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
               useIgnore = true;
               currentFileAttr.setIgnore(cfg);
            } else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
               useIgnore = true;
               currentFileAttr.setIgnore(cfg);
            }

            if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
               disablePch = true;
               currentFileAttr.setDisablePch(cfg);
            }

            Vector<String> rv = new Vector<String>();
            cfg.collectRelevantVectors(rv, "AdditionalFile");
            for(String addFile : rv) {
               if (addFile.equals(fileName)) {
                  // supress any ignore
                  currentFileAttr.removeFromIgnored(cfg);
               }
            }
         }

         if (!useIgnore && !disablePch && !usePch) {
            wg.tag("File", new String[] { "RelativePath", vcProjLocation.relativize(file).toString()});
         } else {
            wg.startTag(
                  "File",
                  new String[] { "RelativePath", vcProjLocation.relativize(file).toString()});

            for (BuildConfig cfg : allConfigs) {
               boolean ignore = currentFileAttr.hasIgnore(cfg);
               String [] fileConfAttr;

               if (ignore) {
                  fileConfAttr = new String[] {"Name", cfg.get("Name"), "ExcludedFromBuild", "TRUE" };
               } else {
                  fileConfAttr = new String[] {"Name", cfg.get("Name")};
               }

               if (!disablePch && !usePch && !ignore) {
                  continue;
               } else if (!disablePch && !usePch) {
                  wg.tag("FileConfiguration", fileConfAttr);
               } else {
                  wg.startTag("FileConfiguration", fileConfAttr);
                  if (usePch) {
                     // usePch always applies to all configs, might not always be so.
                     wg.tag("Tool", new String[] {
                           "Name", "VCCLCompilerTool", "UsePrecompiledHeader",
                     "1" });
                     assert(!disablePch);
                  }
                  if (disablePch) {
                     if (currentFileAttr.hasDisablePch(cfg)) {
                        wg.tag("Tool", new String[] {
                              "Name", "VCCLCompilerTool", "UsePrecompiledHeader",
                        "0" });
                     }
                     assert(!usePch);
                  }
                  wg.endTag();
               }
            }
            wg.endTag();
         }

         return CONTINUE;
      }

      @Override
      public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
            throws IOException {
         Boolean hide = false;
         DirAttributes newAttr = attributes.peek().clone();

         String rPath;
         if (path.toAbsolutePath().toString().equals(this.startDir.toAbsolutePath().toString())){
            rPath = startDir.toString();
         } else {
            rPath = path.getFileName().toString();
         }

         // check per config ignorePaths!
         for (BuildConfig cfg : allConfigs) {
            if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
               newAttr.setIgnore(cfg);
            }

            // Hide is always on all configs. And additional files are never hiddden
            if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
               hide = true;
               break;
            }
         }

         if (!hide) {
            wg.startTag("Filter", new String[] {
                  "Name", rPath});

            attributes.push(newAttr);
            return super.preVisitDirectory(path, attrs);
         } else {
            return FileVisitResult.SKIP_SUBTREE;
         }
      }

      @Override
      public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
         //end matching attributes set by ignorepath
         wg.endTag();
         attributes.pop();

         return CONTINUE;
      }

      @Override
      public FileVisitResult visitFileFailed(Path file, IOException exc) {
         return CONTINUE;
      }

      public void writeFileTree() throws IOException {
         Files.walkFileTree(this.startDir, this);
      }
   }