jvmtiImpl.hpp revision 3465:d2a62e0f25eb
1/*
2 * Copyright (c) 1999, 2011, 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 */
24
25#ifndef SHARE_VM_PRIMS_JVMTIIMPL_HPP
26#define SHARE_VM_PRIMS_JVMTIIMPL_HPP
27
28#ifndef JVMTI_KERNEL
29
30#include "classfile/systemDictionary.hpp"
31#include "jvmtifiles/jvmti.h"
32#include "oops/objArrayOop.hpp"
33#include "prims/jvmtiEnvThreadState.hpp"
34#include "prims/jvmtiEventController.hpp"
35#include "prims/jvmtiTrace.hpp"
36#include "prims/jvmtiUtil.hpp"
37#include "runtime/stackValueCollection.hpp"
38#include "runtime/vm_operations.hpp"
39
40//
41// Forward Declarations
42//
43
44class JvmtiBreakpoint;
45class JvmtiBreakpoints;
46
47
48///////////////////////////////////////////////////////////////
49//
50// class GrowableCache, GrowableElement
51// Used by              : JvmtiBreakpointCache
52// Used by JVMTI methods: none directly.
53//
54// GrowableCache is a permanent CHeap growable array of <GrowableElement *>
55//
56// In addition, the GrowableCache maintains a NULL terminated cache array of type address
57// that's created from the element array using the function:
58//     address GrowableElement::getCacheValue().
59//
60// Whenever the GrowableArray changes size, the cache array gets recomputed into a new C_HEAP allocated
61// block of memory. Additionally, every time the cache changes its position in memory, the
62//    void (*_listener_fun)(void *this_obj, address* cache)
63// gets called with the cache's new address. This gives the user of the GrowableCache a callback
64// to update its pointer to the address cache.
65//
66
67class GrowableElement : public CHeapObj<mtInternal> {
68public:
69  virtual address getCacheValue()          =0;
70  virtual bool equals(GrowableElement* e)  =0;
71  virtual bool lessThan(GrowableElement *e)=0;
72  virtual GrowableElement *clone()         =0;
73  virtual void oops_do(OopClosure* f)      =0;
74};
75
76class GrowableCache VALUE_OBJ_CLASS_SPEC {
77
78private:
79  // Object pointer passed into cache & listener functions.
80  void *_this_obj;
81
82  // Array of elements in the collection
83  GrowableArray<GrowableElement *> *_elements;
84
85  // Parallel array of cached values
86  address *_cache;
87
88  // Listener for changes to the _cache field.
89  // Called whenever the _cache field has it's value changed
90  // (but NOT when cached elements are recomputed).
91  void (*_listener_fun)(void *, address*);
92
93  static bool equals(void *, GrowableElement *);
94
95  // recache all elements after size change, notify listener
96  void recache();
97
98public:
99   GrowableCache();
100   ~GrowableCache();
101
102  void initialize(void *this_obj, void listener_fun(void *, address*) );
103
104  // number of elements in the collection
105  int length();
106  // get the value of the index element in the collection
107  GrowableElement* at(int index);
108  // find the index of the element, -1 if it doesn't exist
109  int find(GrowableElement* e);
110  // append a copy of the element to the end of the collection, notify listener
111  void append(GrowableElement* e);
112  // insert a copy of the element using lessthan(), notify listener
113  void insert(GrowableElement* e);
114  // remove the element at index, notify listener
115  void remove (int index);
116  // clear out all elements and release all heap space, notify listener
117  void clear();
118  // apply f to every element and update the cache
119  void oops_do(OopClosure* f);
120  // update the cache after a full gc
121  void gc_epilogue();
122};
123
124
125///////////////////////////////////////////////////////////////
126//
127// class JvmtiBreakpointCache
128// Used by              : JvmtiBreakpoints
129// Used by JVMTI methods: none directly.
130// Note   : typesafe wrapper for GrowableCache of JvmtiBreakpoint
131//
132
133class JvmtiBreakpointCache : public CHeapObj<mtInternal> {
134
135private:
136  GrowableCache _cache;
137
138public:
139  JvmtiBreakpointCache()  {}
140  ~JvmtiBreakpointCache() {}
141
142  void initialize(void *this_obj, void listener_fun(void *, address*) ) {
143    _cache.initialize(this_obj,listener_fun);
144  }
145
146  int length()                          { return _cache.length(); }
147  JvmtiBreakpoint& at(int index)        { return (JvmtiBreakpoint&) *(_cache.at(index)); }
148  int find(JvmtiBreakpoint& e)          { return _cache.find((GrowableElement *) &e); }
149  void append(JvmtiBreakpoint& e)       { _cache.append((GrowableElement *) &e); }
150  void remove (int index)               { _cache.remove(index); }
151  void clear()                          { _cache.clear(); }
152  void oops_do(OopClosure* f)           { _cache.oops_do(f); }
153  void gc_epilogue()                    { _cache.gc_epilogue(); }
154};
155
156
157///////////////////////////////////////////////////////////////
158//
159// class JvmtiBreakpoint
160// Used by              : JvmtiBreakpoints
161// Used by JVMTI methods: SetBreakpoint, ClearBreakpoint, ClearAllBreakpoints
162// Note: Extends GrowableElement for use in a GrowableCache
163//
164// A JvmtiBreakpoint describes a location (class, method, bci) to break at.
165//
166
167typedef void (methodOopDesc::*method_action)(int _bci);
168
169class JvmtiBreakpoint : public GrowableElement {
170private:
171  methodOop             _method;
172  int                   _bci;
173  Bytecodes::Code       _orig_bytecode;
174
175public:
176  JvmtiBreakpoint();
177  JvmtiBreakpoint(methodOop m_method, jlocation location);
178  bool equals(JvmtiBreakpoint& bp);
179  bool lessThan(JvmtiBreakpoint &bp);
180  void copy(JvmtiBreakpoint& bp);
181  bool is_valid();
182  address getBcp();
183  void each_method_version_do(method_action meth_act);
184  void set();
185  void clear();
186  void print();
187
188  methodOop method() { return _method; }
189
190  // GrowableElement implementation
191  address getCacheValue()         { return getBcp(); }
192  bool lessThan(GrowableElement* e) { Unimplemented(); return false; }
193  bool equals(GrowableElement* e) { return equals((JvmtiBreakpoint&) *e); }
194  void oops_do(OopClosure* f)     { f->do_oop((oop *) &_method); }
195  GrowableElement *clone()        {
196    JvmtiBreakpoint *bp = new JvmtiBreakpoint();
197    bp->copy(*this);
198    return bp;
199  }
200};
201
202
203///////////////////////////////////////////////////////////////
204//
205// class VM_ChangeBreakpoints
206// Used by              : JvmtiBreakpoints
207// Used by JVMTI methods: none directly.
208// Note: A Helper class.
209//
210// VM_ChangeBreakpoints implements a VM_Operation for ALL modifications to the JvmtiBreakpoints class.
211//
212
213class VM_ChangeBreakpoints : public VM_Operation {
214private:
215  JvmtiBreakpoints* _breakpoints;
216  int               _operation;
217  JvmtiBreakpoint*  _bp;
218
219public:
220  enum { SET_BREAKPOINT=0, CLEAR_BREAKPOINT=1, CLEAR_ALL_BREAKPOINT=2 };
221
222  VM_ChangeBreakpoints(JvmtiBreakpoints* breakpoints, int operation) {
223    _breakpoints = breakpoints;
224    _bp = NULL;
225    _operation = operation;
226    assert(breakpoints != NULL, "breakpoints != NULL");
227    assert(operation == CLEAR_ALL_BREAKPOINT, "unknown breakpoint operation");
228  }
229  VM_ChangeBreakpoints(JvmtiBreakpoints* breakpoints, int operation, JvmtiBreakpoint *bp) {
230    _breakpoints = breakpoints;
231    _bp = bp;
232    _operation = operation;
233    assert(breakpoints != NULL, "breakpoints != NULL");
234    assert(bp != NULL, "bp != NULL");
235    assert(operation == SET_BREAKPOINT || operation == CLEAR_BREAKPOINT , "unknown breakpoint operation");
236  }
237
238  VMOp_Type type() const { return VMOp_ChangeBreakpoints; }
239  void doit();
240  void oops_do(OopClosure* f);
241};
242
243
244///////////////////////////////////////////////////////////////
245//
246// class JvmtiBreakpoints
247// Used by              : JvmtiCurrentBreakpoints
248// Used by JVMTI methods: none directly
249// Note: A Helper class
250//
251// JvmtiBreakpoints is a GrowableCache of JvmtiBreakpoint.
252// All changes to the GrowableCache occur at a safepoint using VM_ChangeBreakpoints.
253//
254// Because _bps is only modified at safepoints, its possible to always use the
255// cached byte code pointers from _bps without doing any synchronization (see JvmtiCurrentBreakpoints).
256//
257// It would be possible to make JvmtiBreakpoints a static class, but I've made it
258// CHeap allocated to emphasize its similarity to JvmtiFramePops.
259//
260
261class JvmtiBreakpoints : public CHeapObj<mtInternal> {
262private:
263
264  JvmtiBreakpointCache _bps;
265
266  // These should only be used by VM_ChangeBreakpoints
267  // to insure they only occur at safepoints.
268  // Todo: add checks for safepoint
269  friend class VM_ChangeBreakpoints;
270  void set_at_safepoint(JvmtiBreakpoint& bp);
271  void clear_at_safepoint(JvmtiBreakpoint& bp);
272  void clearall_at_safepoint();
273
274  static void do_element(GrowableElement *e);
275
276public:
277  JvmtiBreakpoints(void listener_fun(void *, address *));
278  ~JvmtiBreakpoints();
279
280  int length();
281  void oops_do(OopClosure* f);
282  void print();
283
284  int  set(JvmtiBreakpoint& bp);
285  int  clear(JvmtiBreakpoint& bp);
286  void clearall_in_class_at_safepoint(klassOop klass);
287  void clearall();
288  void gc_epilogue();
289};
290
291
292///////////////////////////////////////////////////////////////
293//
294// class JvmtiCurrentBreakpoints
295//
296// A static wrapper class for the JvmtiBreakpoints that provides:
297// 1. a fast inlined function to check if a byte code pointer is a breakpoint (is_breakpoint).
298// 2. a function for lazily creating the JvmtiBreakpoints class (this is not strictly necessary,
299//    but I'm copying the code from JvmtiThreadState which needs to lazily initialize
300//    JvmtiFramePops).
301// 3. An oops_do entry point for GC'ing the breakpoint array.
302//
303
304class JvmtiCurrentBreakpoints : public AllStatic {
305
306private:
307
308  // Current breakpoints, lazily initialized by get_jvmti_breakpoints();
309  static JvmtiBreakpoints *_jvmti_breakpoints;
310
311  // NULL terminated cache of byte-code pointers corresponding to current breakpoints.
312  // Updated only at safepoints (with listener_fun) when the cache is moved.
313  // It exists only to make is_breakpoint fast.
314  static address          *_breakpoint_list;
315  static inline void set_breakpoint_list(address *breakpoint_list) { _breakpoint_list = breakpoint_list; }
316  static inline address *get_breakpoint_list()                     { return _breakpoint_list; }
317
318  // Listener for the GrowableCache in _jvmti_breakpoints, updates _breakpoint_list.
319  static void listener_fun(void *this_obj, address *cache);
320
321public:
322  static void initialize();
323  static void destroy();
324
325  // lazily create _jvmti_breakpoints and _breakpoint_list
326  static JvmtiBreakpoints& get_jvmti_breakpoints();
327
328  // quickly test whether the bcp matches a cached breakpoint in the list
329  static inline bool is_breakpoint(address bcp);
330
331  static void oops_do(OopClosure* f);
332  static void gc_epilogue();
333};
334
335// quickly test whether the bcp matches a cached breakpoint in the list
336bool JvmtiCurrentBreakpoints::is_breakpoint(address bcp) {
337    address *bps = get_breakpoint_list();
338    if (bps == NULL) return false;
339    for ( ; (*bps) != NULL; bps++) {
340      if ((*bps) == bcp) return true;
341    }
342    return false;
343}
344
345///////////////////////////////////////////////////////////////
346// The get/set local operations must only be done by the VM thread
347// because the interpreter version needs to access oop maps, which can
348// only safely be done by the VM thread
349//
350// I'm told that in 1.5 oop maps are now protected by a lock and
351// we could get rid of the VM op
352// However if the VM op is removed then the target thread must
353// be suspended AND a lock will be needed to prevent concurrent
354// setting of locals to the same java thread. This lock is needed
355// to prevent compiledVFrames from trying to add deferred updates
356// to the thread simultaneously.
357//
358class VM_GetOrSetLocal : public VM_Operation {
359 protected:
360  JavaThread* _thread;
361  JavaThread* _calling_thread;
362  jint        _depth;
363  jint        _index;
364  BasicType   _type;
365  jvalue      _value;
366  javaVFrame* _jvf;
367  bool        _set;
368
369  // It is possible to get the receiver out of a non-static native wrapper
370  // frame.  Use VM_GetReceiver to do this.
371  virtual bool getting_receiver() const { return false; }
372
373  jvmtiError  _result;
374
375  vframe* get_vframe();
376  javaVFrame* get_java_vframe();
377  bool check_slot_type(javaVFrame* vf);
378
379public:
380  // Constructor for non-object getter
381  VM_GetOrSetLocal(JavaThread* thread, jint depth, jint index, BasicType type);
382
383  // Constructor for object or non-object setter
384  VM_GetOrSetLocal(JavaThread* thread, jint depth, jint index, BasicType type, jvalue value);
385
386  // Constructor for object getter
387  VM_GetOrSetLocal(JavaThread* thread, JavaThread* calling_thread, jint depth,
388                   int index);
389
390  VMOp_Type type() const { return VMOp_GetOrSetLocal; }
391  jvalue value()         { return _value; }
392  jvmtiError result()    { return _result; }
393
394  bool doit_prologue();
395  void doit();
396  bool allow_nested_vm_operations() const;
397  const char* name() const                       { return "get/set locals"; }
398
399  // Check that the klass is assignable to a type with the given signature.
400  static bool is_assignable(const char* ty_sign, Klass* klass, Thread* thread);
401};
402
403class VM_GetReceiver : public VM_GetOrSetLocal {
404 protected:
405  virtual bool getting_receiver() const { return true; }
406
407 public:
408  VM_GetReceiver(JavaThread* thread, JavaThread* calling_thread, jint depth);
409  const char* name() const                       { return "get receiver"; }
410};
411
412
413///////////////////////////////////////////////////////////////
414//
415// class JvmtiSuspendControl
416//
417// Convenience routines for suspending and resuming threads.
418//
419// All attempts by JVMTI to suspend and resume threads must go through the
420// JvmtiSuspendControl interface.
421//
422// methods return true if successful
423//
424class JvmtiSuspendControl : public AllStatic {
425public:
426  // suspend the thread, taking it to a safepoint
427  static bool suspend(JavaThread *java_thread);
428  // resume the thread
429  static bool resume(JavaThread *java_thread);
430
431  static void print();
432};
433
434#endif // !JVMTI_KERNEL
435
436/**
437 * When a thread (such as the compiler thread or VM thread) cannot post a
438 * JVMTI event itself because the event needs to be posted from a Java
439 * thread, then it can defer the event to the Service thread for posting.
440 * The information needed to post the event is encapsulated into this class
441 * and then enqueued onto the JvmtiDeferredEventQueue, where the Service
442 * thread will pick it up and post it.
443 *
444 * This is currently only used for posting compiled-method-load and unload
445 * events, which we don't want posted from the compiler thread.
446 */
447class JvmtiDeferredEvent VALUE_OBJ_CLASS_SPEC {
448  friend class JvmtiDeferredEventQueue;
449 private:
450  typedef enum {
451    TYPE_NONE,
452    TYPE_COMPILED_METHOD_LOAD,
453    TYPE_COMPILED_METHOD_UNLOAD,
454    TYPE_DYNAMIC_CODE_GENERATED
455  } Type;
456
457  Type _type;
458  union {
459    nmethod* compiled_method_load;
460    struct {
461      nmethod* nm;
462      jmethodID method_id;
463      const void* code_begin;
464    } compiled_method_unload;
465    struct {
466      const char* name;
467      const void* code_begin;
468      const void* code_end;
469    } dynamic_code_generated;
470  } _event_data;
471
472  JvmtiDeferredEvent(Type t) : _type(t) {}
473
474 public:
475
476  JvmtiDeferredEvent() : _type(TYPE_NONE) {}
477
478  // Factory methods
479  static JvmtiDeferredEvent compiled_method_load_event(nmethod* nm)
480    KERNEL_RETURN_(JvmtiDeferredEvent());
481  static JvmtiDeferredEvent compiled_method_unload_event(nmethod* nm,
482      jmethodID id, const void* code) KERNEL_RETURN_(JvmtiDeferredEvent());
483  static JvmtiDeferredEvent dynamic_code_generated_event(
484      const char* name, const void* begin, const void* end)
485          KERNEL_RETURN_(JvmtiDeferredEvent());
486
487  // Actually posts the event.
488  void post() KERNEL_RETURN;
489};
490
491/**
492 * Events enqueued on this queue wake up the Service thread which dequeues
493 * and posts the events.  The Service_lock is required to be held
494 * when operating on the queue (except for the "pending" events).
495 */
496class JvmtiDeferredEventQueue : AllStatic {
497  friend class JvmtiDeferredEvent;
498 private:
499  class QueueNode : public CHeapObj<mtInternal> {
500   private:
501    JvmtiDeferredEvent _event;
502    QueueNode* _next;
503
504   public:
505    QueueNode(const JvmtiDeferredEvent& event)
506      : _event(event), _next(NULL) {}
507
508    const JvmtiDeferredEvent& event() const { return _event; }
509    QueueNode* next() const { return _next; }
510
511    void set_next(QueueNode* next) { _next = next; }
512  };
513
514  static QueueNode* _queue_head;             // Hold Service_lock to access
515  static QueueNode* _queue_tail;             // Hold Service_lock to access
516  static volatile QueueNode* _pending_list;  // Uses CAS for read/update
517
518  // Transfers events from the _pending_list to the _queue.
519  static void process_pending_events() KERNEL_RETURN;
520
521 public:
522  // Must be holding Service_lock when calling these
523  static bool has_events() KERNEL_RETURN_(false);
524  static void enqueue(const JvmtiDeferredEvent& event) KERNEL_RETURN;
525  static JvmtiDeferredEvent dequeue() KERNEL_RETURN_(JvmtiDeferredEvent());
526
527  // Used to enqueue events without using a lock, for times (such as during
528  // safepoint) when we can't or don't want to lock the Service_lock.
529  //
530  // Events will be held off to the side until there's a call to
531  // dequeue(), enqueue(), or process_pending_events() (all of which require
532  // the holding of the Service_lock), and will be enqueued at that time.
533  static void add_pending_event(const JvmtiDeferredEvent&) KERNEL_RETURN;
534};
535
536// Utility macro that checks for NULL pointers:
537#define NULL_CHECK(X, Y) if ((X) == NULL) { return (Y); }
538
539#endif // SHARE_VM_PRIMS_JVMTIIMPL_HPP
540