src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java
branchJEP-349-branch
changeset 58567 e77a97d0edbb
parent 58165 8584c5b96cb6
child 58837 2bfbb50dd97d
equal deleted inserted replaced
58540:43229acd75ea 58567:e77a97d0edbb
    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();
   316         }
   315         }
   317         throw new InternalError("Mirror class must have annotation " + MirrorEvent.class.getName());
   316         throw new InternalError("Mirror class must have annotation " + MirrorEvent.class.getName());
   318     }
   317     }
   319 
   318 
   320     public synchronized void flush() {
   319     public synchronized void flush() {
   321         jvm.flush(flushMetadata);
   320         if (staleMetadata) {
   322         this.flushMetadata = false;
   321             storeDescriptorInJVM();
   323     }
   322         }
   324 
   323         jvm.flush();
   325 
   324     }
   326 
       
   327 
   325 
   328 }
   326 }