60 private final SettingsManager settingsManager = new SettingsManager(); |
60 private final SettingsManager settingsManager = new SettingsManager(); |
61 private final Map<String, Class<? extends Event>> mirrors = new HashMap<>(); |
61 private final Map<String, Class<? extends Event>> mirrors = new HashMap<>(); |
62 private boolean staleMetadata = true; |
62 private boolean staleMetadata = true; |
63 private boolean unregistered; |
63 private boolean unregistered; |
64 private long lastUnloaded = -1; |
64 private long lastUnloaded = -1; |
65 private boolean flushMetadata; |
|
66 |
65 |
67 public MetadataRepository() { |
66 public MetadataRepository() { |
68 initializeJVMEventTypes(); |
67 initializeJVMEventTypes(); |
69 } |
68 } |
70 |
69 |
142 } |
141 } |
143 handler.setRegistered(true); |
142 handler.setRegistered(true); |
144 typeLibrary.addType(handler.getPlatformEventType()); |
143 typeLibrary.addType(handler.getPlatformEventType()); |
145 if (jvm.isRecording()) { |
144 if (jvm.isRecording()) { |
146 storeDescriptorInJVM(); // needed for emergency dump |
145 storeDescriptorInJVM(); // needed for emergency dump |
147 flushMetadata = true; |
|
148 settingsManager.setEventControl(handler.getEventControl()); |
146 settingsManager.setEventControl(handler.getEventControl()); |
149 settingsManager.updateRetransform(Collections.singletonList((eventClass))); |
147 settingsManager.updateRetransform(Collections.singletonList((eventClass))); |
150 } else { |
148 } else { |
151 setStaleMetadata(); |
149 setStaleMetadata(); |
152 } |
150 } |
264 |
262 |
265 // Lock around setOutput ensures that other threads don't |
263 // Lock around setOutput ensures that other threads don't |
266 // emit events after setOutput and unregister the event class, before a call |
264 // emit events after setOutput and unregister the event class, before a call |
267 // to storeDescriptorInJVM |
265 // to storeDescriptorInJVM |
268 synchronized void setOutput(String filename) { |
266 synchronized void setOutput(String filename) { |
|
267 if (staleMetadata) { |
|
268 storeDescriptorInJVM(); |
|
269 } |
269 jvm.setOutput(filename); |
270 jvm.setOutput(filename); |
270 if (filename != null) { |
271 if (filename != null) { |
271 RepositoryFiles.notifyNewFile(); |
272 RepositoryFiles.notifyNewFile(); |
272 } |
273 } |
273 flushMetadata = false; |
|
274 unregisterUnloaded(); |
274 unregisterUnloaded(); |
275 if (unregistered) { |
275 if (unregistered) { |
276 staleMetadata = typeLibrary.clearUnregistered(); |
276 if (typeLibrary.clearUnregistered()) { |
|
277 storeDescriptorInJVM(); |
|
278 } |
277 unregistered = false; |
279 unregistered = false; |
278 } |
|
279 if (staleMetadata) { |
|
280 storeDescriptorInJVM(); |
|
281 } |
280 } |
282 } |
281 } |
283 |
282 |
284 private void unregisterUnloaded() { |
283 private void unregisterUnloaded() { |
285 long unloaded = jvm.getUnloadedEventClassCount(); |
284 long unloaded = jvm.getUnloadedEventClassCount(); |