< prev index next >

src/hotspot/share/prims/jvmtiExport.hpp

Print this page
rev 49521 : [mq]: heap8
rev 49522 : [mq]: event_rebased


 106   JVMTI_SUPPORT_FLAG(should_post_monitor_contended_enter)
 107   JVMTI_SUPPORT_FLAG(should_post_monitor_contended_entered)
 108   JVMTI_SUPPORT_FLAG(should_post_monitor_wait)
 109   JVMTI_SUPPORT_FLAG(should_post_monitor_waited)
 110   JVMTI_SUPPORT_FLAG(should_post_data_dump)
 111   JVMTI_SUPPORT_FLAG(should_post_garbage_collection_start)
 112   JVMTI_SUPPORT_FLAG(should_post_garbage_collection_finish)
 113   JVMTI_SUPPORT_FLAG(should_post_on_exceptions)
 114 
 115   // ------ the below maybe don't have to be (but are for now)
 116   // fixed conditions here ------------
 117   // any events can be enabled
 118   JVMTI_SUPPORT_FLAG(should_post_thread_life)
 119   JVMTI_SUPPORT_FLAG(should_post_object_free)
 120   JVMTI_SUPPORT_FLAG(should_post_resource_exhausted)
 121 
 122   // we are holding objects on the heap - need to talk to GC - e.g.
 123   // breakpoint info
 124   JVMTI_SUPPORT_FLAG(should_clean_up_heap_objects)
 125   JVMTI_SUPPORT_FLAG(should_post_vm_object_alloc)

 126 
 127   // If flag cannot be implemented, give an error if on=true
 128   static void report_unsupported(bool on);
 129 
 130   // these should only be called by the friend class
 131   friend class JvmtiManageCapabilities;
 132   inline static void set_can_modify_any_class(bool on) {
 133     JVMTI_ONLY(_can_modify_any_class = (on != 0);)
 134   }
 135   inline static void set_can_access_local_variables(bool on) {
 136     JVMTI_ONLY(_can_access_local_variables = (on != 0);)
 137   }
 138   inline static void set_can_hotswap_or_post_breakpoint(bool on) {
 139     JVMTI_ONLY(_can_hotswap_or_post_breakpoint = (on != 0);)
 140   }
 141   inline static void set_can_walk_any_space(bool on) {
 142     JVMTI_ONLY(_can_walk_any_space = (on != 0);)
 143   }
 144 
 145   enum {


 359   static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) NOT_JVMTI_RETURN;
 360 
 361   static void post_garbage_collection_finish() NOT_JVMTI_RETURN;
 362   static void post_garbage_collection_start() NOT_JVMTI_RETURN;
 363   static void post_data_dump() NOT_JVMTI_RETURN;
 364   static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
 365   static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
 366   static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) NOT_JVMTI_RETURN;
 367   static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) NOT_JVMTI_RETURN;
 368   static void post_object_free(JvmtiEnv* env, jlong tag) NOT_JVMTI_RETURN;
 369   static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) NOT_JVMTI_RETURN;
 370   static void record_vm_internal_object_allocation(oop object) NOT_JVMTI_RETURN;
 371   // Post objects collected by vm_object_alloc_event_collector.
 372   static void post_vm_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN;
 373   // Collects vm internal objects for later event posting.
 374   inline static void vm_object_alloc_event_collector(oop object) {
 375     if (should_post_vm_object_alloc()) {
 376       record_vm_internal_object_allocation(object);
 377     }
 378   }











 379   inline static void post_array_size_exhausted() {
 380     if (should_post_resource_exhausted()) {
 381       post_resource_exhausted(JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR,
 382                               "Requested array size exceeds VM limit");
 383     }
 384   }
 385 
 386   static void cleanup_thread             (JavaThread* thread) NOT_JVMTI_RETURN;
 387   static void clear_detected_exception   (JavaThread* thread) NOT_JVMTI_RETURN;
 388 
 389   static void oops_do(OopClosure* f) NOT_JVMTI_RETURN;
 390   static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) NOT_JVMTI_RETURN;
 391   static void gc_epilogue() NOT_JVMTI_RETURN;
 392 
 393   static void transition_pending_onload_raw_monitors() NOT_JVMTI_RETURN;
 394 
 395 #if INCLUDE_SERVICES
 396   // attach support
 397   static jint load_agent_library(const char *agent, const char *absParam, const char *options, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR);
 398 #endif


 420  public:
 421   JvmtiCodeBlobDesc(const char *name, address code_begin, address code_end) {
 422     assert(name != NULL, "all code blobs must be named");
 423     strncpy(_name, name, sizeof(_name));
 424     _name[sizeof(_name)-1] = '\0';
 425     _code_begin = code_begin;
 426     _code_end = code_end;
 427   }
 428   char* name()                  { return _name; }
 429   address code_begin()          { return _code_begin; }
 430   address code_end()            { return _code_end; }
 431 };
 432 
 433 // JvmtiEventCollector is a helper class to setup thread for
 434 // event collection.
 435 class JvmtiEventCollector : public StackObj {
 436  private:
 437   JvmtiEventCollector* _prev;  // Save previous one to support nested event collector.
 438 
 439  public:


 440   void setup_jvmti_thread_state(); // Set this collector in current thread.
 441   void unset_jvmti_thread_state(); // Reset previous collector in current thread.
 442   virtual bool is_dynamic_code_event()   { return false; }
 443   virtual bool is_vm_object_alloc_event(){ return false; }

 444   JvmtiEventCollector *get_prev()        { return _prev; }
 445 };
 446 
 447 // A JvmtiDynamicCodeEventCollector is a helper class for the JvmtiExport
 448 // interface. It collects "dynamic code generated" events that are posted
 449 // while holding locks. When the event collector goes out of scope the
 450 // events will be posted.
 451 //
 452 // Usage :-
 453 //
 454 // {
 455 //   JvmtiDynamicCodeEventCollector event_collector;
 456 //   :
 457 //   { MutexLocker ml(...)
 458 //     :
 459 //     JvmtiExport::post_dynamic_code_generated_while_holding_locks(...)
 460 //   }
 461 //   // event collector goes out of scope => post events to profiler.
 462 // }
 463 
 464 class JvmtiDynamicCodeEventCollector : public JvmtiEventCollector {
 465  private:
 466   GrowableArray<JvmtiCodeBlobDesc*>* _code_blobs;           // collected code blob events
 467 
 468   friend class JvmtiExport;
 469   void register_stub(const char* name, address start, address end);
 470 
 471  public:
 472   JvmtiDynamicCodeEventCollector()  NOT_JVMTI_RETURN;
 473   ~JvmtiDynamicCodeEventCollector() NOT_JVMTI_RETURN;
 474   bool is_dynamic_code_event()   { return true; }
 475 
 476 };
 477 
 478 // Used to record vm internally allocated object oops and post
 479 // vm object alloc event for objects visible to java world.
 480 // Constructor enables JvmtiThreadState flag and all vm allocated
 481 // objects are recorded in a growable array. When destructor is
 482 // called the vm object alloc event is posted for each objects
 483 // visible to java world.
 484 // See jvm.cpp file for its usage.
 485 //
 486 class JvmtiVMObjectAllocEventCollector : public JvmtiEventCollector {
 487  private:
 488   GrowableArray<oop>* _allocated; // field to record vm internally allocated object oop.
 489   bool _enable;                   // This flag is enabled in constructor and disabled
 490                                   // in destructor before posting event. To avoid
 491                                   // collection of objects allocated while running java code inside
 492                                   // agent post_vm_object_alloc() event handler.

 493 
 494   //GC support
 495   void oops_do(OopClosure* f);
 496 
 497   friend class JvmtiExport;
 498   // Record vm allocated object oop.
 499   inline void record_allocation(oop obj);
 500 
 501   //GC support
 502   static void oops_do_for_all_threads(OopClosure* f);
 503 
 504  public:
 505   JvmtiVMObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 506   ~JvmtiVMObjectAllocEventCollector() NOT_JVMTI_RETURN;
 507   bool is_vm_object_alloc_event()   { return true; }
 508 
 509   bool is_enabled()                 { return _enable; }
 510   void set_enabled(bool on)         { _enable = on; }
 511 };
 512 














 513 













 514 
 515 // Marker class to disable the posting of VMObjectAlloc events
 516 // within its scope.
 517 //
 518 // Usage :-
 519 //
 520 // {
 521 //   NoJvmtiVMObjectAllocMark njm;
 522 //   :
 523 //   // VMObjAlloc event will not be posted
 524 //   JvmtiExport::vm_object_alloc_event_collector(obj);
 525 //   :
 526 // }
 527 
 528 class NoJvmtiVMObjectAllocMark : public StackObj {
 529  private:
 530   // enclosing collector if enabled, NULL otherwise
 531   JvmtiVMObjectAllocEventCollector *_collector;
 532 
 533   bool was_enabled()    { return _collector != NULL; }




 106   JVMTI_SUPPORT_FLAG(should_post_monitor_contended_enter)
 107   JVMTI_SUPPORT_FLAG(should_post_monitor_contended_entered)
 108   JVMTI_SUPPORT_FLAG(should_post_monitor_wait)
 109   JVMTI_SUPPORT_FLAG(should_post_monitor_waited)
 110   JVMTI_SUPPORT_FLAG(should_post_data_dump)
 111   JVMTI_SUPPORT_FLAG(should_post_garbage_collection_start)
 112   JVMTI_SUPPORT_FLAG(should_post_garbage_collection_finish)
 113   JVMTI_SUPPORT_FLAG(should_post_on_exceptions)
 114 
 115   // ------ the below maybe don't have to be (but are for now)
 116   // fixed conditions here ------------
 117   // any events can be enabled
 118   JVMTI_SUPPORT_FLAG(should_post_thread_life)
 119   JVMTI_SUPPORT_FLAG(should_post_object_free)
 120   JVMTI_SUPPORT_FLAG(should_post_resource_exhausted)
 121 
 122   // we are holding objects on the heap - need to talk to GC - e.g.
 123   // breakpoint info
 124   JVMTI_SUPPORT_FLAG(should_clean_up_heap_objects)
 125   JVMTI_SUPPORT_FLAG(should_post_vm_object_alloc)
 126   JVMTI_SUPPORT_FLAG(should_post_sampled_object_alloc)
 127 
 128   // If flag cannot be implemented, give an error if on=true
 129   static void report_unsupported(bool on);
 130 
 131   // these should only be called by the friend class
 132   friend class JvmtiManageCapabilities;
 133   inline static void set_can_modify_any_class(bool on) {
 134     JVMTI_ONLY(_can_modify_any_class = (on != 0);)
 135   }
 136   inline static void set_can_access_local_variables(bool on) {
 137     JVMTI_ONLY(_can_access_local_variables = (on != 0);)
 138   }
 139   inline static void set_can_hotswap_or_post_breakpoint(bool on) {
 140     JVMTI_ONLY(_can_hotswap_or_post_breakpoint = (on != 0);)
 141   }
 142   inline static void set_can_walk_any_space(bool on) {
 143     JVMTI_ONLY(_can_walk_any_space = (on != 0);)
 144   }
 145 
 146   enum {


 360   static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) NOT_JVMTI_RETURN;
 361 
 362   static void post_garbage_collection_finish() NOT_JVMTI_RETURN;
 363   static void post_garbage_collection_start() NOT_JVMTI_RETURN;
 364   static void post_data_dump() NOT_JVMTI_RETURN;
 365   static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
 366   static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN;
 367   static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) NOT_JVMTI_RETURN;
 368   static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) NOT_JVMTI_RETURN;
 369   static void post_object_free(JvmtiEnv* env, jlong tag) NOT_JVMTI_RETURN;
 370   static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) NOT_JVMTI_RETURN;
 371   static void record_vm_internal_object_allocation(oop object) NOT_JVMTI_RETURN;
 372   // Post objects collected by vm_object_alloc_event_collector.
 373   static void post_vm_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN;
 374   // Collects vm internal objects for later event posting.
 375   inline static void vm_object_alloc_event_collector(oop object) {
 376     if (should_post_vm_object_alloc()) {
 377       record_vm_internal_object_allocation(object);
 378     }
 379   }
 380 
 381   static void record_sampled_internal_object_allocation(oop object) NOT_JVMTI_RETURN;
 382   // Post objects collected by sampled_object_alloc_event_collector.
 383   static void post_sampled_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN;
 384   // Collects vm internal objects for later event posting.
 385   inline static void sampled_object_alloc_event_collector(oop object) {
 386     if (should_post_sampled_object_alloc()) {
 387       record_sampled_internal_object_allocation(object);
 388     }
 389   }
 390 
 391   inline static void post_array_size_exhausted() {
 392     if (should_post_resource_exhausted()) {
 393       post_resource_exhausted(JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR,
 394                               "Requested array size exceeds VM limit");
 395     }
 396   }
 397 
 398   static void cleanup_thread             (JavaThread* thread) NOT_JVMTI_RETURN;
 399   static void clear_detected_exception   (JavaThread* thread) NOT_JVMTI_RETURN;
 400 
 401   static void oops_do(OopClosure* f) NOT_JVMTI_RETURN;
 402   static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) NOT_JVMTI_RETURN;
 403   static void gc_epilogue() NOT_JVMTI_RETURN;
 404 
 405   static void transition_pending_onload_raw_monitors() NOT_JVMTI_RETURN;
 406 
 407 #if INCLUDE_SERVICES
 408   // attach support
 409   static jint load_agent_library(const char *agent, const char *absParam, const char *options, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR);
 410 #endif


 432  public:
 433   JvmtiCodeBlobDesc(const char *name, address code_begin, address code_end) {
 434     assert(name != NULL, "all code blobs must be named");
 435     strncpy(_name, name, sizeof(_name));
 436     _name[sizeof(_name)-1] = '\0';
 437     _code_begin = code_begin;
 438     _code_end = code_end;
 439   }
 440   char* name()                  { return _name; }
 441   address code_begin()          { return _code_begin; }
 442   address code_end()            { return _code_end; }
 443 };
 444 
 445 // JvmtiEventCollector is a helper class to setup thread for
 446 // event collection.
 447 class JvmtiEventCollector : public StackObj {
 448  private:
 449   JvmtiEventCollector* _prev;  // Save previous one to support nested event collector.
 450 
 451  public:
 452   JvmtiEventCollector() : _prev(NULL) {}
 453 
 454   void setup_jvmti_thread_state(); // Set this collector in current thread.
 455   void unset_jvmti_thread_state(); // Reset previous collector in current thread.
 456   virtual bool is_dynamic_code_event()   { return false; }
 457   virtual bool is_vm_object_alloc_event(){ return false; }
 458   virtual bool is_sampled_object_alloc_event(){ return false; }
 459   JvmtiEventCollector *get_prev()        { return _prev; }
 460 };
 461 
 462 // A JvmtiDynamicCodeEventCollector is a helper class for the JvmtiExport
 463 // interface. It collects "dynamic code generated" events that are posted
 464 // while holding locks. When the event collector goes out of scope the
 465 // events will be posted.
 466 //
 467 // Usage :-
 468 //
 469 // {
 470 //   JvmtiDynamicCodeEventCollector event_collector;
 471 //   :
 472 //   { MutexLocker ml(...)
 473 //     :
 474 //     JvmtiExport::post_dynamic_code_generated_while_holding_locks(...)
 475 //   }
 476 //   // event collector goes out of scope => post events to profiler.
 477 // }
 478 
 479 class JvmtiDynamicCodeEventCollector : public JvmtiEventCollector {
 480  private:
 481   GrowableArray<JvmtiCodeBlobDesc*>* _code_blobs;           // collected code blob events
 482 
 483   friend class JvmtiExport;
 484   void register_stub(const char* name, address start, address end);
 485 
 486  public:
 487   JvmtiDynamicCodeEventCollector()  NOT_JVMTI_RETURN;
 488   ~JvmtiDynamicCodeEventCollector() NOT_JVMTI_RETURN;
 489   bool is_dynamic_code_event()   { return true; }
 490 
 491 };
 492 
 493 // Used as a base class for object allocation collection and then posting
 494 // the allocations to any event notification callbacks.





 495 //
 496 class JvmtiObjectAllocEventCollector : public JvmtiEventCollector {
 497  protected:
 498   GrowableArray<oop>* _allocated; // field to record vm internally allocated object oop.
 499   bool _enable;                   // This flag is enabled in constructor and disabled
 500                                   // in destructor before posting event. To avoid
 501                                   // collection of objects allocated while running java code inside
 502                                   // agent post_X_object_alloc() event handler.
 503   void (*_post_callback)(JavaThread*, oop); // what callback to use when destroying the collector.
 504 
 505   //GC support
 506   void oops_do(OopClosure* f);
 507 
 508   friend class JvmtiExport;
 509   // Record vm allocated object oop.
 510   inline void record_allocation(oop obj);
 511 
 512   //GC support
 513   static void oops_do_for_all_threads(OopClosure* f);
 514 
 515  public:
 516   JvmtiObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 517 
 518   void generate_call_for_allocated();
 519 
 520   bool is_enabled()                 { return _enable; }
 521   void set_enabled(bool on)         { _enable = on; }
 522 };
 523 
 524 // Used to record vm internally allocated object oops and post
 525 // vm object alloc event for objects visible to java world.
 526 // Constructor enables JvmtiThreadState flag and all vm allocated
 527 // objects are recorded in a growable array. When destructor is
 528 // called the vm object alloc event is posted for each object
 529 // visible to java world.
 530 // See jvm.cpp file for its usage.
 531 //
 532 class JvmtiVMObjectAllocEventCollector : public JvmtiObjectAllocEventCollector {
 533  public:
 534   JvmtiVMObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 535   ~JvmtiVMObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 536   virtual bool is_vm_object_alloc_event()   { return true; }
 537 };
 538 
 539 // Used to record sampled allocated object oops and post
 540 // sampled object alloc event.
 541 // Constructor enables JvmtiThreadState flag and all sampled allocated
 542 // objects are recorded in a growable array. When destructor is
 543 // called the sampled object alloc event is posted for each sampled object.
 544 // See jvm.cpp file for its usage.
 545 //
 546 class JvmtiSampledObjectAllocEventCollector : public JvmtiObjectAllocEventCollector {
 547  public:
 548   JvmtiSampledObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 549   ~JvmtiSampledObjectAllocEventCollector()  NOT_JVMTI_RETURN;
 550   bool is_sampled_object_alloc_event()   { return true; }
 551 };
 552 
 553 // Marker class to disable the posting of VMObjectAlloc events
 554 // within its scope.
 555 //
 556 // Usage :-
 557 //
 558 // {
 559 //   NoJvmtiVMObjectAllocMark njm;
 560 //   :
 561 //   // VMObjAlloc event will not be posted
 562 //   JvmtiExport::vm_object_alloc_event_collector(obj);
 563 //   :
 564 // }
 565 
 566 class NoJvmtiVMObjectAllocMark : public StackObj {
 567  private:
 568   // enclosing collector if enabled, NULL otherwise
 569   JvmtiVMObjectAllocEventCollector *_collector;
 570 
 571   bool was_enabled()    { return _collector != NULL; }


< prev index next >