1 /* |
1 /* |
2 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this |
7 * published by the Free Software Foundation. Oracle designates this |
59 private final SettingsManager settingsManager = new SettingsManager(); |
59 private final SettingsManager settingsManager = new SettingsManager(); |
60 private final Map<String, Class<? extends Event>> mirrors = new HashMap<>(); |
60 private final Map<String, Class<? extends Event>> mirrors = new HashMap<>(); |
61 private boolean staleMetadata = true; |
61 private boolean staleMetadata = true; |
62 private boolean unregistered; |
62 private boolean unregistered; |
63 private long lastUnloaded = -1; |
63 private long lastUnloaded = -1; |
|
64 private boolean flushMetadata; |
|
65 private short flushCounter = 0; |
64 |
66 |
65 public MetadataRepository() { |
67 public MetadataRepository() { |
66 initializeJVMEventTypes(); |
68 initializeJVMEventTypes(); |
67 } |
69 } |
68 |
70 |
140 } |
142 } |
141 handler.setRegistered(true); |
143 handler.setRegistered(true); |
142 typeLibrary.addType(handler.getPlatformEventType()); |
144 typeLibrary.addType(handler.getPlatformEventType()); |
143 if (jvm.isRecording()) { |
145 if (jvm.isRecording()) { |
144 storeDescriptorInJVM(); // needed for emergency dump |
146 storeDescriptorInJVM(); // needed for emergency dump |
|
147 flushMetadata = true; |
145 settingsManager.setEventControl(handler.getEventControl()); |
148 settingsManager.setEventControl(handler.getEventControl()); |
146 settingsManager.updateRetransform(Collections.singletonList((eventClass))); |
149 settingsManager.updateRetransform(Collections.singletonList((eventClass))); |
147 } else { |
150 } else { |
148 setStaleMetadata(); |
151 setStaleMetadata(); |
149 } |
152 } |
253 |
256 |
254 synchronized void setStaleMetadata() { |
257 synchronized void setStaleMetadata() { |
255 staleMetadata = true; |
258 staleMetadata = true; |
256 } |
259 } |
257 |
260 |
258 // Lock around setOutput ensures that other threads dosn't |
261 // Lock around setOutput ensures that other threads don't |
259 // emit event after setOutput and unregister the event class, before a call |
262 // emit events after setOutput and unregister the event class, before a call |
260 // to storeDescriptorInJVM |
263 // to storeDescriptorInJVM |
261 synchronized void setOutput(String filename) { |
264 synchronized void setOutput(String filename) { |
262 jvm.setOutput(filename); |
265 jvm.setOutput(filename); |
263 |
266 flushMetadata = false; |
264 unregisterUnloaded(); |
267 unregisterUnloaded(); |
265 if (unregistered) { |
268 if (unregistered) { |
266 staleMetadata = typeLibrary.clearUnregistered(); |
269 staleMetadata = typeLibrary.clearUnregistered(); |
267 unregistered = false; |
270 unregistered = false; |
268 } |
271 } |
269 if (staleMetadata) { |
272 if (staleMetadata) { |
270 storeDescriptorInJVM(); |
273 storeDescriptorInJVM(); |
271 } |
274 } |
|
275 flushCounter = 0; |
272 } |
276 } |
273 |
277 |
274 private void unregisterUnloaded() { |
278 private void unregisterUnloaded() { |
275 long unloaded = jvm.getUnloadedEventClassCount(); |
279 long unloaded = jvm.getUnloadedEventClassCount(); |
276 if (this.lastUnloaded != unloaded) { |
280 if (this.lastUnloaded != unloaded) { |