7
7
import java .io .IOException ;
8
8
import java .io .PrintStream ;
9
9
import java .util .ArrayList ;
10
- import java .util .HashMap ;
11
10
import java .util .LinkedHashMap ;
12
11
import java .util .List ;
13
12
import java .util .Map ;
13
+ import java .util .Map .Entry ;
14
14
import java .util .StringJoiner ;
15
15
import java .util .function .Predicate ;
16
16
@@ -43,10 +43,11 @@ public static void main(String... args) throws Exception {
43
43
metadata .verify ();
44
44
metadata .wireUpTypes ();
45
45
46
+ TypeCounter typeCounter = new TypeCounter ();
47
+ printJfrEventIdsHpp (metadata , typeCounter , outputDirectory );
48
+ printJfrTypesHpp (metadata , typeCounter , outputDirectory );
46
49
printJfrPeriodicHpp (metadata , outputDirectory );
47
- printJfrEventIdsHpp (metadata , outputDirectory );
48
- printJfrEventControlHpp (metadata , outputDirectory );
49
- printJfrTypesHpp (metadata , outputDirectory );
50
+ printJfrEventControlHpp (metadata , typeCounter , outputDirectory );
50
51
printJfrEventClassesHpp (metadata , outputDirectory );
51
52
52
53
} catch (Exception e ) {
@@ -55,12 +56,78 @@ public static void main(String... args) throws Exception {
55
56
}
56
57
}
57
58
59
+ static class TypeCounter {
60
+ final static long RESERVED_EVENT_COUNT = 2 ;
61
+ long typeId = -1 ;
62
+ long eventId = -1 ;
63
+ long eventCount = 0 ;
64
+ String firstTypeName ;
65
+ String lastTypeName ;
66
+ String firstEventName ;
67
+ String lastEventname ;
68
+
69
+ public long nextEventId (String name ) {
70
+ eventCount ++;
71
+ if (eventId == -1 ) {
72
+ eventId = firstEventId ();
73
+ firstEventName = lastEventname = name ;
74
+ return eventId ;
75
+ }
76
+ lastEventname = name ;
77
+ return ++eventId ;
78
+ }
79
+
80
+ public long nextTypeId (String typeName ) {
81
+ if (typeId == -1 ) {
82
+ lastTypeName = firstTypeName = typeName ;
83
+ typeId = lastEventId ();
84
+ }
85
+ lastTypeName = typeName ;
86
+ return ++typeId ;
87
+ }
88
+
89
+ public long firstEventId () {
90
+ return RESERVED_EVENT_COUNT ;
91
+ }
92
+
93
+ public long lastEventId () {
94
+ return eventId == -1 ? firstEventId () : eventId ;
95
+ }
96
+
97
+ public long eventCount () {
98
+ return eventCount ;
99
+ }
100
+
101
+ public String firstTypeName () {
102
+ return firstTypeName ;
103
+ }
104
+
105
+ public String lastTypeName () {
106
+ return lastTypeName ;
107
+ }
108
+
109
+ public String firstEventName () {
110
+ return firstEventName ;
111
+ }
112
+
113
+ public String lastEventName () {
114
+ return lastEventname ;
115
+ }
116
+ }
117
+
58
118
static class XmlType {
119
+ final String name ;
59
120
final String fieldType ;
60
121
final String parameterType ;
61
- XmlType (String fieldType , String parameterType ) {
122
+ final String javaType ;
123
+ final boolean unsigned ;
124
+
125
+ XmlType (String name , String fieldType , String parameterType , String javaType , boolean unsigned ) {
126
+ this .name = name ;
62
127
this .fieldType = fieldType ;
63
128
this .parameterType = parameterType ;
129
+ this .javaType = javaType ;
130
+ this .unsigned = unsigned ;
64
131
}
65
132
}
66
133
@@ -74,7 +141,7 @@ static class TypeElement {
74
141
75
142
static class Metadata {
76
143
final Map <String , TypeElement > types = new LinkedHashMap <>();
77
- final Map <String , XmlType > xmlTypes = new HashMap <>();
144
+ final Map <String , XmlType > xmlTypes = new LinkedHashMap <>();
78
145
Metadata (File metadataXml , File metadataSchema ) throws ParserConfigurationException , SAXException , FileNotFoundException , IOException {
79
146
SchemaFactory schemaFactory = SchemaFactory .newInstance (XMLConstants .W3C_XML_SCHEMA_NS_URI );
80
147
SAXParserFactory factory = SAXParserFactory .newInstance ();
@@ -110,12 +177,8 @@ List<EventElement> getPeriodicEvents() {
110
177
return getList (t -> t .getClass () == EventElement .class && ((EventElement ) t ).periodic );
111
178
}
112
179
113
- List <TypeElement > getNonEventsAndNonStructs () {
114
- return getList (t -> t .getClass () != EventElement .class && !t .supportStruct );
115
- }
116
-
117
180
List <TypeElement > getTypes () {
118
- return getList (t -> t .getClass () == TypeElement .class && ! t . supportStruct );
181
+ return getList (t -> t .getClass () == TypeElement .class );
119
182
}
120
183
121
184
List <TypeElement > getStructs () {
@@ -213,8 +276,11 @@ public void startElement(String uri, String localName, String qName, Attributes
213
276
String name = attributes .getValue ("name" );
214
277
String parameterType = attributes .getValue ("parameterType" );
215
278
String fieldType = attributes .getValue ("fieldType" );
216
- metadata .xmlTypes .put (name , new XmlType (fieldType , parameterType ));
279
+ String javaType = attributes .getValue ("javaType" );
280
+ boolean unsigned = getBoolean (attributes , "unsigned" , false );
281
+ metadata .xmlTypes .put (name , new XmlType (name , fieldType , parameterType , javaType , unsigned ));
217
282
break ;
283
+ case "Relation" :
218
284
case "Type" :
219
285
currentType = new TypeElement ();
220
286
currentType .name = attributes .getValue ("name" );
@@ -247,6 +313,7 @@ private boolean getBoolean(Attributes attributes, String name, boolean defaultVa
247
313
@ Override
248
314
public void endElement (String uri , String localName , String qName ) {
249
315
switch (qName ) {
316
+ case "Relation" :
250
317
case "Type" :
251
318
case "Event" :
252
319
metadata .types .put (currentType .name , currentType );
@@ -318,7 +385,7 @@ private static void printJfrPeriodicHpp(Metadata metadata, File outputDirectory)
318
385
}
319
386
}
320
387
321
- private static void printJfrEventControlHpp (Metadata metadata , File outputDirectory ) throws Exception {
388
+ private static void printJfrEventControlHpp (Metadata metadata , TypeCounter typeCounter , File outputDirectory ) throws Exception {
322
389
try (Printer out = new Printer (outputDirectory , "jfrEventControl.hpp" )) {
323
390
out .write ("#ifndef JFRFILES_JFR_NATIVE_EVENTSETTING_HPP" );
324
391
out .write ("#define JFRFILES_JFR_NATIVE_EVENTSETTING_HPP" );
@@ -342,11 +409,11 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputDirect
342
409
out .write ("" );
343
410
out .write ("union JfrNativeSettings {" );
344
411
out .write (" // Array version." );
345
- out .write (" jfrNativeEventSetting bits[MaxJfrEventId ];" );
412
+ out .write (" jfrNativeEventSetting bits[NUMBER_OF_EVENTS ];" );
346
413
out .write (" // Then, to make it easy to debug," );
347
414
out .write (" // add named struct members also." );
348
415
out .write (" struct {" );
349
- out .write (" jfrNativeEventSetting pad[NUM_RESERVED_EVENTS ];" );
416
+ out .write (" jfrNativeEventSetting pad[NUMBER_OF_RESERVED_EVENTS ];" );
350
417
for (TypeElement t : metadata .getEventsAndStructs ()) {
351
418
out .write (" jfrNativeEventSetting " + t .name + ";" );
352
419
}
@@ -358,95 +425,89 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputDirect
358
425
}
359
426
}
360
427
361
- private static void printJfrEventIdsHpp (Metadata metadata , File outputDirectory ) throws Exception {
428
+ private static void printJfrEventIdsHpp (Metadata metadata , TypeCounter typeCounter , File outputDirectory ) throws Exception {
362
429
try (Printer out = new Printer (outputDirectory , "jfrEventIds.hpp" )) {
363
430
out .write ("#ifndef JFRFILES_JFREVENTIDS_HPP" );
364
431
out .write ("#define JFRFILES_JFREVENTIDS_HPP" );
365
432
out .write ("" );
366
433
out .write ("#include \" utilities/macros.hpp\" " );
367
434
out .write ("#if INCLUDE_JFR" );
368
- out .write ("#include \" jfrfiles/jfrTypes.hpp\" " );
369
435
out .write ("" );
370
- out .write ("/**" );
371
- out .write (" * Enum of the event types in the JVM" );
372
- out .write (" */" );
373
436
out .write ("enum JfrEventId {" );
374
- out .write (" _jfreventbase = (NUM_RESERVED_EVENTS-1), // Make sure we start at right index. " );
375
- out .write (" " );
376
- out . write ( " // Events -> enum entry" );
377
- for ( TypeElement t : metadata . getEventsAndStructs ()) {
378
- out .write (" Jfr " + t . name + "Event ," );
437
+ out .write (" JfrMetadataEvent = 0, " );
438
+ out .write (" JfrCheckpointEvent = 1, " );
439
+ for ( TypeElement t : metadata . getEvents ()) {
440
+ String name = "Jfr" + t . name + "Event" ;
441
+ out .write (" " + name + " = " + typeCounter . nextEventId ( name ) + "," );
379
442
}
380
- out .write ("" );
381
- out .write (" MaxJfrEventId" );
382
- out .write ("};" );
383
- out .write ("" );
384
- out .write ("/**" );
385
- out .write (" * Struct types in the JVM" );
386
- out .write (" */" );
387
- out .write ("enum JfrStructId {" );
388
- for (TypeElement t : metadata .getNonEventsAndNonStructs ()) {
389
- out .write (" Jfr" + t .name + "Struct," );
390
- }
391
- for (TypeElement t : metadata .getEventsAndStructs ()) {
392
- out .write (" Jfr" + t .name + "Struct," );
393
- }
394
- out .write ("" );
395
- out .write (" MaxJfrStructId" );
396
443
out .write ("};" );
397
- out .write ("" );
398
444
out .write ("typedef enum JfrEventId JfrEventId;" );
399
- out .write ("typedef enum JfrStructId JfrStructId;" );
400
445
out .write ("" );
446
+ out .write ("static const JfrEventId FIRST_EVENT_ID = " + typeCounter .firstEventName () + ";" );
447
+ out .write ("static const JfrEventId LAST_EVENT_ID = " + typeCounter .lastEventName () + ";" );
448
+ out .write ("static const int NUMBER_OF_EVENTS = " + typeCounter .eventCount () + ";" );
449
+ out .write ("static const int NUMBER_OF_RESERVED_EVENTS = " + TypeCounter .RESERVED_EVENT_COUNT + ";" );
401
450
out .write ("#endif // INCLUDE_JFR" );
402
451
out .write ("#endif // JFRFILES_JFREVENTIDS_HPP" );
403
452
}
404
453
}
405
454
406
- private static void printJfrTypesHpp (Metadata metadata , File outputDirectory ) throws Exception {
407
- List <String > knownTypes = List .of ("Thread" , "StackTrace" , "Class" , "StackFrame" );
455
+ private static void printJfrTypesHpp (Metadata metadata , TypeCounter typeCounter , File outputDirectory ) throws Exception {
408
456
try (Printer out = new Printer (outputDirectory , "jfrTypes.hpp" )) {
409
457
out .write ("#ifndef JFRFILES_JFRTYPES_HPP" );
410
458
out .write ("#define JFRFILES_JFRTYPES_HPP" );
411
459
out .write ("" );
412
460
out .write ("#include \" utilities/macros.hpp\" " );
413
461
out .write ("#if INCLUDE_JFR" );
414
462
out .write ("" );
463
+ out .write ("#include <string.h>" );
464
+ out .write ("#include \" memory/allocation.hpp\" " );
465
+ out .write ("" );
415
466
out .write ("enum JfrTypeId {" );
416
- out .write (" TYPE_NONE = 0," );
417
- out .write (" TYPE_CLASS = 20," );
418
- out .write (" TYPE_STRING = 21," );
419
- out .write (" TYPE_THREAD = 22," );
420
- out .write (" TYPE_STACKTRACE = 23," );
421
- out .write (" TYPE_BYTES = 24," );
422
- out .write (" TYPE_EPOCHMILLIS = 25," );
423
- out .write (" TYPE_MILLIS = 26," );
424
- out .write (" TYPE_NANOS = 27," );
425
- out .write (" TYPE_TICKS = 28," );
426
- out .write (" TYPE_ADDRESS = 29," );
427
- out .write (" TYPE_PERCENTAGE = 30," );
428
- out .write (" TYPE_DUMMY," );
429
- out .write (" TYPE_DUMMY_1," );
467
+ Map <String , XmlType > javaTypes = new LinkedHashMap <>();
468
+ for (var t : metadata .xmlTypes .entrySet ()) {
469
+ String name = t .getKey ();
470
+ XmlType xmlType = t .getValue ();
471
+ if (xmlType .javaType != null && !xmlType .unsigned ) {
472
+ String typeName = "TYPE_" + name .toUpperCase ();
473
+ long typeId = typeCounter .nextTypeId (typeName );
474
+ out .write (" " + typeName + " = " + typeId + "," );
475
+ javaTypes .put (name , xmlType );
476
+ }
477
+ }
430
478
for (TypeElement type : metadata .getTypes ()) {
431
- if (!knownTypes .contains (type .name )) {
432
- out .write (" TYPE_" + type .name .toUpperCase () + "," );
479
+ String name = type .name ;
480
+ if (!javaTypes .containsKey (name )) {
481
+ String typeName = "TYPE_" + name .toUpperCase ();
482
+ long typeId = typeCounter .nextTypeId (typeName );
483
+ out .write (" " + typeName + " = " + typeId + "," );
433
484
}
434
485
}
435
- out .write ("" );
436
- out .write (" NUM_JFR_TYPES," );
437
- out .write (" TYPES_END = 255" );
438
486
out .write ("};" );
439
487
out .write ("" );
440
- out .write ("enum ReservedEvent {" );
441
- out .write (" EVENT_METADATA," );
442
- out .write (" EVENT_CHECKPOINT," );
443
- out .write (" EVENT_BUFFERLOST," );
444
- out .write (" NUM_RESERVED_EVENTS = TYPES_END" );
488
+ out .write ("static const JfrTypeId FIRST_TYPE_ID = " + typeCounter .firstTypeName () + ";" );
489
+ out .write ("static const JfrTypeId LAST_TYPE_ID = " + typeCounter .lastTypeName () + ";" );
490
+
491
+ out .write ("" );
492
+ out .write ("class JfrType : public AllStatic {" );
493
+ out .write (" public:" );
494
+ out .write (" static jlong name_to_id(const char* type_name) {" );
495
+ for (Entry <String , XmlType > m : javaTypes .entrySet ()) {
496
+ XmlType xmlType = m .getValue ();
497
+ String javaName = xmlType .javaType ;
498
+ String typeName = xmlType .name .toUpperCase ();
499
+ out .write (" if (strcmp(type_name, \" " + javaName + "\" ) == 0) {" );
500
+ out .write (" return TYPE_" + typeName + ";" );
501
+ out .write (" }" );
502
+ }
503
+ out .write (" return -1;" );
504
+ out .write (" }" );
445
505
out .write ("};" );
446
506
out .write ("" );
447
507
out .write ("#endif // INCLUDE_JFR" );
448
508
out .write ("#endif // JFRFILES_JFRTYPES_HPP" );
449
- };
509
+ }
510
+ ;
450
511
}
451
512
452
513
private static void printJfrEventClassesHpp (Metadata metadata , File outputDirectory ) throws Exception {
0 commit comments