Fri, 20 Sep 2013 10:53:28 +0200
8024974: Incorrect use of GC_locker::is_active()
Summary: SymbolTable and StringTable can make calls to GC_locker::is_active() outside a safepoint. This isn't safe because the GC_locker active state (lock count) is only updated at a safepoint and only remains valid as long as _needs_gc is true. However, outside a safepoint_needs_gc can change to false at any time, which makes it impossible to do a correct call to is_active() in that context. In this case these calls can just be removed since the input argument to basic_add() should never be on the heap and so there's no need to check the GC_locker state. This change also adjusts the assert() in is_active() to makes sure all calls to this function are always done under a safepoint.
Reviewed-by: brutisso, dcubed
Contributed-by: per.liden@oracle.com
1 #
2 # Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
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 #
19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 # or visit www.oracle.com if you need additional information or have any
21 # questions.
22 #
23 #
25 # This makefile (jvmti.make) is included from the jvmti.make in the
26 # build directories.
27 #
28 # It knows how to build and run the tools to generate jvmti.
30 !include $(WorkSpace)/make/windows/makefiles/rules.make
32 # #########################################################################
34 JvmtiSrcDir = $(WorkSpace)/src/share/vm/prims
35 InterpreterSrcDir = $(WorkSpace)/src/share/vm/interpreter
37 JvmtiGeneratedNames = \
38 jvmtiEnv.hpp \
39 jvmtiEnter.cpp \
40 jvmtiEnterTrace.cpp \
41 jvmtiEnvRecommended.cpp \
42 bytecodeInterpreterWithChecks.cpp \
43 jvmti.h \
45 JvmtiEnvFillSource = $(JvmtiSrcDir)/jvmtiEnvFill.java
46 JvmtiEnvFillClass = $(JvmtiOutDir)/jvmtiEnvFill.class
48 JvmtiGenSource = $(JvmtiSrcDir)/jvmtiGen.java
49 JvmtiGenClass = $(JvmtiOutDir)/jvmtiGen.class
51 #Note: JvmtiGeneratedFiles must be kept in sync with JvmtiGeneratedNames by hand.
52 #Should be equivalent #to "JvmtiGeneratedFiles = $(JvmtiGeneratedNames:%=$(JvmtiOutDir)/%)"
53 JvmtiGeneratedFiles = \
54 $(JvmtiOutDir)/jvmtiEnv.hpp \
55 $(JvmtiOutDir)/jvmtiEnter.cpp \
56 $(JvmtiOutDir)/jvmtiEnterTrace.cpp \
57 $(JvmtiOutDir)/jvmtiEnvRecommended.cpp\
58 $(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp\
59 $(JvmtiOutDir)/jvmti.h \
61 XSLT = $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen
63 # #########################################################################
65 both = $(JvmtiGenClass) $(JvmtiSrcDir)/jvmti.xml $(JvmtiSrcDir)/jvmtiLib.xsl
67 default::
68 @if not exist $(JvmtiOutDir) mkdir $(JvmtiOutDir)
70 $(JvmtiGenClass): $(JvmtiGenSource)
71 $(COMPILE_JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource)
73 $(JvmtiEnvFillClass): $(JvmtiEnvFillSource)
74 @$(COMPILE_JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource)
76 $(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl
77 @echo Generating $@
78 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnter.cpp -PARAM interface jvmti
80 $(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp: $(JvmtiGenClass) $(InterpreterSrcDir)/bytecodeInterpreter.cpp $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl
81 @echo Generating $@
82 @$(XSLT) -IN $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml -XSL $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl -OUT $(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp
84 $(JvmtiOutDir)/jvmtiEnterTrace.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl
85 @echo Generating $@
86 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnterTrace.cpp -PARAM interface jvmti -PARAM trace Trace
88 $(JvmtiOutDir)/jvmtiEnvRecommended.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnv.xsl $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiEnvFillClass)
89 @echo Generating $@
90 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnv.xsl -OUT $(JvmtiOutDir)/jvmtiEnvStub.cpp
91 @$(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiEnvFill $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiOutDir)/jvmtiEnvStub.cpp $(JvmtiOutDir)/jvmtiEnvRecommended.cpp
93 $(JvmtiOutDir)/jvmtiEnv.hpp: $(both) $(JvmtiSrcDir)/jvmtiHpp.xsl
94 @echo Generating $@
95 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiHpp.xsl -OUT $(JvmtiOutDir)/jvmtiEnv.hpp
97 $(JvmtiOutDir)/jvmti.h: $(both) $(JvmtiSrcDir)/jvmtiH.xsl
98 @echo Generating $@
99 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiH.xsl -OUT $(JvmtiOutDir)/jvmti.h
101 jvmtidocs: $(JvmtiOutDir)/jvmti.html
103 $(JvmtiOutDir)/jvmti.html: $(both) $(JvmtiSrcDir)/jvmti.xsl
104 @echo Generating $@
105 @$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmti.xsl -OUT $(JvmtiOutDir)/jvmti.html
107 # #########################################################################
109 cleanall :
110 rm $(JvmtiGenClass) $(JvmtiEnvFillClass) $(JvmtiGeneratedFiles)
112 # #########################################################################
114 .PHONY: jvmtidocs cleanall