src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java
changeset 58863 c16ac7a2eba4
parent 52698 ca6b58b8ffc5
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
     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
   361             methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
   361             methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
   362             methodVisitor.visitInsn(Opcodes.RETURN);
   362             methodVisitor.visitInsn(Opcodes.RETURN);
   363             methodVisitor.visitMaxs(0, 0);
   363             methodVisitor.visitMaxs(0, 0);
   364         });
   364         });
   365 
   365 
   366         // MyEvent#commit() - Java event writer
       
   367         updateMethod(METHOD_COMMIT, methodVisitor -> {
   366         updateMethod(METHOD_COMMIT, methodVisitor -> {
   368                 // if (!isEnable()) {
   367             // if (!isEnable()) {
   369                 // return;
   368             // return;
   370                 // }
   369             // }
   371                 methodVisitor.visitCode();
   370             methodVisitor.visitCode();
       
   371             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   372             methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false);
       
   373             Label l0 = new Label();
       
   374             methodVisitor.visitJumpInsn(Opcodes.IFNE, l0);
       
   375             methodVisitor.visitInsn(Opcodes.RETURN);
       
   376             methodVisitor.visitLabel(l0);
       
   377             methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   378             // if (startTime == 0) {
       
   379             // startTime = EventWriter.timestamp();
       
   380             // } else {
       
   381             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   382             methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   383             methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   384             methodVisitor.visitInsn(Opcodes.LCMP);
       
   385             Label durationalEvent = new Label();
       
   386             methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent);
       
   387             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   388             methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
       
   389             methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   390             Label commit = new Label();
       
   391             methodVisitor.visitJumpInsn(Opcodes.GOTO, commit);
       
   392             // if (duration == 0) {
       
   393             // duration = EventWriter.timestamp() - startTime;
       
   394             // }
       
   395             // }
       
   396             methodVisitor.visitLabel(durationalEvent);
       
   397             methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   398             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   399             methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   400             methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   401             methodVisitor.visitInsn(Opcodes.LCMP);
       
   402             methodVisitor.visitJumpInsn(Opcodes.IFNE, commit);
       
   403             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   404             methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
       
   405             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   406             methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   407             methodVisitor.visitInsn(Opcodes.LSUB);
       
   408             methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   409             methodVisitor.visitLabel(commit);
       
   410             // if (shouldCommit()) {
       
   411             methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   412             methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   413             methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
       
   414             Label end = new Label();
       
   415             // eventHandler.write(...);
       
   416             // }
       
   417             methodVisitor.visitJumpInsn(Opcodes.IFEQ, end);
       
   418             getEventHandler(methodVisitor);
       
   419 
       
   420             methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName);
       
   421             for (FieldInfo fi : fieldInfos) {
   372                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   422                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
   373                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_IS_ENABLED.getName(), METHOD_IS_ENABLED.getDescriptor(), false);
   423                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor);
   374                 Label l0 = new Label();
   424             }
   375                 methodVisitor.visitJumpInsn(Opcodes.IFNE, l0);
   425 
   376                 methodVisitor.visitInsn(Opcodes.RETURN);
   426             methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false);
   377                 methodVisitor.visitLabel(l0);
   427             methodVisitor.visitLabel(end);
   378                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   428             methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
   379                 // if (startTime == 0) {
   429             methodVisitor.visitInsn(Opcodes.RETURN);
   380                 // startTime = EventWriter.timestamp();
   430             methodVisitor.visitEnd();
   381                 // } else {
   431         });
   382                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   383                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   384                 methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   385                 methodVisitor.visitInsn(Opcodes.LCMP);
       
   386                 Label durationalEvent = new Label();
       
   387                 methodVisitor.visitJumpInsn(Opcodes.IFNE, durationalEvent);
       
   388                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   389                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(),
       
   390                         METHOD_TIME_STAMP.getDescriptor(), false);
       
   391                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   392                 Label commit = new Label();
       
   393                 methodVisitor.visitJumpInsn(Opcodes.GOTO, commit);
       
   394                 // if (duration == 0) {
       
   395                 // duration = EventWriter.timestamp() - startTime;
       
   396                 // }
       
   397                 // }
       
   398                 methodVisitor.visitLabel(durationalEvent);
       
   399                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   400                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   401                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   402                 methodVisitor.visitInsn(Opcodes.LCONST_0);
       
   403                 methodVisitor.visitInsn(Opcodes.LCMP);
       
   404                 methodVisitor.visitJumpInsn(Opcodes.IFNE, commit);
       
   405                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   406                 methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, TYPE_EVENT_HANDLER.getInternalName(), METHOD_TIME_STAMP.getName(), METHOD_TIME_STAMP.getDescriptor(), false);
       
   407                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   408                 methodVisitor.visitFieldInsn(Opcodes.GETFIELD, getInternalClassName(), FIELD_START_TIME, "J");
       
   409                 methodVisitor.visitInsn(Opcodes.LSUB);
       
   410                 methodVisitor.visitFieldInsn(Opcodes.PUTFIELD, getInternalClassName(), FIELD_DURATION, "J");
       
   411                 methodVisitor.visitLabel(commit);
       
   412                 // if (shouldCommit()) {
       
   413                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   414                 methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   415                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getInternalClassName(), METHOD_EVENT_SHOULD_COMMIT.getName(), METHOD_EVENT_SHOULD_COMMIT.getDescriptor(), false);
       
   416                 Label end = new Label();
       
   417                 // eventHandler.write(...);
       
   418                 // }
       
   419                 methodVisitor.visitJumpInsn(Opcodes.IFEQ, end);
       
   420                 getEventHandler(methodVisitor);
       
   421 
       
   422                 methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, eventHandlerXInternalName);
       
   423                 for (FieldInfo fi : fieldInfos) {
       
   424                     methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
       
   425                     methodVisitor.visitFieldInsn(Opcodes.GETFIELD, fi.internalClassName, fi.fieldName, fi.fieldDescriptor);
       
   426                 }
       
   427 
       
   428                 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, eventHandlerXInternalName, writeMethod.getName(), writeMethod.getDescriptor(), false);
       
   429                 methodVisitor.visitLabel(end);
       
   430                 methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
       
   431                 methodVisitor.visitInsn(Opcodes.RETURN);
       
   432                 methodVisitor.visitEnd();
       
   433             });
       
   434 
   432 
   435         // MyEvent#shouldCommit()
   433         // MyEvent#shouldCommit()
   436         updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> {
   434         updateMethod(METHOD_EVENT_SHOULD_COMMIT, methodVisitor -> {
   437             Label fail = new Label();
   435             Label fail = new Label();
   438             if (guardHandlerReference) {
   436             if (guardHandlerReference) {
   467             methodVisitor.visitInsn(Opcodes.ICONST_0);
   465             methodVisitor.visitInsn(Opcodes.ICONST_0);
   468             methodVisitor.visitInsn(Opcodes.IRETURN);
   466             methodVisitor.visitInsn(Opcodes.IRETURN);
   469         });
   467         });
   470     }
   468     }
   471 
   469 
       
   470 
   472     private void getEventHandler(MethodVisitor methodVisitor) {
   471     private void getEventHandler(MethodVisitor methodVisitor) {
   473         if (untypedEventHandler) {
   472         if (untypedEventHandler) {
   474             methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, getInternalClassName(), FIELD_EVENT_HANDLER, TYPE_OBJECT.getDescriptor());
   473             methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, getInternalClassName(), FIELD_EVENT_HANDLER, TYPE_OBJECT.getDescriptor());
   475             methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, TYPE_EVENT_HANDLER.getInternalName());
   474             methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, TYPE_EVENT_HANDLER.getInternalName());
   476         } else {
   475         } else {