src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java
branchJEP-349-branch
changeset 57360 5d043a159d5c
parent 52334 a181612f0715
child 57459 df39f8d8f4d6
equal deleted inserted replaced
57359:4cab5edc2950 57360:5d043a159d5c
     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) {
   305             return;
   309             return;
   306         }
   310         }
   307         throw new InternalError("Mirror class must have annotation " + MirrorEvent.class.getName());
   311         throw new InternalError("Mirror class must have annotation " + MirrorEvent.class.getName());
   308     }
   312     }
   309 
   313 
       
   314     public synchronized void flush() {
       
   315         jvm.flush(flushMetadata || flushCounter == 0, ++flushCounter);
       
   316         if (flushCounter == Short.MAX_VALUE) {
       
   317             flushCounter = 0;
       
   318         }
       
   319         this.flushMetadata = false;
       
   320     }
   310 }
   321 }