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 */
24
25 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/javaClasses.inline.hpp"
28 #include "classfile/vmSymbols.hpp"
29 #include "logging/log.hpp"
30 #include "logging/logStream.hpp"
31 #include "memory/oopFactory.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "oops/objArrayOop.inline.hpp"
34 #include "prims/stackwalk.hpp"
35 #include "runtime/globals.hpp"
36 #include "runtime/handles.inline.hpp"
37 #include "runtime/javaCalls.hpp"
38 #include "runtime/vframe.hpp"
39 #include "utilities/globalDefinitions.hpp"
40
41 // setup and cleanup actions
42 void BaseFrameStream::setup_magic_on_entry(objArrayHandle frames_array) {
43 frames_array->obj_at_put(magic_pos, _thread->threadObj());
44 _anchor = address_value();
45 assert(check_magic(frames_array), "invalid magic");
46 }
47
48 bool BaseFrameStream::check_magic(objArrayHandle frames_array) {
49 oop m1 = frames_array->obj_at(magic_pos);
50 jlong m2 = _anchor;
51 if (m1 == _thread->threadObj() && m2 == address_value()) return true;
52 return false;
53 }
54
55 bool BaseFrameStream::cleanup_magic_on_exit(objArrayHandle frames_array) {
56 bool ok = check_magic(frames_array);
57 frames_array->obj_at_put(magic_pos, NULL);
58 _anchor = 0L;
59 return ok;
60 }
61
62 JavaFrameStream::JavaFrameStream(JavaThread* thread, int mode)
63 : BaseFrameStream(thread), _vfst(thread) {
64 _need_method_info = StackWalk::need_method_info(mode);
65 }
66
67 // Returns the BaseFrameStream for the current stack being traversed.
68 //
69 // Parameters:
70 // thread Current Java thread.
71 // magic Magic value used for each stack walking
72 // frames_array User-supplied buffers. The 0th element is reserved
73 // for this BaseFrameStream to use
74 //
75 BaseFrameStream* BaseFrameStream::from_current(JavaThread* thread, jlong magic,
76 objArrayHandle frames_array)
77 {
78 assert(thread != NULL && thread->is_Java_thread(), "");
79 oop m1 = frames_array->obj_at(magic_pos);
80 if (m1 != thread->threadObj()) return NULL;
81 if (magic == 0L) return NULL;
82 BaseFrameStream* stream = (BaseFrameStream*) (intptr_t) magic;
83 if (!stream->is_valid_in(thread, frames_array)) return NULL;
84 return stream;
85 }
|
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 */
24
25 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/javaClasses.inline.hpp"
28 #include "classfile/vmSymbols.hpp"
29 #include "logging/log.hpp"
30 #include "logging/logStream.hpp"
31 #include "memory/oopFactory.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "oops/objArrayOop.inline.hpp"
34 #include "prims/stackwalk.hpp"
35 #include "runtime/globals.hpp"
36 #include "runtime/handles.inline.hpp"
37 #include "runtime/javaCalls.hpp"
38 #include "runtime/vframe.inline.hpp"
39 #include "utilities/globalDefinitions.hpp"
40
41 // setup and cleanup actions
42 void BaseFrameStream::setup_magic_on_entry(objArrayHandle frames_array) {
43 frames_array->obj_at_put(magic_pos, _thread->threadObj());
44 _anchor = address_value();
45 assert(check_magic(frames_array), "invalid magic");
46 }
47
48 bool BaseFrameStream::check_magic(objArrayHandle frames_array) {
49 oop m1 = frames_array->obj_at(magic_pos);
50 jlong m2 = _anchor;
51 if (m1 == _thread->threadObj() && m2 == address_value()) return true;
52 return false;
53 }
54
55 bool BaseFrameStream::cleanup_magic_on_exit(objArrayHandle frames_array) {
56 bool ok = check_magic(frames_array);
57 frames_array->obj_at_put(magic_pos, NULL);
58 _anchor = 0L;
59 return ok;
60 }
61
62 JavaFrameStream::JavaFrameStream(JavaThread* thread, int mode)
63 : BaseFrameStream(thread), _vfst(thread) {
64 _need_method_info = StackWalk::need_method_info(mode);
65 }
66
67 void JavaFrameStream::next() { _vfst.next();}
68
69 // Returns the BaseFrameStream for the current stack being traversed.
70 //
71 // Parameters:
72 // thread Current Java thread.
73 // magic Magic value used for each stack walking
74 // frames_array User-supplied buffers. The 0th element is reserved
75 // for this BaseFrameStream to use
76 //
77 BaseFrameStream* BaseFrameStream::from_current(JavaThread* thread, jlong magic,
78 objArrayHandle frames_array)
79 {
80 assert(thread != NULL && thread->is_Java_thread(), "");
81 oop m1 = frames_array->obj_at(magic_pos);
82 if (m1 != thread->threadObj()) return NULL;
83 if (magic == 0L) return NULL;
84 BaseFrameStream* stream = (BaseFrameStream*) (intptr_t) magic;
85 if (!stream->is_valid_in(thread, frames_array)) return NULL;
86 return stream;
87 }
|