package org.adoptopenjdk.jitwatch.parser.j9; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_ADDRESS; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_BYTES; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_COMPILER; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_COMPILE_ID; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_METHOD; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NMSIZE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_SIZE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_STAMP; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_QUOTE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.J9; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_NMETHOD; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_TASK_DONE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_TASK_QUEUED; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.adoptopenjdk.jitwatch.model.LogParseException; import org.adoptopenjdk.jitwatch.model.MemberSignatureParts; import org.adoptopenjdk.jitwatch.model.Tag; import org.adoptopenjdk.jitwatch.model.Task; import org.adoptopenjdk.jitwatch.util.StringUtil; public class J9Line { public static final String TEMPERATURE_COLD = "cold"; public static final String TEMPERATURE_WARM = "warm"; public static final String TEMPERATURE_PROFILED_VERY_HOT = "profiled very-hot"; private String temperature; private String signature; private String rangeStart; private String rangeEnd; private Map<String, String> attributes = new HashMap<>(); private Set<String> features = new HashSet<>(); public String getTemperature() { return temperature; } public void setTemperature(String temperature) { this.temperature = temperature; } public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public String getRangeStart() { return rangeStart; } public String getRangeEnd() { return rangeEnd; } public void setRange(String range) { if (range != null) { String[] parts = range.split("-"); if (parts.length == 2) { this.rangeStart = parts[0]; this.rangeEnd = parts[1]; } } } public Map<String, String> getAttributes() { return attributes; } public void addAttribute(String key, String value) { this.attributes.put(key, value); } public Set<String> getFeatures() { return features; } public void addFeatures(String feature) { this.features.add(feature); } public boolean hasFeature(String feature) { return features.contains(feature); } public MemberSignatureParts getMemberSignatureParts() throws LogParseException { String logCompilationSignature = J9Util.convertJ9SigToLogCompilationSignature(signature); return MemberSignatureParts.fromLogCompilationSignature(logCompilationSignature); } public int getBytecodeSize() { int result = 0; String bcszAttr = attributes.get("bcsz"); if (bcszAttr != null) { try { result = Integer.parseInt(bcszAttr); } catch (NumberFormatException nfe) { nfe.printStackTrace(); // TODO log } } return result; } public int getNativeSize() { long highAddress = 0; long lowAddress = 0; try { highAddress = Long.parseLong(rangeEnd, 16); lowAddress = Long.parseLong(rangeStart, 16); } catch (NumberFormatException nfe) { nfe.printStackTrace(); // TODO log } return (int) (highAddress - lowAddress); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("J9Line [getTemperature()="); builder.append(getTemperature()); builder.append(", getSignature()="); builder.append(getSignature()); builder.append(", getRangeStart()="); builder.append(getRangeStart()); builder.append(", getRangeEnd()="); builder.append(getRangeEnd()); builder.append(", getAttributes()="); builder.append(getAttributes()); builder.append(", getFeatures()="); builder.append(getFeatures()); builder.append(", getMemberSignatureParts()="); try { builder.append(getMemberSignatureParts()).append("\n"); } catch (LogParseException e) { e.printStackTrace(); } builder.append(", getBytecodeSize()="); builder.append(getBytecodeSize()); builder.append("]"); return builder.toString(); } public Tag toTagQueued(int compiledID, long timestampMillis) { Map<String, String> map = new HashMap<>(); map.put(ATTR_COMPILE_ID, Integer.toString(compiledID)); map.put(ATTR_STAMP, Long.toString(timestampMillis)); map.put(ATTR_METHOD, J9Util.convertJ9SigToLogCompilationSignature(signature)); map.put(ATTR_BYTES, Integer.toString(getBytecodeSize())); Tag tag = new Tag(TAG_TASK_QUEUED, StringUtil.attributeMapToString(map, C_QUOTE), true); return tag; } public Tag toTagNMethod(int compiledID, long timestampMillis) { Map<String, String> map = new HashMap<>(); map.put(ATTR_COMPILE_ID, Integer.toString(compiledID)); map.put(ATTR_STAMP, Long.toString(timestampMillis)); map.put(ATTR_METHOD, J9Util.convertJ9SigToLogCompilationSignature(signature)); map.put(ATTR_COMPILER, J9); map.put(ATTR_ADDRESS, rangeStart); map.put(ATTR_SIZE, Integer.toString(getNativeSize())); map.put(ATTR_BYTES, Integer.toString(getBytecodeSize())); Tag tag = new Tag(TAG_NMETHOD, StringUtil.attributeMapToString(map, C_QUOTE), true); return tag; } public Task toTagTask(int compiledID, long timestampMillis) { Map<String, String> map = new HashMap<>(); map.put(ATTR_COMPILE_ID, Integer.toString(compiledID)); map.put(ATTR_STAMP, Long.toString(timestampMillis)); map.put(ATTR_METHOD, J9Util.convertJ9SigToLogCompilationSignature(signature)); Task task = new Task(StringUtil.attributeMapToString(map, C_QUOTE), true); Map<String, String> doneAttrs = new HashMap<>(); doneAttrs.put(ATTR_NMSIZE, Integer.toString(getNativeSize())); doneAttrs.put(ATTR_STAMP, Long.toString(timestampMillis)); doneAttrs.put("success", "1"); Tag tagTaskDone = new Tag(TAG_TASK_DONE, StringUtil.attributeMapToString(doneAttrs), true); task.addChild(tagTaskDone); return task; } }