Skip to content

Commit 7adc76d

Browse files
committed
Replace a regex-based SMAP parser with a hand-crafted one
1 parent 44de9a3 commit 7adc76d

File tree

7 files changed

+19111
-273
lines changed

7 files changed

+19111
-273
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.datadog.profiling.controller.openjdk.events;
2+
3+
/**
4+
* A simple stateful parser for an smap entry.<br>
5+
* The values are delimited by spaces and/or dashes. The parser allows consuming next long/string
6+
* value, skipping over the current value, skipping to the next value, and slurping the rest of the
7+
* current value.<br>
8+
* The implementation is minimalistic with the accent on reducing the number of allocations.
9+
*/
10+
final class SimpleParser {
11+
private final String line;
12+
13+
private int pos;
14+
15+
public SimpleParser(String line) {
16+
this.line = line;
17+
this.pos = 0;
18+
}
19+
20+
void skipToNextValue(boolean acceptDash) {
21+
int limit = line.length();
22+
while (pos < limit && isDelimiter(line.charAt(pos), acceptDash)) {
23+
pos++;
24+
}
25+
}
26+
27+
void skipValue(boolean acceptDash) {
28+
int limit = line.length();
29+
char c = 0;
30+
while (pos < limit && !isDelimiter(line.charAt(pos), acceptDash)) {
31+
pos++;
32+
}
33+
}
34+
35+
long nextLongValue(int base) {
36+
if (base != 10 && base != 16) {
37+
throw new UnsupportedOperationException("Unsupported base: " + base);
38+
}
39+
int limit = line.length();
40+
skipToNextValue(true);
41+
if (pos == limit) {
42+
pos = -1;
43+
return -1;
44+
}
45+
long val = 0;
46+
char c = 0;
47+
while (pos < limit && !isDelimiter(c = line.charAt(pos), true)) {
48+
if (c < '0' || c > '9') {
49+
if (base == 10 || (c < 'a' || c > 'f')) {
50+
skipValue(true);
51+
return -1;
52+
}
53+
}
54+
int digit = c >= 'a' ? 10 + (c - 'a') : (c - '0');
55+
val = val * base + digit;
56+
pos++;
57+
}
58+
return val;
59+
}
60+
61+
String nextStringValue() {
62+
int limit = line.length();
63+
skipToNextValue(false);
64+
if (pos == limit) {
65+
pos = -1;
66+
return null;
67+
}
68+
long val = 0;
69+
StringBuilder sb = new StringBuilder();
70+
char c = 0;
71+
while (pos < limit && !isDelimiter(c = line.charAt(pos), false)) {
72+
sb.append(c);
73+
pos++;
74+
}
75+
return sb.toString();
76+
}
77+
78+
String slurpStringValue() {
79+
int limit = line.length();
80+
skipToNextValue(false);
81+
if (pos == limit) {
82+
pos = -1;
83+
return null;
84+
}
85+
return line.substring(pos).trim();
86+
}
87+
88+
private static boolean isDelimiter(char c, boolean acceptDash) {
89+
return c == ' ' || (acceptDash && c == '-');
90+
}
91+
}

dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryEvent.java

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,120 +19,120 @@
1919
public class SmapEntryEvent extends Event {
2020

2121
@Label("Region Start Address")
22-
private final long startAddress;
22+
long startAddress;
2323

2424
@Label("Region End Address")
25-
private final long endAddress;
25+
long endAddress;
2626

2727
@Label("Region Permissions")
28-
private final String perms;
28+
String perms;
2929

3030
@Label("Offset into mapping")
31-
private final long offset;
31+
long offset;
3232

3333
@Label("Device")
34-
private final String dev;
34+
String dev;
3535

3636
@Label("INode ID")
37-
private final int inodeID;
37+
int inodeID;
3838

3939
@Label("Path associated with mapping")
40-
private final String pathname;
40+
String pathname;
4141

4242
@Label("Mapping Size")
43-
private final long size;
43+
long size;
4444

4545
@Label("Page Size")
46-
private final long kernelPageSize;
46+
long kernelPageSize;
4747

4848
@Label("Memory Management Unit Page Size")
49-
private final long mmuPageSize;
49+
long mmuPageSize;
5050

5151
@Label("Resident Set Size")
5252
@DataAmount
53-
private final long rss;
53+
long rss;
5454

5555
@Label("Proportional Set Size")
5656
@DataAmount
57-
private final long pss;
57+
long pss;
5858

5959
@Label("Dirty Proportional Set Size")
6060
@DataAmount
61-
private final long pssDirty;
61+
long pssDirty;
6262

6363
@Label("Shared Clean Pages")
64-
private final long sharedClean;
64+
long sharedClean;
6565

6666
@Label("Shared Dirty Pages")
6767
@DataAmount
68-
private final long sharedDirty;
68+
long sharedDirty;
6969

7070
@Label("Private Clean Pages")
7171
@DataAmount
72-
private final long privateClean;
72+
long privateClean;
7373

7474
@Label("Private Dirty Pages")
7575
@DataAmount
76-
private final long privateDirty;
76+
long privateDirty;
7777

7878
@Label("Referenced Memory")
79-
private final long referenced;
79+
long referenced;
8080

8181
@Label("Anonymous Memory")
8282
@DataAmount
83-
private final long anonymous;
83+
long anonymous;
8484

8585
@Label("Kernel Same-page Merging")
8686
@DataAmount
87-
private final long ksm;
87+
long ksm;
8888

8989
@Label("Lazily Freed Memory")
9090
@DataAmount
91-
private final long lazyFree;
91+
long lazyFree;
9292

9393
@Label("Anon Huge Pages")
9494
@DataAmount
95-
private final long anonHugePages;
95+
long anonHugePages;
9696

9797
@Label("Shared Memory Huge Pages")
9898
@DataAmount
99-
private final long shmemPmdMapped;
99+
long shmemPmdMapped;
100100

101101
@Label("Page Cache Huge Pages")
102102
@DataAmount
103-
private final long filePmdMapped;
103+
long filePmdMapped;
104104

105105
@Label("Shared Huge Pages")
106106
@DataAmount
107-
private final long sharedHugetlb;
107+
long sharedHugetlb;
108108

109109
@Label("Private Huge Pages")
110110
@DataAmount
111-
private final long privateHugetlb;
111+
long privateHugetlb;
112112

113113
@Label("Swap Size")
114114
@DataAmount
115-
private final long swap;
115+
long swap;
116116

117117
@Label("Proportional Swap Size")
118118
@DataAmount
119-
private final long swapPss;
119+
long swapPss;
120120

121121
@Label("Locked Memory")
122122
@DataAmount
123-
private final long locked;
123+
long locked;
124124

125125
@Label("THP Eligible")
126-
private final boolean thpEligible;
126+
boolean thpEligible;
127127

128128
@Label("VM Flags")
129-
private final String vmFlags;
129+
String vmFlags;
130130

131131
@Label("Encountered foreign keys")
132-
private final boolean encounteredForeignKeys;
132+
boolean encounteredForeignKeys;
133133

134134
@Label("NMT Category")
135-
private final String nmtCategory;
135+
String nmtCategory;
136136

137137
public SmapEntryEvent() {
138138
startAddress = 0;

0 commit comments

Comments
 (0)