Mercurial > hg > truffle
annotate src/share/tools/MakeDeps/FileList.java @ 1716:be3f9c242c9d
6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode.
Reviewed-by: chrisphi, johnc, poonam
author | ysr |
---|---|
date | Mon, 16 Aug 2010 15:58:42 -0700 |
parents | c18cbe5936b8 |
children |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
2 * Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 import java.io.*; | |
26 import java.util.*; | |
27 | |
28 /** This class implements the java.util.List interface as well as | |
29 providing functionality specific to keeping track of lists of | |
30 files. See the documentation for the Database class to see how | |
31 these are used. Each FileList must only contain other FileLists | |
32 (although that is not currently enforced in the mutators). */ | |
33 | |
34 public class FileList extends Vector { | |
35 private String name; // (also the file name) | |
36 private boolean beenHere; | |
37 private boolean mayBeCycle; | |
38 private boolean isCycle; | |
39 /** Put in list because a file can refuse to */ | |
40 private boolean useGrandInclude; | |
41 private String platformDependentInclude; | |
42 private int count; | |
43 private Platform plat; | |
44 | |
45 public FileList(String n, Platform plat) { | |
46 super(); | |
47 this.plat = plat; | |
48 beenHere = mayBeCycle = isCycle = false; | |
49 platformDependentInclude = null; | |
50 name = n; | |
51 count = 0; | |
52 useGrandInclude = plat.haveGrandInclude(); | |
53 } | |
54 | |
55 // Change definition of equality from AbstractList so remove() works properly | |
56 public boolean equals(Object o) { | |
57 return ((Object) this) == o; | |
58 } | |
59 | |
60 // Necessary accessors | |
61 public String getName() { | |
62 return name; | |
63 } | |
64 | |
65 public void setPlatformDependentInclude(String arg) { | |
66 platformDependentInclude = arg; | |
67 } | |
68 | |
69 public String getPlatformDependentInclude() { | |
70 return platformDependentInclude; | |
71 } | |
72 | |
73 public boolean getUseGrandInclude() { | |
74 return useGrandInclude; | |
75 } | |
76 | |
77 public void setUseGrandInclude(boolean arg) { | |
78 useGrandInclude = arg; | |
79 } | |
80 | |
81 public void incrementCount() { | |
82 count++; | |
83 } | |
84 | |
85 public int getCount() { | |
86 return count; | |
87 } | |
88 | |
89 public FileList listForFile(String fileName) { | |
90 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
91 FileList fl = (FileList) iter.next(); | |
92 if (plat.fileNameStringEquality(fl.name, fileName)) { | |
93 plat.fileNamePortabilityCheck(fl.name, fileName); | |
94 return fl; | |
95 } | |
96 } | |
97 plat.fileNamePortabilityCheck(fileName); | |
98 FileList newList = new FileList(fileName, plat); | |
99 add(newList); | |
100 return newList; | |
101 } | |
102 | |
103 public boolean hasListForFile(String fileName) { | |
104 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
105 FileList fl = (FileList) iter.next(); | |
106 if (plat.fileNameStringEquality(fl.name, fileName)) { | |
107 plat.fileNamePortabilityCheck(fl.name, fileName); | |
108 return true; | |
109 } | |
110 } | |
111 return false; | |
112 } | |
113 | |
114 public boolean compareLists(FileList s) { | |
115 Iterator myIter = iterator(); | |
116 Iterator hisIter = s.iterator(); | |
117 | |
118 while (myIter.hasNext() && | |
119 hisIter.hasNext()) { | |
120 // crude: order dependent | |
121 FileList myElement = (FileList) myIter.next(); | |
122 FileList hisElement = (FileList) hisIter.next(); | |
123 if (!plat.fileNameStringEquality(myElement.name, | |
124 hisElement.name)) { | |
125 return false; | |
126 } | |
127 } | |
128 | |
129 if (myIter.hasNext() != hisIter.hasNext()) { | |
130 // One ended earlier | |
131 return false; | |
132 } | |
133 | |
134 return true; | |
135 } | |
136 | |
137 public void addIfAbsent(FileList s) { | |
138 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
139 if (iter.next() == s) { | |
140 return; | |
141 } | |
142 } | |
143 add(s); | |
144 } | |
145 | |
146 public void sortByName() { | |
147 Collections.sort(this, new Comparator() { | |
148 public int compare(Object o1, Object o2) { | |
149 FileList fl1 = (FileList) o1; | |
150 FileList fl2 = (FileList) o2; | |
151 return fl1.getName().compareTo(fl2.getName()); | |
152 } | |
153 }); | |
154 } | |
155 | |
156 public void setFirstFile(FileList s) { | |
157 // Remove the file list if it's already here | |
158 remove(s); | |
159 add(0, s); | |
160 } | |
161 | |
162 public void setLastFile(FileList s) { | |
163 // Remove the file list if it's already here | |
164 remove(s); | |
165 add(s); | |
166 } | |
167 | |
168 public boolean doFiles(FileList s) { | |
169 boolean result = true; | |
170 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
171 FileList h = (FileList) iter.next(); | |
172 if (h.platformDependentInclude != null) { | |
173 System.err.println("Error: the source for " + | |
174 h.platformDependentInclude + | |
175 " is " + h.name + "."); | |
176 System.err.println("\tIt shouldn't be included directly by " + | |
177 name + "."); | |
178 h.platformDependentInclude = null; // report once per file | |
179 result = false; | |
180 } | |
181 h.doHFile(s); | |
182 } | |
183 return result; | |
184 } | |
185 | |
186 public void traceCycle(FileList s) { | |
187 if (isCycle) // already traced | |
188 return; | |
189 isCycle = true; | |
190 System.err.println("\ttracing cycle for " + name); | |
191 // FIXME: must return status in caller routine | |
192 // exitCode = 1; | |
193 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
194 FileList q = (FileList) iter.next(); | |
195 if (q.mayBeCycle) { | |
196 if (s == q) { | |
197 plat.fatalError("\tend of cycle for " + s.getName()); | |
198 } else { | |
199 q.traceCycle(s); | |
200 } | |
201 } | |
202 } | |
203 } | |
204 | |
205 public void doHFile(FileList s) { | |
206 if (beenHere) { | |
207 if (mayBeCycle) { | |
208 traceCycle(this); | |
209 } | |
210 return; | |
211 } | |
212 beenHere = true; | |
213 mayBeCycle = true; | |
214 doFiles(s); | |
215 mayBeCycle = false; | |
216 s.add(this); | |
217 } | |
218 | |
219 public FileList doCFile() { | |
220 FileList s = new FileList(name, plat); | |
221 s.useGrandInclude = useGrandInclude; // propagate this | |
222 doFiles(s); | |
223 for (Iterator iter = s.iterator(); iter.hasNext(); ) { | |
224 FileList l = (FileList) iter.next(); | |
225 l.beenHere = false; | |
226 } | |
227 return s; | |
228 } | |
229 | |
230 /** if .h file is included thresh times, put it in the grand | |
231 include file */ | |
232 public void putInclFile(Database db) | |
233 throws IOException { | |
234 boolean needline = true; | |
235 FileName inclName = plat.getInclFileTemplate().copyStem(name); | |
236 PrintWriter inclFile = | |
237 new PrintWriter(new FileWriter(inclName.dirPreStemSuff())); | |
238 if (plat.haveGrandInclude() && plat.includeGIInEachIncl()) { | |
239 inclFile.println("# include \"" + | |
240 plat.getGIFileTemplate().dirPreStemAltSuff() + | |
241 "\""); | |
242 needline = false; | |
243 } | |
244 for (Iterator iter = iterator(); iter.hasNext(); ) { | |
245 FileList hfile = (FileList) iter.next(); | |
246 if (!db.hfileIsInGrandInclude(hfile, this)) { | |
247 inclFile.println("# include \"" + | |
248 plat.getInclFileTemplate().getInvDir() + | |
249 hfile.name + | |
250 "\""); | |
251 needline = false; | |
252 } | |
253 } | |
254 | |
255 // Solaris C++ in strict mode warns about empty files | |
256 | |
257 if(needline) { | |
258 inclFile.println(); | |
259 } | |
260 | |
261 inclFile.close(); | |
262 } | |
263 } |