pf2 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Cargo.lock +481 -0
- data/Cargo.toml +3 -0
- data/README.md +99 -13
- data/ext/pf2/Cargo.toml +24 -0
- data/ext/pf2/build.rs +3 -0
- data/ext/pf2/extconf.rb +6 -1
- data/ext/pf2/src/lib.rs +14 -0
- data/ext/pf2/src/profile.rs +50 -0
- data/ext/pf2/src/profile_serializer.rs +130 -0
- data/ext/pf2/src/ringbuffer.rs +145 -0
- data/ext/pf2/src/ruby_init.rs +62 -0
- data/ext/pf2/src/sample.rs +45 -0
- data/ext/pf2/src/siginfo_t.c +5 -0
- data/ext/pf2/src/signal_scheduler/configuration.rs +24 -0
- data/ext/pf2/src/signal_scheduler/timer_installer.rs +192 -0
- data/ext/pf2/src/signal_scheduler.rs +242 -0
- data/ext/pf2/src/timer_thread_scheduler.rs +243 -0
- data/ext/pf2/src/util.rs +30 -0
- data/lib/pf2/cli.rb +1 -1
- data/lib/pf2/reporter.rb +36 -11
- data/lib/pf2/version.rb +1 -1
- data/lib/pf2.rb +23 -5
- metadata +34 -5
- data/ext/pf2/pf2.c +0 -246
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1062b7dd7fbbc96396e59dcd189bc63f20a98f81f68f871e8f2b36fb7be82f42
|
4
|
+
data.tar.gz: 8c809750b5e2bca91b0d51a81f583ee31d8a2c63fd9162bc5d4bdbd946915f06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1e1ac1962437b0f2d0fb89cc6d0ef5fa4dca4dec0a47a67500fb30d99ec4f17433f600288a32686d003e3771907273e3c1606a1345db1c658a12e7c1b11b51b
|
7
|
+
data.tar.gz: 90a8c791f2e5a26a68b9bf90c70d302d63ce4ec77058dbfa8dd86e7aed1f13cafb61521ce12cddb42bb43019217a58a4b451edb858417748f32b140313610eef
|
data/CHANGELOG.md
CHANGED
data/Cargo.lock
ADDED
@@ -0,0 +1,481 @@
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
2
|
+
# It is not intended for manual editing.
|
3
|
+
version = 3
|
4
|
+
|
5
|
+
[[package]]
|
6
|
+
name = "aho-corasick"
|
7
|
+
version = "1.1.2"
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
9
|
+
checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
|
10
|
+
dependencies = [
|
11
|
+
"memchr",
|
12
|
+
]
|
13
|
+
|
14
|
+
[[package]]
|
15
|
+
name = "anstream"
|
16
|
+
version = "0.6.11"
|
17
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
18
|
+
checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
|
19
|
+
dependencies = [
|
20
|
+
"anstyle",
|
21
|
+
"anstyle-parse",
|
22
|
+
"anstyle-query",
|
23
|
+
"anstyle-wincon",
|
24
|
+
"colorchoice",
|
25
|
+
"utf8parse",
|
26
|
+
]
|
27
|
+
|
28
|
+
[[package]]
|
29
|
+
name = "anstyle"
|
30
|
+
version = "1.0.4"
|
31
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
32
|
+
checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
|
33
|
+
|
34
|
+
[[package]]
|
35
|
+
name = "anstyle-parse"
|
36
|
+
version = "0.2.3"
|
37
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
38
|
+
checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
|
39
|
+
dependencies = [
|
40
|
+
"utf8parse",
|
41
|
+
]
|
42
|
+
|
43
|
+
[[package]]
|
44
|
+
name = "anstyle-query"
|
45
|
+
version = "1.0.2"
|
46
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
47
|
+
checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
|
48
|
+
dependencies = [
|
49
|
+
"windows-sys",
|
50
|
+
]
|
51
|
+
|
52
|
+
[[package]]
|
53
|
+
name = "anstyle-wincon"
|
54
|
+
version = "3.0.2"
|
55
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
56
|
+
checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
|
57
|
+
dependencies = [
|
58
|
+
"anstyle",
|
59
|
+
"windows-sys",
|
60
|
+
]
|
61
|
+
|
62
|
+
[[package]]
|
63
|
+
name = "bindgen"
|
64
|
+
version = "0.66.1"
|
65
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
66
|
+
checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
|
67
|
+
dependencies = [
|
68
|
+
"bitflags",
|
69
|
+
"cexpr",
|
70
|
+
"clang-sys",
|
71
|
+
"lazy_static",
|
72
|
+
"lazycell",
|
73
|
+
"peeking_take_while",
|
74
|
+
"proc-macro2",
|
75
|
+
"quote",
|
76
|
+
"regex",
|
77
|
+
"rustc-hash",
|
78
|
+
"shlex",
|
79
|
+
"syn",
|
80
|
+
]
|
81
|
+
|
82
|
+
[[package]]
|
83
|
+
name = "bitflags"
|
84
|
+
version = "2.4.1"
|
85
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
86
|
+
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
87
|
+
|
88
|
+
[[package]]
|
89
|
+
name = "cc"
|
90
|
+
version = "1.0.83"
|
91
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
92
|
+
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
|
93
|
+
dependencies = [
|
94
|
+
"libc",
|
95
|
+
]
|
96
|
+
|
97
|
+
[[package]]
|
98
|
+
name = "cexpr"
|
99
|
+
version = "0.6.0"
|
100
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
101
|
+
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
102
|
+
dependencies = [
|
103
|
+
"nom",
|
104
|
+
]
|
105
|
+
|
106
|
+
[[package]]
|
107
|
+
name = "cfg-if"
|
108
|
+
version = "1.0.0"
|
109
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
110
|
+
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
111
|
+
|
112
|
+
[[package]]
|
113
|
+
name = "clang-sys"
|
114
|
+
version = "1.6.1"
|
115
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
116
|
+
checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
|
117
|
+
dependencies = [
|
118
|
+
"glob",
|
119
|
+
"libc",
|
120
|
+
"libloading",
|
121
|
+
]
|
122
|
+
|
123
|
+
[[package]]
|
124
|
+
name = "colorchoice"
|
125
|
+
version = "1.0.0"
|
126
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
127
|
+
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
128
|
+
|
129
|
+
[[package]]
|
130
|
+
name = "env_filter"
|
131
|
+
version = "0.1.0"
|
132
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
133
|
+
checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea"
|
134
|
+
dependencies = [
|
135
|
+
"log",
|
136
|
+
"regex",
|
137
|
+
]
|
138
|
+
|
139
|
+
[[package]]
|
140
|
+
name = "env_logger"
|
141
|
+
version = "0.11.0"
|
142
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
143
|
+
checksum = "9eeb342678d785662fd2514be38c459bb925f02b68dd2a3e0f21d7ef82d979dd"
|
144
|
+
dependencies = [
|
145
|
+
"anstream",
|
146
|
+
"anstyle",
|
147
|
+
"env_filter",
|
148
|
+
"humantime",
|
149
|
+
"log",
|
150
|
+
]
|
151
|
+
|
152
|
+
[[package]]
|
153
|
+
name = "glob"
|
154
|
+
version = "0.3.1"
|
155
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
156
|
+
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
157
|
+
|
158
|
+
[[package]]
|
159
|
+
name = "humantime"
|
160
|
+
version = "2.1.0"
|
161
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
162
|
+
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
163
|
+
|
164
|
+
[[package]]
|
165
|
+
name = "itoa"
|
166
|
+
version = "1.0.9"
|
167
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
168
|
+
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
|
169
|
+
|
170
|
+
[[package]]
|
171
|
+
name = "lazy_static"
|
172
|
+
version = "1.4.0"
|
173
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
174
|
+
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
175
|
+
|
176
|
+
[[package]]
|
177
|
+
name = "lazycell"
|
178
|
+
version = "1.3.0"
|
179
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
180
|
+
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
181
|
+
|
182
|
+
[[package]]
|
183
|
+
name = "libc"
|
184
|
+
version = "0.2.149"
|
185
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
186
|
+
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
|
187
|
+
|
188
|
+
[[package]]
|
189
|
+
name = "libloading"
|
190
|
+
version = "0.7.4"
|
191
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
192
|
+
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
|
193
|
+
dependencies = [
|
194
|
+
"cfg-if",
|
195
|
+
"winapi",
|
196
|
+
]
|
197
|
+
|
198
|
+
[[package]]
|
199
|
+
name = "log"
|
200
|
+
version = "0.4.20"
|
201
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
202
|
+
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
|
203
|
+
|
204
|
+
[[package]]
|
205
|
+
name = "memchr"
|
206
|
+
version = "2.6.4"
|
207
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
208
|
+
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
209
|
+
|
210
|
+
[[package]]
|
211
|
+
name = "minimal-lexical"
|
212
|
+
version = "0.2.1"
|
213
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
214
|
+
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
215
|
+
|
216
|
+
[[package]]
|
217
|
+
name = "nom"
|
218
|
+
version = "7.1.3"
|
219
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
220
|
+
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
221
|
+
dependencies = [
|
222
|
+
"memchr",
|
223
|
+
"minimal-lexical",
|
224
|
+
]
|
225
|
+
|
226
|
+
[[package]]
|
227
|
+
name = "peeking_take_while"
|
228
|
+
version = "0.1.2"
|
229
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
230
|
+
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
|
231
|
+
|
232
|
+
[[package]]
|
233
|
+
name = "pf2"
|
234
|
+
version = "0.1.0"
|
235
|
+
dependencies = [
|
236
|
+
"cc",
|
237
|
+
"env_logger",
|
238
|
+
"libc",
|
239
|
+
"log",
|
240
|
+
"rb-sys",
|
241
|
+
"serde",
|
242
|
+
"serde_derive",
|
243
|
+
"serde_json",
|
244
|
+
]
|
245
|
+
|
246
|
+
[[package]]
|
247
|
+
name = "proc-macro2"
|
248
|
+
version = "1.0.69"
|
249
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
250
|
+
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
|
251
|
+
dependencies = [
|
252
|
+
"unicode-ident",
|
253
|
+
]
|
254
|
+
|
255
|
+
[[package]]
|
256
|
+
name = "quote"
|
257
|
+
version = "1.0.33"
|
258
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
259
|
+
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
260
|
+
dependencies = [
|
261
|
+
"proc-macro2",
|
262
|
+
]
|
263
|
+
|
264
|
+
[[package]]
|
265
|
+
name = "rb-sys"
|
266
|
+
version = "0.9.82"
|
267
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
268
|
+
checksum = "a3e6bf79bf4c711917cacfaf46dfab4314dbfdd89a8ee3ec4b98336cd23f1ebf"
|
269
|
+
dependencies = [
|
270
|
+
"rb-sys-build",
|
271
|
+
]
|
272
|
+
|
273
|
+
[[package]]
|
274
|
+
name = "rb-sys-build"
|
275
|
+
version = "0.9.82"
|
276
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
277
|
+
checksum = "5482a1ed4cde58dddaf162b6aebcb5c25645822547832b8be101f2acd40bcdd6"
|
278
|
+
dependencies = [
|
279
|
+
"bindgen",
|
280
|
+
"lazy_static",
|
281
|
+
"proc-macro2",
|
282
|
+
"quote",
|
283
|
+
"regex",
|
284
|
+
"shell-words",
|
285
|
+
"syn",
|
286
|
+
]
|
287
|
+
|
288
|
+
[[package]]
|
289
|
+
name = "regex"
|
290
|
+
version = "1.10.2"
|
291
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
292
|
+
checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
|
293
|
+
dependencies = [
|
294
|
+
"aho-corasick",
|
295
|
+
"memchr",
|
296
|
+
"regex-automata",
|
297
|
+
"regex-syntax",
|
298
|
+
]
|
299
|
+
|
300
|
+
[[package]]
|
301
|
+
name = "regex-automata"
|
302
|
+
version = "0.4.3"
|
303
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
304
|
+
checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
|
305
|
+
dependencies = [
|
306
|
+
"aho-corasick",
|
307
|
+
"memchr",
|
308
|
+
"regex-syntax",
|
309
|
+
]
|
310
|
+
|
311
|
+
[[package]]
|
312
|
+
name = "regex-syntax"
|
313
|
+
version = "0.8.2"
|
314
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
315
|
+
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
316
|
+
|
317
|
+
[[package]]
|
318
|
+
name = "rustc-hash"
|
319
|
+
version = "1.1.0"
|
320
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
321
|
+
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
322
|
+
|
323
|
+
[[package]]
|
324
|
+
name = "ryu"
|
325
|
+
version = "1.0.15"
|
326
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
327
|
+
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
328
|
+
|
329
|
+
[[package]]
|
330
|
+
name = "serde"
|
331
|
+
version = "1.0.189"
|
332
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
333
|
+
checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537"
|
334
|
+
dependencies = [
|
335
|
+
"serde_derive",
|
336
|
+
]
|
337
|
+
|
338
|
+
[[package]]
|
339
|
+
name = "serde_derive"
|
340
|
+
version = "1.0.189"
|
341
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
342
|
+
checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5"
|
343
|
+
dependencies = [
|
344
|
+
"proc-macro2",
|
345
|
+
"quote",
|
346
|
+
"syn",
|
347
|
+
]
|
348
|
+
|
349
|
+
[[package]]
|
350
|
+
name = "serde_json"
|
351
|
+
version = "1.0.107"
|
352
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
353
|
+
checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
|
354
|
+
dependencies = [
|
355
|
+
"itoa",
|
356
|
+
"ryu",
|
357
|
+
"serde",
|
358
|
+
]
|
359
|
+
|
360
|
+
[[package]]
|
361
|
+
name = "shell-words"
|
362
|
+
version = "1.1.0"
|
363
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
364
|
+
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
|
365
|
+
|
366
|
+
[[package]]
|
367
|
+
name = "shlex"
|
368
|
+
version = "1.2.0"
|
369
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
370
|
+
checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
|
371
|
+
|
372
|
+
[[package]]
|
373
|
+
name = "syn"
|
374
|
+
version = "2.0.38"
|
375
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
376
|
+
checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
|
377
|
+
dependencies = [
|
378
|
+
"proc-macro2",
|
379
|
+
"quote",
|
380
|
+
"unicode-ident",
|
381
|
+
]
|
382
|
+
|
383
|
+
[[package]]
|
384
|
+
name = "unicode-ident"
|
385
|
+
version = "1.0.12"
|
386
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
387
|
+
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
388
|
+
|
389
|
+
[[package]]
|
390
|
+
name = "utf8parse"
|
391
|
+
version = "0.2.1"
|
392
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
393
|
+
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
|
394
|
+
|
395
|
+
[[package]]
|
396
|
+
name = "winapi"
|
397
|
+
version = "0.3.9"
|
398
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
399
|
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
400
|
+
dependencies = [
|
401
|
+
"winapi-i686-pc-windows-gnu",
|
402
|
+
"winapi-x86_64-pc-windows-gnu",
|
403
|
+
]
|
404
|
+
|
405
|
+
[[package]]
|
406
|
+
name = "winapi-i686-pc-windows-gnu"
|
407
|
+
version = "0.4.0"
|
408
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
409
|
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
410
|
+
|
411
|
+
[[package]]
|
412
|
+
name = "winapi-x86_64-pc-windows-gnu"
|
413
|
+
version = "0.4.0"
|
414
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
415
|
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
416
|
+
|
417
|
+
[[package]]
|
418
|
+
name = "windows-sys"
|
419
|
+
version = "0.52.0"
|
420
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
421
|
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
422
|
+
dependencies = [
|
423
|
+
"windows-targets",
|
424
|
+
]
|
425
|
+
|
426
|
+
[[package]]
|
427
|
+
name = "windows-targets"
|
428
|
+
version = "0.52.0"
|
429
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
430
|
+
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
|
431
|
+
dependencies = [
|
432
|
+
"windows_aarch64_gnullvm",
|
433
|
+
"windows_aarch64_msvc",
|
434
|
+
"windows_i686_gnu",
|
435
|
+
"windows_i686_msvc",
|
436
|
+
"windows_x86_64_gnu",
|
437
|
+
"windows_x86_64_gnullvm",
|
438
|
+
"windows_x86_64_msvc",
|
439
|
+
]
|
440
|
+
|
441
|
+
[[package]]
|
442
|
+
name = "windows_aarch64_gnullvm"
|
443
|
+
version = "0.52.0"
|
444
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
445
|
+
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
|
446
|
+
|
447
|
+
[[package]]
|
448
|
+
name = "windows_aarch64_msvc"
|
449
|
+
version = "0.52.0"
|
450
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
451
|
+
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
|
452
|
+
|
453
|
+
[[package]]
|
454
|
+
name = "windows_i686_gnu"
|
455
|
+
version = "0.52.0"
|
456
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
457
|
+
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
|
458
|
+
|
459
|
+
[[package]]
|
460
|
+
name = "windows_i686_msvc"
|
461
|
+
version = "0.52.0"
|
462
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
463
|
+
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
|
464
|
+
|
465
|
+
[[package]]
|
466
|
+
name = "windows_x86_64_gnu"
|
467
|
+
version = "0.52.0"
|
468
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
469
|
+
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
|
470
|
+
|
471
|
+
[[package]]
|
472
|
+
name = "windows_x86_64_gnullvm"
|
473
|
+
version = "0.52.0"
|
474
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
475
|
+
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
|
476
|
+
|
477
|
+
[[package]]
|
478
|
+
name = "windows_x86_64_msvc"
|
479
|
+
version = "0.52.0"
|
480
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
481
|
+
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
data/Cargo.toml
ADDED
data/README.md
CHANGED
@@ -1,26 +1,112 @@
|
|
1
|
-
|
1
|
+
Pf2
|
2
|
+
===========
|
2
3
|
|
3
|
-
A sampling-based profiler for Ruby.
|
4
|
-
Works only on a patched version of CRuby (MRI) at the moment.
|
4
|
+
A experimental sampling-based profiler for Ruby 3.3+.
|
5
5
|
|
6
|
-
|
6
|
+
Notable Capabilites
|
7
|
+
--------
|
7
8
|
|
8
|
-
|
9
|
+
- Can accurately track multiple Ruby Threads' activity
|
10
|
+
- Sampling interval can be set based on per-Thread CPU usage
|
9
11
|
|
10
|
-
|
12
|
+
Usage
|
13
|
+
--------
|
11
14
|
|
12
|
-
|
15
|
+
### Profiling
|
13
16
|
|
14
|
-
|
17
|
+
Pf2 will collect samples every 10 ms of wall time by default.
|
15
18
|
|
16
|
-
|
19
|
+
```ruby
|
20
|
+
# Specify Ruby Threads to track in the first argument.
|
21
|
+
# New Ruby Threads will be tracked if the second argument is true.
|
22
|
+
Pf2.start([Thread.current], false)
|
23
|
+
your_code_here() # will be profiled
|
24
|
+
Thread.new { threaded_code() } # will also be profiled if second argument is true
|
17
25
|
|
18
|
-
|
26
|
+
# Stop profiling and save the profile for visualization
|
27
|
+
profile = Pf2.stop
|
28
|
+
File.write("my_program.pf2profile", profile)
|
29
|
+
```
|
19
30
|
|
20
|
-
|
31
|
+
Alternatively, you may provide a code block to profile.
|
21
32
|
|
22
|
-
|
33
|
+
```ruby
|
34
|
+
profile = Pf2.profile do
|
35
|
+
your_code_here() # will be profiled
|
36
|
+
Thread.new { threaded_code() } # will also be profiled
|
37
|
+
end
|
23
38
|
|
24
|
-
|
39
|
+
# Save the profile for visualization
|
40
|
+
File.write("my_program.pf2profile", profile)
|
41
|
+
```
|
42
|
+
|
43
|
+
### Reporting / Visualization
|
44
|
+
|
45
|
+
Profiles can be visualized using the [Firefox Profiler](https://profiler.firefox.com/).
|
46
|
+
|
47
|
+
```console
|
48
|
+
$ pf2 -o report.json my_program.pf2profile
|
49
|
+
```
|
50
|
+
|
51
|
+
### Configuration
|
52
|
+
|
53
|
+
(TBD)
|
54
|
+
|
55
|
+
Overhead
|
56
|
+
--------
|
57
|
+
|
58
|
+
While Pf2 aims to be non-disturbulent as much as possible, a small overhead still is incured.
|
59
|
+
|
60
|
+
(TBD)
|
61
|
+
|
62
|
+
Limitations
|
63
|
+
--------
|
64
|
+
|
65
|
+
Pf2 cannot properly track program activity in some known cases. I'm working to remove these limtations, so stay tuned.
|
66
|
+
|
67
|
+
- Program execution in forked processes
|
68
|
+
- Workarounds available for Puma
|
69
|
+
- Program execution in Fibers
|
70
|
+
- Program execution when MaNy (`RUBY_MN_THREADS`) is enabled
|
71
|
+
|
72
|
+
Internals
|
73
|
+
--------
|
74
|
+
|
75
|
+
### Sampling
|
76
|
+
|
77
|
+
Pf2 is a _sampling profiler_. This means that Pf2 collects _samples_ of program execution periodically, instead of tracing every action (e.g. method invocations and returns).
|
78
|
+
|
79
|
+
Pf2 uses the `rb_profile_thread_frames()` API for sampling. When to do so is controlled by _Schedulers_, described in the following section.
|
80
|
+
|
81
|
+
### Schedulers
|
82
|
+
|
83
|
+
Schedulers determine when to execute sample collection, based on configuration (time mode and interval). Pf2 has two schedulers available.
|
84
|
+
|
85
|
+
#### SignalScheduler (Linux-only)
|
86
|
+
|
87
|
+
The first is the `SignalScheduler`, based on POSIX timers. Pf2 will use this scheduler when possible. SignalScheduler creates a POSIX timer for each Ruby Thread (the underlying pthread to be more accurate) using `timer_create(3)`. This leaves the actual time-keeping to the OS, which is capable of tracking accurate per-thread CPU time usage.
|
88
|
+
|
89
|
+
When the specified interval has arrived (the timer has _expired_), the OS delivers us a SIGALRM (note: Unlike `setitimer(2)`, `timer_create(3)` allows us to choose which signal to be delivered, and Pf2 uses SIGALRM regardless of time mode). This is why the scheduler is named SignalScheduler.
|
90
|
+
|
91
|
+
Signals are directed to Ruby Threads' underlying pthread, effectively "pausing" the Thread's activity. This routing is done using `SIGEV_THREAD_ID`, which is a Linux-only feature. Sample collection is done in the signal handler, which is expected to be more _accurate_, capturing the paused Thread's activity.
|
92
|
+
|
93
|
+
This scheduler heavily relies on Ruby's 1:N Thread model (1 Ruby Threads is strongly tied to a native pthread). It will not work properly in MaNy (`RUBY_MN_THREADS=1`).
|
94
|
+
|
95
|
+
#### TimerThreadScheduler
|
96
|
+
|
97
|
+
Another scheduler is the `TimerThreadScheduler`, which maintains a time-keeping thread by itself. A new native thread (pthread on Linux/macOS) will be created, and an infinite loop will be run inside. After `sleep(2)`-ing for the specified interval time, sampling will be queued using Ruby's Postponed Job API.
|
98
|
+
|
99
|
+
This scheduler is wall-time only, and does not support CPU-time based profiling.
|
100
|
+
|
101
|
+
Future Plans
|
102
|
+
--------
|
103
|
+
|
104
|
+
- Remove known limitations, if possible
|
105
|
+
- Implement a "tracing" scheduler, using the C TracePoint API
|
106
|
+
- more
|
107
|
+
|
108
|
+
|
109
|
+
License
|
110
|
+
--------
|
25
111
|
|
26
112
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/ext/pf2/Cargo.toml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
[package]
|
2
|
+
name = "pf2"
|
3
|
+
version = "0.1.0"
|
4
|
+
edition = "2021"
|
5
|
+
authors = ["Daisuke Aritomo <osyoyu@osyoyu.com>"]
|
6
|
+
publish = false
|
7
|
+
|
8
|
+
[lib]
|
9
|
+
crate-type = ["cdylib"]
|
10
|
+
|
11
|
+
[dependencies]
|
12
|
+
env_logger = { version = "0.11.0", optional = true }
|
13
|
+
libc = "0.2.149"
|
14
|
+
log = "0.4.20"
|
15
|
+
rb-sys = { version = "0.9.82", features = ["stable-api", "stable-api-compiled-testing"] } # using stable-api-compiled-testing for generating bindings from Ruby source
|
16
|
+
serde = "1.0.189"
|
17
|
+
serde_derive = "1.0.189"
|
18
|
+
serde_json = "1.0.107"
|
19
|
+
|
20
|
+
[build-dependencies]
|
21
|
+
cc = "1.0.83"
|
22
|
+
|
23
|
+
[features]
|
24
|
+
debug = ["env_logger"]
|
data/ext/pf2/build.rs
ADDED
data/ext/pf2/extconf.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
require 'mkmf'
|
2
|
+
require 'rb_sys/mkmf'
|
2
3
|
|
3
4
|
abort 'missing rb_profile_thread_frames()' unless have_func 'rb_profile_thread_frames'
|
4
5
|
|
5
|
-
|
6
|
+
create_rust_makefile 'pf2/pf2' do |r|
|
7
|
+
if ENV['PF2_FEATURES']
|
8
|
+
r.features = ENV['PF2_FEATURES'].split(",")
|
9
|
+
end
|
10
|
+
end
|
data/ext/pf2/src/lib.rs
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
extern crate serde;
|
2
|
+
#[macro_use]
|
3
|
+
extern crate serde_derive;
|
4
|
+
|
5
|
+
mod ruby_init;
|
6
|
+
|
7
|
+
mod profile;
|
8
|
+
mod profile_serializer;
|
9
|
+
mod ringbuffer;
|
10
|
+
mod sample;
|
11
|
+
#[cfg(target_os = "linux")]
|
12
|
+
mod signal_scheduler;
|
13
|
+
mod timer_thread_scheduler;
|
14
|
+
mod util;
|