103 public void addEvent(Object[] fieldValues) { 104 Iterator<Integer> skipIter = skipFields.iterator(); 105 int skipNext = skipIter.next(); 106 int j = 0; 107 for (int i = 0; i < fieldValues.length; i++) { 108 if (i != skipNext) { 109 reusableStruct[j++] = fieldValues[i]; 110 } else if (skipIter.hasNext()) { 111 skipNext = skipIter.next(); 112 } 113 } 114 subSink.addEvent(reusableStruct); 115 } 116 } 117 118 // NOTE: Using constant pool id as identifier. 119 private static final Map<Long, StructContentType<Object[]>> STRUCT_TYPES = new HashMap<>(); 120 121 private class TypeEntry { 122 private static final String STRUCT_TYPE_STACK_TRACE = "com.oracle.jfr.types.StackTrace"; //$NON-NLS-1$ 123 private static final String STRUCT_TYPE_STACK_FRAME = "com.oracle.jfr.types.StackFrame"; //$NON-NLS-1$ 124 private static final String STRUCT_TYPE_METHOD = "com.oracle.jfr.types.Method"; //$NON-NLS-1$ 125 private static final String STRUCT_TYPE_CLASS = "java.lang.Class"; //$NON-NLS-1$ 126 private static final String STRUCT_TYPE_CLASS_LOADER = "com.oracle.jfr.types.ClassLoader"; //$NON-NLS-1$ 127 private static final String STRUCT_TYPE_MODULE = "com.oracle.jfr.types.Module"; //$NON-NLS-1$ 128 private static final String STRUCT_TYPE_PACKAGE = "com.oracle.jfr.types.Package"; //$NON-NLS-1$ 129 private static final String STRUCT_TYPE_OLD_OBJECT = "com.oracle.jfr.types.OldObject"; //$NON-NLS-1$ 130 private static final String STRUCT_TYPE_OLD_OBJECT_ARRAY = "com.oracle.jfr.types.OldObjectArray"; //$NON-NLS-1$ 131 private static final String STRUCT_TYPE_OLD_OBJECT_FIELD = "com.oracle.jfr.types.OldObjectField"; //$NON-NLS-1$ 132 private static final String STRUCT_TYPE_OLD_OBJECT_GC_ROOT = "com.oracle.jfr.types.OldObjectGcRoot"; //$NON-NLS-1$ 133 private static final String STRUCT_TYPE_THREAD_GROUP = "com.oracle.jfr.types.ThreadGroup"; //$NON-NLS-1$ 134 private static final String STRUCT_TYPE_THREAD = "java.lang.Thread"; //$NON-NLS-1$ 135 136 final ClassElement element; 137 final FastAccessNumberMap<Object> constants; 138 private IValueReader reader; 139 140 TypeEntry(ClassElement element) { 141 this(element, new FastAccessNumberMap<>()); 142 } 143 144 /** 145 * Temporary constructor for sharing constants. Only used for Strings. 146 */ 147 TypeEntry(ClassElement element, FastAccessNumberMap<Object> constants) { 148 this.element = element; 149 this.constants = constants; 150 } 151 152 public IValueReader getReader() throws InvalidJfrFileException { 153 if (reader == null) { 171 element.description, fieldCount); 172 // assign before resolving field since it may be recursive 173 reader = typeReader; 174 for (int i = 0; i < fieldCount; i++) { 175 FieldElement fe = element.fields.get(i); 176 IValueReader reader = createFieldReader(fe, null); 177 String labelOrId = (fe.label == null) ? fe.fieldIdentifier : fe.label; 178 typeReader.addField(fe.fieldIdentifier, labelOrId, fe.description, reader); 179 } 180 } 181 } 182 return reader; 183 } 184 185 private AbstractStructReader createStructReader( 186 String identifier, String name, String description, int fieldCount) { 187 switch (identifier) { 188 case STRUCT_TYPE_THREAD: 189 return new ReflectiveReader(JfrThread.class, fieldCount, UnitLookup.THREAD); 190 case STRUCT_TYPE_THREAD_GROUP: 191 return new ReflectiveReader(JfrThreadGroup.class, fieldCount, UnitLookup.THREAD_GROUP); 192 case STRUCT_TYPE_CLASS: 193 return new ReflectiveReader(JfrJavaClass.class, fieldCount, UnitLookup.CLASS); 194 case STRUCT_TYPE_CLASS_LOADER: 195 return new ReflectiveReader(JfrJavaClassLoader.class, fieldCount, UnitLookup.CLASS_LOADER); 196 case STRUCT_TYPE_OLD_OBJECT_GC_ROOT: 197 return new ReflectiveReader(JfrOldObjectGcRoot.class, fieldCount, UnitLookup.OLD_OBJECT_GC_ROOT); 198 case STRUCT_TYPE_OLD_OBJECT: 199 return new ReflectiveReader(JfrOldObject.class, fieldCount, UnitLookup.OLD_OBJECT); 200 case STRUCT_TYPE_OLD_OBJECT_ARRAY: 201 return new ReflectiveReader(JfrOldObjectArray.class, fieldCount, UnitLookup.OLD_OBJECT_ARRAY); 202 case STRUCT_TYPE_OLD_OBJECT_FIELD: 203 return new ReflectiveReader(JfrOldObjectField.class, fieldCount, UnitLookup.OLD_OBJECT_FIELD); 204 case STRUCT_TYPE_METHOD: 205 return new ReflectiveReader(JfrMethod.class, fieldCount, UnitLookup.METHOD); 206 case STRUCT_TYPE_STACK_FRAME: 207 return new ReflectiveReader(JfrFrame.class, fieldCount, UnitLookup.STACKTRACE_FRAME); 208 case STRUCT_TYPE_STACK_TRACE: 209 return new ReflectiveReader(JfrStackTrace.class, fieldCount, UnitLookup.STACKTRACE); 210 case STRUCT_TYPE_MODULE: 211 return new ReflectiveReader(JfrJavaModule.class, fieldCount, UnitLookup.MODULE); 212 case STRUCT_TYPE_PACKAGE: 213 return new ReflectiveReader(JfrJavaPackage.class, fieldCount, UnitLookup.PACKAGE); 214 default: 215 synchronized (STRUCT_TYPES) { 216 StructContentType<Object[]> structType = STRUCT_TYPES.get(element.classId); 217 if (structType == null) { 218 structType = new StructContentType<>(element.typeIdentifier, element.label, 219 element.description); 220 STRUCT_TYPES.put(element.classId, structType); 221 } 222 return new StructReader(structType, fieldCount); 223 } 224 } 225 } 226 227 void resolveConstants() throws InvalidJfrFileException { 228 IValueReader r = reader; 229 if (r != null) { 230 for (Object c : constants) { 231 r.resolve(c); 232 // FIXME: During resolve, some constants may become equal. Should we ensure canonical constants? | 103 public void addEvent(Object[] fieldValues) { 104 Iterator<Integer> skipIter = skipFields.iterator(); 105 int skipNext = skipIter.next(); 106 int j = 0; 107 for (int i = 0; i < fieldValues.length; i++) { 108 if (i != skipNext) { 109 reusableStruct[j++] = fieldValues[i]; 110 } else if (skipIter.hasNext()) { 111 skipNext = skipIter.next(); 112 } 113 } 114 subSink.addEvent(reusableStruct); 115 } 116 } 117 118 // NOTE: Using constant pool id as identifier. 119 private static final Map<Long, StructContentType<Object[]>> STRUCT_TYPES = new HashMap<>(); 120 121 private class TypeEntry { 122 private static final String STRUCT_TYPE_STACK_TRACE = "com.oracle.jfr.types.StackTrace"; //$NON-NLS-1$ 123 private static final String STRUCT_TYPE_STACK_TRACE2 = "jdk.types.StackTrace"; //$NON-NLS-1$ 124 private static final String STRUCT_TYPE_STACK_FRAME = "com.oracle.jfr.types.StackFrame"; //$NON-NLS-1$ 125 private static final String STRUCT_TYPE_STACK_FRAME2 = "jdk.types.StackFrame"; //$NON-NLS-1$ 126 private static final String STRUCT_TYPE_METHOD = "com.oracle.jfr.types.Method"; //$NON-NLS-1$ 127 private static final String STRUCT_TYPE_METHOD2 = "jdk.types.Method"; //$NON-NLS-1$ 128 private static final String STRUCT_TYPE_CLASS = "java.lang.Class"; //$NON-NLS-1$ 129 private static final String STRUCT_TYPE_CLASS_LOADER = "com.oracle.jfr.types.ClassLoader"; //$NON-NLS-1$ 130 private static final String STRUCT_TYPE_CLASS_LOADER2 = "jdk.types.ClassLoader"; //$NON-NLS-1$ 131 private static final String STRUCT_TYPE_MODULE = "com.oracle.jfr.types.Module"; //$NON-NLS-1$ 132 private static final String STRUCT_TYPE_MODULE2 = "jdk.types.Module"; //$NON-NLS-1$ 133 private static final String STRUCT_TYPE_PACKAGE = "com.oracle.jfr.types.Package"; //$NON-NLS-1$ 134 private static final String STRUCT_TYPE_PACKAGE2 = "jdk.types.Package"; //$NON-NLS-1$ 135 private static final String STRUCT_TYPE_OLD_OBJECT = "com.oracle.jfr.types.OldObject"; //$NON-NLS-1$ 136 private static final String STRUCT_TYPE_OLD_OBJECT2 = "jdk.types.OldObject"; //$NON-NLS-1$ 137 private static final String STRUCT_TYPE_OLD_OBJECT_ARRAY = "com.oracle.jfr.types.OldObjectArray"; //$NON-NLS-1$ 138 private static final String STRUCT_TYPE_OLD_OBJECT_ARRAY2 = "jdk.types.OldObjectArray"; //$NON-NLS-1$ 139 private static final String STRUCT_TYPE_OLD_OBJECT_FIELD = "com.oracle.jfr.types.OldObjectField"; //$NON-NLS-1$ 140 private static final String STRUCT_TYPE_OLD_OBJECT_FIELD2 = "jdk.types.OldObjectField"; //$NON-NLS-1$ 141 private static final String STRUCT_TYPE_OLD_OBJECT_GC_ROOT = "com.oracle.jfr.types.OldObjectGcRoot"; //$NON-NLS-1$ 142 private static final String STRUCT_TYPE_OLD_OBJECT_GC_ROOT2 = "jdk.types.OldObjectGcRoot"; //$NON-NLS-1$ 143 private static final String STRUCT_TYPE_THREAD_GROUP = "com.oracle.jfr.types.ThreadGroup"; //$NON-NLS-1$ 144 private static final String STRUCT_TYPE_THREAD_GROUP2 = "jdk.types.ThreadGroup"; //$NON-NLS-1$ 145 private static final String STRUCT_TYPE_THREAD = "java.lang.Thread"; //$NON-NLS-1$ 146 147 final ClassElement element; 148 final FastAccessNumberMap<Object> constants; 149 private IValueReader reader; 150 151 TypeEntry(ClassElement element) { 152 this(element, new FastAccessNumberMap<>()); 153 } 154 155 /** 156 * Temporary constructor for sharing constants. Only used for Strings. 157 */ 158 TypeEntry(ClassElement element, FastAccessNumberMap<Object> constants) { 159 this.element = element; 160 this.constants = constants; 161 } 162 163 public IValueReader getReader() throws InvalidJfrFileException { 164 if (reader == null) { 182 element.description, fieldCount); 183 // assign before resolving field since it may be recursive 184 reader = typeReader; 185 for (int i = 0; i < fieldCount; i++) { 186 FieldElement fe = element.fields.get(i); 187 IValueReader reader = createFieldReader(fe, null); 188 String labelOrId = (fe.label == null) ? fe.fieldIdentifier : fe.label; 189 typeReader.addField(fe.fieldIdentifier, labelOrId, fe.description, reader); 190 } 191 } 192 } 193 return reader; 194 } 195 196 private AbstractStructReader createStructReader( 197 String identifier, String name, String description, int fieldCount) { 198 switch (identifier) { 199 case STRUCT_TYPE_THREAD: 200 return new ReflectiveReader(JfrThread.class, fieldCount, UnitLookup.THREAD); 201 case STRUCT_TYPE_THREAD_GROUP: 202 case STRUCT_TYPE_THREAD_GROUP2: 203 return new ReflectiveReader(JfrThreadGroup.class, fieldCount, UnitLookup.THREAD_GROUP); 204 case STRUCT_TYPE_CLASS: 205 return new ReflectiveReader(JfrJavaClass.class, fieldCount, UnitLookup.CLASS); 206 case STRUCT_TYPE_CLASS_LOADER: 207 case STRUCT_TYPE_CLASS_LOADER2: 208 return new ReflectiveReader(JfrJavaClassLoader.class, fieldCount, UnitLookup.CLASS_LOADER); 209 case STRUCT_TYPE_OLD_OBJECT_GC_ROOT: 210 case STRUCT_TYPE_OLD_OBJECT_GC_ROOT2: 211 return new ReflectiveReader(JfrOldObjectGcRoot.class, fieldCount, UnitLookup.OLD_OBJECT_GC_ROOT); 212 case STRUCT_TYPE_OLD_OBJECT: 213 case STRUCT_TYPE_OLD_OBJECT2: 214 return new ReflectiveReader(JfrOldObject.class, fieldCount, UnitLookup.OLD_OBJECT); 215 case STRUCT_TYPE_OLD_OBJECT_ARRAY: 216 case STRUCT_TYPE_OLD_OBJECT_ARRAY2: 217 return new ReflectiveReader(JfrOldObjectArray.class, fieldCount, UnitLookup.OLD_OBJECT_ARRAY); 218 case STRUCT_TYPE_OLD_OBJECT_FIELD: 219 case STRUCT_TYPE_OLD_OBJECT_FIELD2: 220 return new ReflectiveReader(JfrOldObjectField.class, fieldCount, UnitLookup.OLD_OBJECT_FIELD); 221 case STRUCT_TYPE_METHOD: 222 case STRUCT_TYPE_METHOD2: 223 return new ReflectiveReader(JfrMethod.class, fieldCount, UnitLookup.METHOD); 224 case STRUCT_TYPE_STACK_FRAME: 225 case STRUCT_TYPE_STACK_FRAME2: 226 return new ReflectiveReader(JfrFrame.class, fieldCount, UnitLookup.STACKTRACE_FRAME); 227 case STRUCT_TYPE_STACK_TRACE: 228 case STRUCT_TYPE_STACK_TRACE2: 229 return new ReflectiveReader(JfrStackTrace.class, fieldCount, UnitLookup.STACKTRACE); 230 case STRUCT_TYPE_MODULE: 231 case STRUCT_TYPE_MODULE2: 232 return new ReflectiveReader(JfrJavaModule.class, fieldCount, UnitLookup.MODULE); 233 case STRUCT_TYPE_PACKAGE: 234 case STRUCT_TYPE_PACKAGE2: 235 return new ReflectiveReader(JfrJavaPackage.class, fieldCount, UnitLookup.PACKAGE); 236 default: 237 synchronized (STRUCT_TYPES) { 238 StructContentType<Object[]> structType = STRUCT_TYPES.get(element.classId); 239 if (structType == null) { 240 structType = new StructContentType<>(element.typeIdentifier, element.label, 241 element.description); 242 STRUCT_TYPES.put(element.classId, structType); 243 } 244 return new StructReader(structType, fieldCount); 245 } 246 } 247 } 248 249 void resolveConstants() throws InvalidJfrFileException { 250 IValueReader r = reader; 251 if (r != null) { 252 for (Object c : constants) { 253 r.resolve(c); 254 // FIXME: During resolve, some constants may become equal. Should we ensure canonical constants? |