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