< prev index next >

make/src/classes/build/tools/jfr/GenerateJfrFiles.java

Print this page
rev 51955 : 8211239: Build fails without JFR: empty JFR events signatures mismatch
Reviewed-by: XXX


 460             out.write("#if INCLUDE_JFR");
 461             out.write("#include \"jfr/recorder/service/jfrEvent.hpp\"");
 462             out.write("/*");
 463             out.write(" * Each event class has an assert member function verify() which is invoked");
 464             out.write(" * just before the engine writes the event and its fields to the data stream.");
 465             out.write(" * The purpose of verify() is to ensure that all fields in the event are initialized");
 466             out.write(" * and set before attempting to commit.");
 467             out.write(" *");
 468             out.write(" * We enforce this requirement because events are generally stack allocated and therefore");
 469             out.write(" * *not* initialized to default values. This prevents us from inadvertently committing");
 470             out.write(" * uninitialized values to the data stream.");
 471             out.write(" *");
 472             out.write(" * The assert message contains both the index (zero based) as well as the name of the field.");
 473             out.write(" */");
 474             out.write("");
 475             printTypes(out, metadata, false);
 476             out.write("");
 477             out.write("");
 478             out.write("#else // !INCLUDE_JFR");
 479             out.write("");

 480             out.write("class JfrEvent {");
 481             out.write(" public:");
 482             out.write("  JfrEvent() {}");
 483             out.write("  void set_starttime(const Ticks&) const {}");
 484             out.write("  void set_endtime(const Ticks&) const {}");
 485             out.write("  bool should_commit() const { return false; }");
 486             out.write("  static bool is_enabled() { return false; }");
 487             out.write("  void commit() {}");
 488             out.write("};");
 489             out.write("");
 490             printTypes(out, metadata, true);
 491             out.write("");
 492             out.write("");
 493             out.write("#endif // INCLUDE_JFR");
 494             out.write("#endif // JFRFILES_JFREVENTCLASSES_HPP");
 495         }
 496     }
 497 
 498     private static void printTypes(Printer out, Metadata metadata, boolean empty) {
 499         for (TypeElement t : metadata.getStructs()) {
 500             if (empty) {
 501                 out.write("");
 502                 printEmptyType(out, t);
 503             } else {
 504                 printType(out, t);
 505             }
 506             out.write("");
 507         }
 508         for (EventElement e : metadata.getEvents()) {
 509             if (empty) {
 510                 printEmptyEvent(out, e);
 511             } else {
 512                 printEvent(out, e);
 513             }
 514             out.write("");
 515         }
 516     }
 517 
 518     private static void printEmptyEvent(Printer out, EventElement event) {
 519         out.write("class Event" + event.name + " : public JfrEvent");
 520         out.write("{");
 521         out.write(" public:");
 522         out.write("  Event" + event.name + "(EventStartTime ignore=TIMED) {}");
 523         if (event.startTime) {
 524             StringJoiner sj = new StringJoiner(",\n    ");
 525             for (FieldElement f : event.fields) {
 526                 sj.add(f.getParameterType());
 527             }
 528             out.write("  Event" + event.name + "(");
 529             out.write("    " + sj.toString() + ") { }");
 530         }
 531         for (FieldElement f : event.fields) {
 532             out.write("  void set_" + f.name + "(" + f.getParameterType() + ") { }");
 533         }
 534         out.write("};");
 535     }
 536 
 537     private static void printEmptyType(Printer out, TypeElement t) {
 538         out.write("struct JfrStruct" + t.name);
 539         out.write("{");
 540         out.write(" public:");
 541         for (FieldElement f : t.fields) {
 542             out.write("  void set_" + f.name + "(" + f.getParameterType() + ") { }");
 543         }
 544         out.write("};");
 545     }
 546 
 547     private static void printType(Printer out, TypeElement t) {
 548         out.write("struct JfrStruct" + t.name);
 549         out.write("{");

 550         out.write(" private:");
 551         for (FieldElement f : t.fields) {
 552             printField(out, f);
 553         }
 554         out.write("");

 555         out.write(" public:");
 556         for (FieldElement f : t.fields) {
 557             printTypeSetter(out, f);
 558         }
 559         out.write("");

 560         printWriteData(out, t.fields);

 561         out.write("};");
 562         out.write("");
 563     }
 564 
 565     private static void printEvent(Printer out, EventElement event) {
 566         out.write("class Event" + event.name + " : public JfrEvent<Event" + event.name + ">");
 567         out.write("{");

 568         out.write(" private:");
 569         for (FieldElement f : event.fields) {
 570             printField(out, f);
 571         }
 572         out.write("");

 573         out.write(" public:");

 574         out.write("  static const bool hasThread = " + event.thread + ";");
 575         out.write("  static const bool hasStackTrace = " + event.stackTrace + ";");
 576         out.write("  static const bool isInstant = " + !event.startTime + ";");
 577         out.write("  static const bool hasCutoff = " + event.cutoff + ";");
 578         out.write("  static const bool isRequestable = " + event.periodic + ";");
 579         out.write("  static const JfrEventId eventId = Jfr" + event.name + "Event;");
 580         out.write("");


 581         out.write("  Event" + event.name + "(EventStartTime timing=TIMED) : JfrEvent<Event" + event.name + ">(timing) {}");



 582         out.write("");
 583         int index = 0;
 584         for (FieldElement f : event.fields) {
 585             out.write("  void set_" + f.name + "(" + f.getParameterType() + " " + f.getParameterName() + ") {");

 586             out.write("    this->_" + f.name + " = " + f.getParameterName() + ";");
 587             out.write("    DEBUG_ONLY(set_field_bit(" + index++ + "));");

 588             out.write("  }");
 589         }
 590         out.write("");

 591         printWriteData(out, event.fields);
 592         out.write("");

 593         out.write("  using JfrEvent<Event" + event.name + ">::commit; // else commit() is hidden by overloaded versions in this class");
 594         printConstructor2(out, event);
 595         printCommitMethod(out, event);

 596         printVerify(out, event.fields);

 597         out.write("};");
 598     }
 599 
 600     private static void printWriteData(Printer out, List<FieldElement> fields) {
 601         out.write("  template <typename Writer>");
 602         out.write("  void writeData(Writer& w) {");
 603         for (FieldElement field : fields) {
 604             if (field.struct) {
 605                 out.write("    _" + field.name + ".writeData(w);");
 606             } else {
 607                 out.write("    w.write(_" + field.name + ");");
 608             }
 609         }
 610         out.write("  }");
 611     }
 612 
 613     private static void printTypeSetter(Printer out, FieldElement field) {

 614         out.write("  void set_" + field.name + "(" + field.getParameterType() + " new_value) { this->_" + field.name + " = new_value; }");



 615     }
 616 
 617     private static void printVerify(Printer out, List<FieldElement> fields) {
 618         out.write("");
 619         out.write("#ifdef ASSERT");
 620         out.write("  void verify() const {");
 621         int index = 0;
 622         for (FieldElement f : fields) {
 623             out.write("    assert(verify_field_bit(" + index++ + "), \"Attempting to write an uninitialized event field: %s\", \"_" + f.name + "\");");
 624         }
 625         out.write("  }");
 626         out.write("#endif");
 627     }
 628 
 629     private static void printCommitMethod(Printer out, EventElement event) {
 630         if (event.startTime) {
 631             StringJoiner sj = new StringJoiner(",\n              ");
 632             for (FieldElement f : event.fields) {
 633                 sj.add(f.getParameterType() + " " + f.name);
 634             }
 635             out.write("");
 636             out.write("  void commit(" + sj.toString() + ") {");

 637             out.write("    if (should_commit()) {");
 638             for (FieldElement f : event.fields) {
 639                 out.write("      set_" + f.name + "(" + f.name + ");");
 640             }
 641             out.write("      commit();");
 642             out.write("    }");

 643             out.write("  }");
 644         }
 645         out.write("");
 646         StringJoiner sj = new StringJoiner(",\n                     ");
 647         if (event.startTime) {
 648             sj.add("const Ticks& startTicks");
 649             sj.add("const Ticks& endTicks");
 650         }
 651         for (FieldElement f : event.fields) {
 652             sj.add(f.getParameterType() + " " + f.name);
 653         }
 654         out.write("  static void commit(" + sj.toString() + ") {");

 655         out.write("    Event" + event.name + " me(UNTIMED);");
 656         out.write("");
 657         out.write("    if (me.should_commit()) {");
 658         if (event.startTime) {
 659             out.write("      me.set_starttime(startTicks);");
 660             out.write("      me.set_endtime(endTicks);");
 661         }
 662         for (FieldElement f : event.fields) {
 663             out.write("      me.set_" + f.name + "(" + f.name + ");");
 664         }
 665         out.write("      me.commit();");
 666         out.write("    }");

 667         out.write("  }");
 668     }
 669 
 670     private static void printConstructor2(Printer out, EventElement event) {
 671         if (!event.startTime) {
 672             out.write("");
 673             out.write("");
 674         }
 675         if (event.startTime) {
 676             out.write("");
 677             out.write("  Event" + event.name + "(");
 678             StringJoiner sj = new StringJoiner(",\n    ");
 679             for (FieldElement f : event.fields) {
 680                 sj.add(f.getParameterType() + " " + f.name);
 681             }

 682             out.write("    " + sj.toString() + ") : JfrEvent<Event" + event.name + ">(TIMED) {");
 683             out.write("    if (should_commit()) {");
 684             for (FieldElement f : event.fields) {
 685                 out.write("      set_" + f.name + "(" + f.name + ");");
 686             }
 687             out.write("    }");



 688             out.write("  }");
 689         }
 690     }
 691 
 692     private static void printField(Printer out, FieldElement field) {
 693         out.write("  " + field.getFieldType() + " _" + field.name + ";");
 694     }
 695 }


 460             out.write("#if INCLUDE_JFR");
 461             out.write("#include \"jfr/recorder/service/jfrEvent.hpp\"");
 462             out.write("/*");
 463             out.write(" * Each event class has an assert member function verify() which is invoked");
 464             out.write(" * just before the engine writes the event and its fields to the data stream.");
 465             out.write(" * The purpose of verify() is to ensure that all fields in the event are initialized");
 466             out.write(" * and set before attempting to commit.");
 467             out.write(" *");
 468             out.write(" * We enforce this requirement because events are generally stack allocated and therefore");
 469             out.write(" * *not* initialized to default values. This prevents us from inadvertently committing");
 470             out.write(" * uninitialized values to the data stream.");
 471             out.write(" *");
 472             out.write(" * The assert message contains both the index (zero based) as well as the name of the field.");
 473             out.write(" */");
 474             out.write("");
 475             printTypes(out, metadata, false);
 476             out.write("");
 477             out.write("");
 478             out.write("#else // !INCLUDE_JFR");
 479             out.write("");
 480             out.write("template <typename T>");
 481             out.write("class JfrEvent {");
 482             out.write(" public:");
 483             out.write("  JfrEvent() {}");
 484             out.write("  void set_starttime(const Ticks&) const {}");
 485             out.write("  void set_endtime(const Ticks&) const {}");
 486             out.write("  bool should_commit() const { return false; }");
 487             out.write("  static bool is_enabled() { return false; }");
 488             out.write("  void commit() {}");
 489             out.write("};");
 490             out.write("");
 491             printTypes(out, metadata, true);
 492             out.write("");
 493             out.write("");
 494             out.write("#endif // INCLUDE_JFR");
 495             out.write("#endif // JFRFILES_JFREVENTCLASSES_HPP");
 496         }
 497     }
 498 
 499     private static void printTypes(Printer out, Metadata metadata, boolean empty) {
 500         for (TypeElement t : metadata.getStructs()) {
 501             printType(out, t, empty);





 502             out.write("");
 503         }
 504         for (EventElement e : metadata.getEvents()) {
 505             printEvent(out, e, empty);




 506             out.write("");
 507         }
 508     }
 509 



















 510     private static void printEmptyType(Printer out, TypeElement t) {
 511         out.write("struct JfrStruct" + t.name);
 512         out.write("{");
 513         out.write(" public:");
 514         for (FieldElement f : t.fields) {
 515             out.write("  void set_" + f.name + "(" + f.getParameterType() + ") { }");
 516         }
 517         out.write("};");
 518     }
 519 
 520     private static void printType(Printer out, TypeElement t, boolean empty) {
 521         out.write("struct JfrStruct" + t.name);
 522         out.write("{");
 523         if (!empty) {
 524           out.write(" private:");
 525           for (FieldElement f : t.fields) {
 526               printField(out, f);
 527           }
 528           out.write("");
 529         }
 530         out.write(" public:");
 531         for (FieldElement f : t.fields) {
 532            printTypeSetter(out, f, empty);
 533         }
 534         out.write("");
 535         if (!empty) {
 536           printWriteData(out, t.fields);
 537         }
 538         out.write("};");
 539         out.write("");
 540     }
 541 
 542     private static void printEvent(Printer out, EventElement event, boolean empty) {
 543         out.write("class Event" + event.name + " : public JfrEvent<Event" + event.name + ">");
 544         out.write("{");
 545         if (!empty) {
 546           out.write(" private:");
 547           for (FieldElement f : event.fields) {
 548               printField(out, f);
 549           }
 550           out.write("");
 551         }
 552         out.write(" public:");
 553         if (!empty) {
 554           out.write("  static const bool hasThread = " + event.thread + ";");
 555           out.write("  static const bool hasStackTrace = " + event.stackTrace + ";");
 556           out.write("  static const bool isInstant = " + !event.startTime + ";");
 557           out.write("  static const bool hasCutoff = " + event.cutoff + ";");
 558           out.write("  static const bool isRequestable = " + event.periodic + ";");
 559           out.write("  static const JfrEventId eventId = Jfr" + event.name + "Event;");
 560           out.write("");
 561         }
 562         if (!empty) {
 563           out.write("  Event" + event.name + "(EventStartTime timing=TIMED) : JfrEvent<Event" + event.name + ">(timing) {}");
 564         } else {
 565           out.write("  Event" + event.name + "(EventStartTime timing=TIMED) {}");
 566         }
 567         out.write("");
 568         int index = 0;
 569         for (FieldElement f : event.fields) {
 570             out.write("  void set_" + f.name + "(" + f.getParameterType() + " " + f.getParameterName() + ") {");
 571             if (!empty) {
 572               out.write("    this->_" + f.name + " = " + f.getParameterName() + ";");
 573               out.write("    DEBUG_ONLY(set_field_bit(" + index++ + "));");
 574             }
 575             out.write("  }");
 576         }
 577         out.write("");
 578         if (!empty) {
 579           printWriteData(out, event.fields);
 580           out.write("");
 581         }
 582         out.write("  using JfrEvent<Event" + event.name + ">::commit; // else commit() is hidden by overloaded versions in this class");
 583         printConstructor2(out, event, empty);
 584         printCommitMethod(out, event, empty);
 585         if (!empty) {
 586           printVerify(out, event.fields);
 587         }
 588         out.write("};");
 589     }
 590 
 591     private static void printWriteData(Printer out, List<FieldElement> fields) {
 592         out.write("  template <typename Writer>");
 593         out.write("  void writeData(Writer& w) {");
 594         for (FieldElement field : fields) {
 595             if (field.struct) {
 596                 out.write("    _" + field.name + ".writeData(w);");
 597             } else {
 598                 out.write("    w.write(_" + field.name + ");");
 599             }
 600         }
 601         out.write("  }");
 602     }
 603 
 604     private static void printTypeSetter(Printer out, FieldElement field, boolean empty) {
 605         if (!empty) {
 606           out.write("  void set_" + field.name + "(" + field.getParameterType() + " new_value) { this->_" + field.name + " = new_value; }");
 607         } else {
 608           out.write("  void set_" + field.name + "(" + field.getParameterType() + " new_value) { }");
 609         }
 610     }
 611 
 612     private static void printVerify(Printer out, List<FieldElement> fields) {
 613         out.write("");
 614         out.write("#ifdef ASSERT");
 615         out.write("  void verify() const {");
 616         int index = 0;
 617         for (FieldElement f : fields) {
 618             out.write("    assert(verify_field_bit(" + index++ + "), \"Attempting to write an uninitialized event field: %s\", \"_" + f.name + "\");");
 619         }
 620         out.write("  }");
 621         out.write("#endif");
 622     }
 623 
 624     private static void printCommitMethod(Printer out, EventElement event, boolean empty) {
 625         if (event.startTime) {
 626             StringJoiner sj = new StringJoiner(",\n              ");
 627             for (FieldElement f : event.fields) {
 628                 sj.add(f.getParameterType() + " " + f.name);
 629             }
 630             out.write("");
 631             out.write("  void commit(" + sj.toString() + ") {");
 632             if (!empty) {
 633               out.write("    if (should_commit()) {");
 634               for (FieldElement f : event.fields) {
 635                   out.write("      set_" + f.name + "(" + f.name + ");");
 636               }
 637               out.write("      commit();");
 638               out.write("    }");
 639             }
 640             out.write("  }");
 641         }
 642         out.write("");
 643         StringJoiner sj = new StringJoiner(",\n                     ");
 644         if (event.startTime) {
 645             sj.add("const Ticks& startTicks");
 646             sj.add("const Ticks& endTicks");
 647         }
 648         for (FieldElement f : event.fields) {
 649             sj.add(f.getParameterType() + " " + f.name);
 650         }
 651         out.write("  static void commit(" + sj.toString() + ") {");
 652         if (!empty) {
 653           out.write("    Event" + event.name + " me(UNTIMED);");
 654           out.write("");
 655           out.write("    if (me.should_commit()) {");
 656           if (event.startTime) {
 657               out.write("      me.set_starttime(startTicks);");
 658               out.write("      me.set_endtime(endTicks);");
 659           }
 660           for (FieldElement f : event.fields) {
 661               out.write("      me.set_" + f.name + "(" + f.name + ");");
 662           }
 663           out.write("      me.commit();");
 664           out.write("    }");
 665         }
 666         out.write("  }");
 667     }
 668 
 669     private static void printConstructor2(Printer out, EventElement event, boolean empty) {
 670         if (!event.startTime) {
 671             out.write("");
 672             out.write("");
 673         }
 674         if (event.startTime) {
 675             out.write("");
 676             out.write("  Event" + event.name + "(");
 677             StringJoiner sj = new StringJoiner(",\n    ");
 678             for (FieldElement f : event.fields) {
 679                 sj.add(f.getParameterType() + " " + f.name);
 680             }
 681             if (!empty) {
 682               out.write("    " + sj.toString() + ") : JfrEvent<Event" + event.name + ">(TIMED) {");
 683               out.write("    if (should_commit()) {");
 684               for (FieldElement f : event.fields) {
 685                   out.write("      set_" + f.name + "(" + f.name + ");");
 686               }
 687               out.write("    }");
 688             } else {
 689               out.write("    " + sj.toString() + ") {");
 690             }
 691             out.write("  }");
 692         }
 693     }
 694 
 695     private static void printField(Printer out, FieldElement field) {
 696         out.write("  " + field.getFieldType() + " _" + field.name + ";");
 697     }
 698 }
< prev index next >