src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java
branchJEP-349-branch
changeset 57848 bd961c64ecce
parent 57781 7758008806d1
child 58112 e7754025004b
equal deleted inserted replaced
57784:88316b070ab9 57848:bd961c64ecce
   119     private final String eventHandlerXInternalName;
   119     private final String eventHandlerXInternalName;
   120     private final String eventName;
   120     private final String eventName;
   121     private final boolean untypedEventHandler;
   121     private final boolean untypedEventHandler;
   122     private boolean guardHandlerReference;
   122     private boolean guardHandlerReference;
   123     private Class<?> superClass;
   123     private Class<?> superClass;
   124     private final static boolean streamingCommit = !SecuritySupport.getBooleanProperty("jfr.instrument.streaming");
   124     private final static boolean streamingCommit = true; //!SecuritySupport.getBooleanProperty("jfr.instrument.streaming");
   125 
   125 
   126     EventInstrumentation(Class<?> superClass, byte[] bytes, long id) {
   126     EventInstrumentation(Class<?> superClass, byte[] bytes, long id) {
   127         this.superClass = superClass;
   127         this.superClass = superClass;
   128         this.classNode = createClassNode(bytes);
   128         this.classNode = createClassNode(bytes);
   129         this.settingInfos = buildSettingInfos(superClass, classNode);
   129         this.settingInfos = buildSettingInfos(superClass, classNode);
   365         });
   365         });
   366 
   366 
   367         // MyEvent#commit() - Java event writer
   367         // MyEvent#commit() - Java event writer
   368         if (streamingCommit) {
   368         if (streamingCommit) {
   369             updateMethod(METHOD_COMMIT, methodVisitor -> {
   369             updateMethod(METHOD_COMMIT, methodVisitor -> {
   370                 // if (shouldCommit()) {
       
   371                 methodVisitor.visitCode();
   370                 methodVisitor.visitCode();
   372                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   371                 // Labels
   373                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
   372                 Label enabled = new Label();
   374                 Label end = new Label();
   373                 Label end = new Label();
   375                 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end);
   374                 Label durationEvent = new Label();
   376                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   375                 Label writeToHandler = new Label();
   377                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   376                 Label timestampOnCommit = new Label();
   378                 //   startTime = EventHandler.timestamp() - duration;
   377                 // if (!isEnable()) {
   379                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(),
   378                 // return;
   380                         METHOD_TIME_STAMP.getDescriptor(), false);
   379                 // }
       
   380                 methodVisitor.visitCode();
       
   381                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   382                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false);
       
   383                 methodVisitor.visitJumpInsn(Opcodes.IFNE, enabled);
       
   384                 methodVisitor.visitInsn(Opcodes.RETURN);
       
   385                 methodVisitor.visitLabel(enabled);
       
   386                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   387 
       
   388                 // if (startTime == 0) {
       
   389                 // startTime = EventWriter.timestamp();
       
   390                 // } else {
       
   391                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   392                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   393                 methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   394                 methodVisitor.visitInsn(Opcodes.LCMP);
       
   395                 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationEvent);
       
   396                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   397                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
       
   398                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   399                 methodVisitor.visitJumpInsn(Opcodes.GOTO, writeToHandler);
       
   400 
       
   401                 // new
       
   402                 // if (duration == 0) {
       
   403                 methodVisitor.visitLabel(durationEvent);
       
   404                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   405                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   406                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   407                 methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   408                 methodVisitor.visitInsn(Opcodes.LCMP);
       
   409                 methodVisitor.visitJumpInsn(Opcodes.IFNE, timestampOnCommit);
       
   410 
       
   411                 // startTime = EventWriter.timestamp() - duration;
       
   412                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   413                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
   381                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   414                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   382                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
   415                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
   383                 methodVisitor.visitInsn(Opcodes.LSUB);
   416                 methodVisitor.visitInsn(Opcodes.LSUB);
   384                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
   417                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   418                 methodVisitor.visitJumpInsn(Opcodes.GOTO, writeToHandler);
       
   419 
       
   420                 // duration = EventWriter.timestamp() -timestamp
       
   421                 // }
       
   422                 methodVisitor.visitLabel(timestampOnCommit);
       
   423                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   424                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   425                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
       
   426                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   427                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   428                 methodVisitor.visitInsn(Opcodes.LSUB);
       
   429                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   430 
       
   431                 // if (shouldCommit()) {
       
   432                  methodVisitor.visitLabel(writeToHandler);
       
   433                  methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   434                  methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   435                  methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
       
   436                  methodVisitor.visitJumpInsn(Opcodes.IFEQ, end);
       
   437                 //
   385                 //   eventHandlerX.write(...);
   438                 //   eventHandlerX.write(...);
   386                 getEventHandler(methodVisitor);
   439                 getEventHandler(methodVisitor);
   387                 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName);
   440                 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName);
   388                 for (FieldInfo fi : fieldInfos) {
   441                 for (FieldInfo fi : fieldInfos) {
   389                     methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   442                    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   390                     methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor);
   443                    methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor);
   391                 }
   444                 }
   392                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false);
   445                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false);
   393                 // }
   446                 // }
   394                 methodVisitor.visitLabel(end);
   447                 methodVisitor.visitLabel(end);
   395                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   396                 methodVisitor.visitInsn(Opcodes.RETURN);
   448                 methodVisitor.visitInsn(Opcodes.RETURN);
   397                 methodVisitor.visitEnd();
   449                 methodVisitor.visitEnd();
   398             });
   450             });
   399         } else {
   451         }
       
   452 
       
   453         if (!streamingCommit) {
   400             updateMethod(METHOD_COMMIT, methodVisitor -> {
   454             updateMethod(METHOD_COMMIT, methodVisitor -> {
   401                 // if (!isEnable()) {
   455                 // if (!isEnable()) {
   402                 // return;
   456                 // return;
   403                 // }
   457                 // }
   404                 methodVisitor.visitCode();
   458                 methodVisitor.visitCode();
   417                 methodVisitor.visitInsn(Opcodes.LCONST_0);
   471                 methodVisitor.visitInsn(Opcodes.LCONST_0);
   418                 methodVisitor.visitInsn(Opcodes.LCMP);
   472                 methodVisitor.visitInsn(Opcodes.LCMP);
   419                 Label durationalEvent = new Label();
   473                 Label durationalEvent = new Label();
   420                 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent);
   474                 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent);
   421                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   475                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   422                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(),
   476                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
   423                         METHOD_TIME_STAMP.getDescriptor(), false);
       
   424                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
   477                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
   425                 Label commit = new Label();
   478                 Label commit = new Label();
   426                 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit);
   479                 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit);
   427                 // if (duration == 0) {
   480                 // if (duration == 0) {
   428                 // duration = EventWriter.timestamp() - startTime;
   481                 // duration = EventWriter.timestamp() - startTime;
   429                 // }
   482                 // }
   430                 // }
   483                 // }
   431                 methodVisitor.visitLabel(durationalEvent);
   484                 methodVisitor.visitLabel(durationalEvent);
   432                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   485                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   433  //             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   486                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   434  //             methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
   487                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
   435  //             methodVisitor.visitInsn(Opcodes.LCONST_0);
   488                 methodVisitor.visitInsn(Opcodes.LCONST_0);
   436  //             methodVisitor.visitInsn(Opcodes.LCMP);
   489                 methodVisitor.visitInsn(Opcodes.LCMP);
   437  //             methodVisitor.visitJumpInsn(Opcodes.IFNE, commit);
   490                 methodVisitor.visitJumpInsn(Opcodes.IFNE, commit);
   438  //             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   491                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   439                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
   492                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
   440                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   493                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   441                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
   494                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
   442                 methodVisitor.visitInsn(Opcodes.LSUB);
   495                 methodVisitor.visitInsn(Opcodes.LSUB);
   443                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
   496                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
   444               methodVisitor.visitLabel(commit);
   497                 methodVisitor.visitLabel(commit);
   445                 // if (shouldCommit()) {
   498                 // if (shouldCommit()) {
   446                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   499                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   447                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   500                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   448                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
   501                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
   449                 Label end = new Label();
   502                 Label end = new Label();
   501             methodVisitor.visitInsn(Opcodes.ICONST_0);
   554             methodVisitor.visitInsn(Opcodes.ICONST_0);
   502             methodVisitor.visitInsn(Opcodes.IRETURN);
   555             methodVisitor.visitInsn(Opcodes.IRETURN);
   503         });
   556         });
   504     }
   557     }
   505 
   558 
       
   559 
   506     private void getEventHandler(MethodVisitor methodVisitor) {
   560     private void getEventHandler(MethodVisitor methodVisitor) {
   507         if (untypedEventHandler) {
   561         if (untypedEventHandler) {
   508             methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, getInternalClassName(), FIELD_EVENT_HANDLER, TYPE_OBJECT.getDescriptor());
   562             methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, getInternalClassName(), FIELD_EVENT_HANDLER, TYPE_OBJECT.getDescriptor());
   509             methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, TYPE_EVENT_HANDLER.getInternalName());
   563             methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, TYPE_EVENT_HANDLER.getInternalName());
   510         } else {
   564         } else {