177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe/* 277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * Copyright (C) 2016 The Android Open Source Project 377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * 477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * Licensed under the Apache License, Version 2.0 (the "License"); 577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * you may not use this file except in compliance with the License. 677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * You may obtain a copy of the License at 777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * 877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * http://www.apache.org/licenses/LICENSE-2.0 977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * 1077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * Unless required by applicable law or agreed to in writing, software 1177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * distributed under the License is distributed on an "AS IS" BASIS, 1277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * See the License for the specific language governing permissions and 1477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe * limitations under the License. 1577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe */ 1677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 1777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#ifndef ART_RUNTIME_OPENJDKJVMTI_EVENTS_H_ 1877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#define ART_RUNTIME_OPENJDKJVMTI_EVENTS_H_ 1977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 2077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#include <bitset> 2177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#include <vector> 2277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 2377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#include "base/logging.h" 2477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#include "jvmti.h" 2577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#include "thread.h" 2677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 2777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampenamespace openjdkjvmti { 2877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 2977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampestruct ArtJvmTiEnv; 3027fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampeclass JvmtiAllocationListener; 319b8c5880de9b0f7dd8b1b863520714a9700a8dc2Andreas Gampeclass JvmtiGcPauseListener; 3277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 3373afd322e0e55ec4cda570cc240e1f22db215851Alex Light// an enum for ArtEvents. This differs from the JVMTI events only in that we distinguish between 3473afd322e0e55ec4cda570cc240e1f22db215851Alex Light// retransformation capable and incapable loading 3540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Lightenum class ArtJvmtiEvent { 3640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMinEventTypeVal = JVMTI_MIN_EVENT_TYPE_VAL, 3740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kVmInit = JVMTI_EVENT_VM_INIT, 3840d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kVmDeath = JVMTI_EVENT_VM_DEATH, 3940d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kThreadStart = JVMTI_EVENT_THREAD_START, 4040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kThreadEnd = JVMTI_EVENT_THREAD_END, 4173afd322e0e55ec4cda570cc240e1f22db215851Alex Light kClassFileLoadHookNonRetransformable = JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, 4240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kClassLoad = JVMTI_EVENT_CLASS_LOAD, 4340d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kClassPrepare = JVMTI_EVENT_CLASS_PREPARE, 4440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kVmStart = JVMTI_EVENT_VM_START, 4540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kException = JVMTI_EVENT_EXCEPTION, 4640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kExceptionCatch = JVMTI_EVENT_EXCEPTION_CATCH, 4740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kSingleStep = JVMTI_EVENT_SINGLE_STEP, 4840d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kFramePop = JVMTI_EVENT_FRAME_POP, 4940d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kBreakpoint = JVMTI_EVENT_BREAKPOINT, 5040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kFieldAccess = JVMTI_EVENT_FIELD_ACCESS, 5140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kFieldModification = JVMTI_EVENT_FIELD_MODIFICATION, 5240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMethodEntry = JVMTI_EVENT_METHOD_ENTRY, 5340d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMethodExit = JVMTI_EVENT_METHOD_EXIT, 5440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kNativeMethodBind = JVMTI_EVENT_NATIVE_METHOD_BIND, 5540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kCompiledMethodLoad = JVMTI_EVENT_COMPILED_METHOD_LOAD, 5640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kCompiledMethodUnload = JVMTI_EVENT_COMPILED_METHOD_UNLOAD, 5740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kDynamicCodeGenerated = JVMTI_EVENT_DYNAMIC_CODE_GENERATED, 5840d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kDataDumpRequest = JVMTI_EVENT_DATA_DUMP_REQUEST, 5940d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMonitorWait = JVMTI_EVENT_MONITOR_WAIT, 6040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMonitorWaited = JVMTI_EVENT_MONITOR_WAITED, 6140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMonitorContendedEnter = JVMTI_EVENT_MONITOR_CONTENDED_ENTER, 6240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kMonitorContendedEntered = JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, 6340d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kResourceExhausted = JVMTI_EVENT_RESOURCE_EXHAUSTED, 6440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kGarbageCollectionStart = JVMTI_EVENT_GARBAGE_COLLECTION_START, 6540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kGarbageCollectionFinish = JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, 6640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kObjectFree = JVMTI_EVENT_OBJECT_FREE, 6740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light kVmObjectAlloc = JVMTI_EVENT_VM_OBJECT_ALLOC, 6873afd322e0e55ec4cda570cc240e1f22db215851Alex Light kClassFileLoadHookRetransformable = JVMTI_MAX_EVENT_TYPE_VAL + 1, 6973afd322e0e55ec4cda570cc240e1f22db215851Alex Light kMaxEventTypeVal = kClassFileLoadHookRetransformable, 7040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light}; 7140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light 7240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light// Convert a jvmtiEvent into a ArtJvmtiEvent 7340d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex LightALWAYS_INLINE static inline ArtJvmtiEvent GetArtJvmtiEvent(ArtJvmTiEnv* env, jvmtiEvent e); 7440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light 7573afd322e0e55ec4cda570cc240e1f22db215851Alex Lightstatic inline jvmtiEvent GetJvmtiEvent(ArtJvmtiEvent e) { 7673afd322e0e55ec4cda570cc240e1f22db215851Alex Light if (UNLIKELY(e == ArtJvmtiEvent::kClassFileLoadHookRetransformable)) { 7773afd322e0e55ec4cda570cc240e1f22db215851Alex Light return JVMTI_EVENT_CLASS_FILE_LOAD_HOOK; 7873afd322e0e55ec4cda570cc240e1f22db215851Alex Light } else { 7973afd322e0e55ec4cda570cc240e1f22db215851Alex Light return static_cast<jvmtiEvent>(e); 8073afd322e0e55ec4cda570cc240e1f22db215851Alex Light } 8140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light} 8240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light 8377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampestruct EventMask { 8440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light static constexpr size_t kEventsSize = 8540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light static_cast<size_t>(ArtJvmtiEvent::kMaxEventTypeVal) - 8640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light static_cast<size_t>(ArtJvmtiEvent::kMinEventTypeVal) + 1; 8777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe std::bitset<kEventsSize> bit_set; 8877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 8940d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light static bool EventIsInRange(ArtJvmtiEvent event) { 9040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light return event >= ArtJvmtiEvent::kMinEventTypeVal && event <= ArtJvmtiEvent::kMaxEventTypeVal; 9177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe } 9277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 9340d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light void Set(ArtJvmtiEvent event, bool value = true) { 9477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe DCHECK(EventIsInRange(event)); 9540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light bit_set.set(static_cast<size_t>(event) - static_cast<size_t>(ArtJvmtiEvent::kMinEventTypeVal), 9640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light value); 9777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe } 9877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 9940d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light bool Test(ArtJvmtiEvent event) const { 10077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe DCHECK(EventIsInRange(event)); 10140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light return bit_set.test( 10240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light static_cast<size_t>(event) - static_cast<size_t>(ArtJvmtiEvent::kMinEventTypeVal)); 10377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe } 10477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe}; 10577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 10677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampestruct EventMasks { 10777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // The globally enabled events. 10877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe EventMask global_event_mask; 10977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 11077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // The per-thread enabled events. 11177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 11277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // It is not enough to store a Thread pointer, as these may be reused. Use the pointer and the 11377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // thread id. 11477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // Note: We could just use the tid like tracing does. 11577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe using UniqueThread = std::pair<art::Thread*, uint32_t>; 11677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // TODO: Native thread objects are immovable, so we can use them as keys in an (unordered) map, 11777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // if necessary. 11877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe std::vector<std::pair<UniqueThread, EventMask>> thread_event_masks; 11977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 12077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // A union of the per-thread events, for fast-pathing. 12177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe EventMask unioned_thread_event_mask; 12277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 12377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe EventMask& GetEventMask(art::Thread* thread); 12477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe EventMask* GetEventMaskOrNull(art::Thread* thread); 12540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light void EnableEvent(art::Thread* thread, ArtJvmtiEvent event); 12640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light void DisableEvent(art::Thread* thread, ArtJvmtiEvent event); 12773afd322e0e55ec4cda570cc240e1f22db215851Alex Light bool IsEnabledAnywhere(ArtJvmtiEvent event); 12873afd322e0e55ec4cda570cc240e1f22db215851Alex Light // Make any changes to event masks needed for the given capability changes. If caps_added is true 12973afd322e0e55ec4cda570cc240e1f22db215851Alex Light // then caps is all the newly set capabilities of the jvmtiEnv. If it is false then caps is the 13073afd322e0e55ec4cda570cc240e1f22db215851Alex Light // set of all capabilities that were removed from the jvmtiEnv. 13173afd322e0e55ec4cda570cc240e1f22db215851Alex Light void HandleChangedCapabilities(const jvmtiCapabilities& caps, bool caps_added); 13277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe}; 13377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 13477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe// Helper class for event handling. 13527fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampeclass EventHandler { 13627fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe public: 13727fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe EventHandler(); 13827fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe ~EventHandler(); 13977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 14077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // Register an env. It is assumed that this happens on env creation, that is, no events are 14177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe // enabled, yet. 14277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe void RegisterArtJvmTiEnv(ArtJvmTiEnv* env); 14377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 1443a7eb1482b495110a28ac996706f4bda41114147Andreas Gampe // Remove an env. 1453a7eb1482b495110a28ac996706f4bda41114147Andreas Gampe void RemoveArtJvmTiEnv(ArtJvmTiEnv* env); 1463a7eb1482b495110a28ac996706f4bda41114147Andreas Gampe 14740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light bool IsEventEnabledAnywhere(ArtJvmtiEvent event) const { 14877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe if (!EventMask::EventIsInRange(event)) { 14977708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe return false; 15077708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe } 15177708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe return global_mask.Test(event); 15277708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe } 15377708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 15440d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light jvmtiError SetEvent(ArtJvmTiEnv* env, 15540d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light art::Thread* thread, 15640d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light ArtJvmtiEvent event, 15740d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light jvmtiEventMode mode); 15877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 15927e771c3263c688b4f970f08d780aff7b8f1756bAndreas Gampe // Dispatch event to all registered environments. 160983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe template <ArtJvmtiEvent kEvent, typename ...Args> 16140d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light ALWAYS_INLINE 162983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe inline void DispatchEvent(art::Thread* thread, Args... args) const; 16327e771c3263c688b4f970f08d780aff7b8f1756bAndreas Gampe // Dispatch event to the given environment, only. 16427e771c3263c688b4f970f08d780aff7b8f1756bAndreas Gampe template <ArtJvmtiEvent kEvent, typename ...Args> 16527e771c3263c688b4f970f08d780aff7b8f1756bAndreas Gampe ALWAYS_INLINE 16627e771c3263c688b4f970f08d780aff7b8f1756bAndreas Gampe inline void DispatchEvent(ArtJvmTiEnv* env, art::Thread* thread, Args... args) const; 16727fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe 16873afd322e0e55ec4cda570cc240e1f22db215851Alex Light // Tell the event handler capabilities were added/lost so it can adjust the sent events.If 16973afd322e0e55ec4cda570cc240e1f22db215851Alex Light // caps_added is true then caps is all the newly set capabilities of the jvmtiEnv. If it is false 17073afd322e0e55ec4cda570cc240e1f22db215851Alex Light // then caps is the set of all capabilities that were removed from the jvmtiEnv. 17173afd322e0e55ec4cda570cc240e1f22db215851Alex Light ALWAYS_INLINE 17273afd322e0e55ec4cda570cc240e1f22db215851Alex Light inline void HandleChangedCapabilities(ArtJvmTiEnv* env, 17373afd322e0e55ec4cda570cc240e1f22db215851Alex Light const jvmtiCapabilities& caps, 17473afd322e0e55ec4cda570cc240e1f22db215851Alex Light bool added); 17573afd322e0e55ec4cda570cc240e1f22db215851Alex Light 17627fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe private: 177983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe template <ArtJvmtiEvent kEvent> 17840d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light ALWAYS_INLINE 179983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe static inline bool ShouldDispatch(ArtJvmTiEnv* env, art::Thread* thread); 18040d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light 18173afd322e0e55ec4cda570cc240e1f22db215851Alex Light ALWAYS_INLINE 18273afd322e0e55ec4cda570cc240e1f22db215851Alex Light inline bool NeedsEventUpdate(ArtJvmTiEnv* env, 18373afd322e0e55ec4cda570cc240e1f22db215851Alex Light const jvmtiCapabilities& caps, 18473afd322e0e55ec4cda570cc240e1f22db215851Alex Light bool added); 18573afd322e0e55ec4cda570cc240e1f22db215851Alex Light 18673afd322e0e55ec4cda570cc240e1f22db215851Alex Light // Recalculates the event mask for the given event. 18773afd322e0e55ec4cda570cc240e1f22db215851Alex Light ALWAYS_INLINE 18873afd322e0e55ec4cda570cc240e1f22db215851Alex Light inline void RecalculateGlobalEventMask(ArtJvmtiEvent event); 18973afd322e0e55ec4cda570cc240e1f22db215851Alex Light 190983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe template <ArtJvmtiEvent kEvent> 1916ac5750807e0df930bb3791a9d5a8d8d5b5c45c4Alex Light ALWAYS_INLINE inline void DispatchClassFileLoadHookEvent(art::Thread* thread, 192983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe JNIEnv* jnienv, 193983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe jclass class_being_redefined, 194983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe jobject loader, 195983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe const char* name, 196983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe jobject protection_domain, 197983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe jint class_data_len, 198983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe const unsigned char* class_data, 199983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe jint* new_class_data_len, 200983c175aa134c7f6794a4b3407d7e99536b1f7f1Andreas Gampe unsigned char** new_class_data) const; 2016ac5750807e0df930bb3791a9d5a8d8d5b5c45c4Alex Light 20240d87f450e6c1d38edd539405d4e79e4c64ad7c6Alex Light void HandleEventType(ArtJvmtiEvent event, bool enable); 20327fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe 20427fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe // List of all JvmTiEnv objects that have been created, in their creation order. 2056a0e0b242a1ff47bc9b722a9c130462733b83f05Alex Light // NB Some elements might be null representing envs that have been deleted. They should be skipped 2066a0e0b242a1ff47bc9b722a9c130462733b83f05Alex Light // anytime this list is used. 20727fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe std::vector<ArtJvmTiEnv*> envs; 20827fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe 20927fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe // A union of all enabled events, anywhere. 21027fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe EventMask global_mask; 21127fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe 21227fa96c285c4aa2f64e9bb63a3f38ffdc98c282aAndreas Gampe std::unique_ptr<JvmtiAllocationListener> alloc_listener_; 2139b8c5880de9b0f7dd8b1b863520714a9700a8dc2Andreas Gampe std::unique_ptr<JvmtiGcPauseListener> gc_pause_listener_; 21477708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe}; 21577708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 21677708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe} // namespace openjdkjvmti 21777708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe 21877708d9149b0a00247eb69ea4d5386cae4e40287Andreas Gampe#endif // ART_RUNTIME_OPENJDKJVMTI_EVENTS_H_ 219