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 }
|