ruby_memprofiler_pprof 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. checksums.yaml +7 -0
  2. data/ext/ruby_memprofiler_pprof/backtrace.c +429 -0
  3. data/ext/ruby_memprofiler_pprof/collector.c +1055 -0
  4. data/ext/ruby_memprofiler_pprof/compat.c +182 -0
  5. data/ext/ruby_memprofiler_pprof/extconf.rb +72 -0
  6. data/ext/ruby_memprofiler_pprof/pprof.upb.c +170 -0
  7. data/ext/ruby_memprofiler_pprof/pprof.upb.h +848 -0
  8. data/ext/ruby_memprofiler_pprof/pprof_out.c +285 -0
  9. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.c +11 -0
  10. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.h +301 -0
  11. data/ext/ruby_memprofiler_pprof/strtab.c +391 -0
  12. data/ext/ruby_memprofiler_pprof/vendor/upb/BUILD +719 -0
  13. data/ext/ruby_memprofiler_pprof/vendor/upb/CONTRIBUTING.md +37 -0
  14. data/ext/ruby_memprofiler_pprof/vendor/upb/DESIGN.md +201 -0
  15. data/ext/ruby_memprofiler_pprof/vendor/upb/LICENSE +26 -0
  16. data/ext/ruby_memprofiler_pprof/vendor/upb/README.md +78 -0
  17. data/ext/ruby_memprofiler_pprof/vendor/upb/WORKSPACE +58 -0
  18. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/BUILD +53 -0
  19. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/amalgamate.py +129 -0
  20. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/build_defs.bzl +160 -0
  21. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/lua.BUILD +127 -0
  22. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/protobuf.patch +54 -0
  23. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/py_proto_library.bzl +137 -0
  24. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/python_downloads.bzl +84 -0
  25. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/system_python.bzl +101 -0
  26. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/upb_proto_library.bzl +388 -0
  27. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/workspace_deps.bzl +89 -0
  28. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD +252 -0
  29. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD.googleapis +54 -0
  30. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/benchmark.cc +333 -0
  31. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/build_defs.bzl +88 -0
  32. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/compare.py +118 -0
  33. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor.proto +888 -0
  34. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor_sv.proto +890 -0
  35. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/empty.proto +6 -0
  36. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_protobuf_binary_cc.py +64 -0
  37. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_synthetic_protos.py +118 -0
  38. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_upb_binary_c.py +65 -0
  39. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/BUILD.bazel +102 -0
  40. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/README.md +23 -0
  41. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/build_defs.bzl +73 -0
  42. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/make_cmakelists.py +340 -0
  43. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test.py +57 -0
  44. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test_lib.py +186 -0
  45. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/render.py +43 -0
  46. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/style-guide.md +65 -0
  47. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/vs-cpp-protos.md +255 -0
  48. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/wrapping-upb.md +444 -0
  49. data/ext/ruby_memprofiler_pprof/vendor/upb/python/BUILD +216 -0
  50. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.c +394 -0
  51. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.h +63 -0
  52. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.c +1694 -0
  53. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.h +80 -0
  54. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.c +704 -0
  55. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.h +114 -0
  56. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.c +650 -0
  57. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.h +48 -0
  58. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/BUILD.bazel +193 -0
  59. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/dist.bzl +190 -0
  60. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.c +247 -0
  61. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.h +39 -0
  62. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.c +522 -0
  63. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.h +66 -0
  64. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.c +1909 -0
  65. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.h +101 -0
  66. data/ext/ruby_memprofiler_pprof/vendor/upb/python/minimal_test.py +183 -0
  67. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/BUILD +70 -0
  68. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/README.md +11 -0
  69. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_database_test_wrapper.py +30 -0
  70. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_pool_test_wrapper.py +45 -0
  71. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_test_wrapper.py +46 -0
  72. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/generator_test_wrapper.py +30 -0
  73. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/json_format_test_wrapper.py +30 -0
  74. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/keywords_test_wrapper.py +30 -0
  75. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_factory_test_wrapper.py +37 -0
  76. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_test_wrapper.py +52 -0
  77. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/proto_builder_test_wrapper.py +32 -0
  78. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/pyproto_test_wrapper.bzl +36 -0
  79. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/reflection_test_wrapper.py +45 -0
  80. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/service_reflection_test_wrapper.py +30 -0
  81. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/symbol_database_test_wrapper.py +30 -0
  82. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_encoding_test_wrapper.py +30 -0
  83. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_format_test_wrapper.py +30 -0
  84. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/unknown_fields_test_wrapper.py +30 -0
  85. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/well_known_types_test_wrapper.py +36 -0
  86. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/wire_format_test_wrapper.py +30 -0
  87. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.c +350 -0
  88. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.h +230 -0
  89. data/ext/ruby_memprofiler_pprof/vendor/upb/python/py_extension.bzl +55 -0
  90. data/ext/ruby_memprofiler_pprof/vendor/upb/python/python_api.h +61 -0
  91. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.c +828 -0
  92. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.h +69 -0
  93. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.c +404 -0
  94. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.h +39 -0
  95. data/ext/ruby_memprofiler_pprof/vendor/upb/python/version_script.lds +6 -0
  96. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/LICENSE +32 -0
  97. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/README.google +9 -0
  98. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/console.lua +156 -0
  99. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/lunit.lua +725 -0
  100. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/BUILD +19 -0
  101. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/LICENSE +21 -0
  102. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/naive.c +92 -0
  103. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-neon.c +157 -0
  104. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-sse.c +170 -0
  105. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/utf8_range.h +9 -0
  106. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/BUILD.bazel +129 -0
  107. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/README.md +8 -0
  108. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/def.c +939 -0
  109. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/lua_proto_library.bzl +138 -0
  110. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/main.c +83 -0
  111. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/msg.c +1118 -0
  112. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test.proto +69 -0
  113. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test_upb.lua +846 -0
  114. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.c +258 -0
  115. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.h +132 -0
  116. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.lua +58 -0
  117. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upbc.cc +134 -0
  118. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.c +192 -0
  119. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.h +174 -0
  120. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb.c +346 -0
  121. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb_failures.txt +1 -0
  122. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.c +1221 -0
  123. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.h +94 -0
  124. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.c +1055 -0
  125. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.h +153 -0
  126. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_internal.h +211 -0
  127. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.c +3262 -0
  128. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.h +414 -0
  129. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.hpp +438 -0
  130. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/empty.proto +1 -0
  131. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.c +604 -0
  132. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.h +71 -0
  133. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/BUILD +13 -0
  134. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/file_descriptor_parsenew_fuzzer.cc +43 -0
  135. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.c +1509 -0
  136. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.h +47 -0
  137. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.c +776 -0
  138. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.h +62 -0
  139. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.c +1147 -0
  140. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.h +189 -0
  141. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.hpp +112 -0
  142. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.c +363 -0
  143. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.h +263 -0
  144. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_internal.h +59 -0
  145. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_test.cc +425 -0
  146. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_test.cc +230 -0
  147. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.c +428 -0
  148. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.h +114 -0
  149. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_internal.h +836 -0
  150. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.cc +491 -0
  151. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.proto +195 -0
  152. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_def.inc +261 -0
  153. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_undef.inc +62 -0
  154. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.c +323 -0
  155. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.h +109 -0
  156. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.hpp +37 -0
  157. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table.c +926 -0
  158. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table_internal.h +385 -0
  159. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test.proto +74 -0
  160. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.cc +186 -0
  161. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.proto +12 -0
  162. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_generated_code.cc +977 -0
  163. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_table.cc +580 -0
  164. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.c +472 -0
  165. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.h +64 -0
  166. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.c +362 -0
  167. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.h +378 -0
  168. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.hpp +115 -0
  169. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb_internal.h +68 -0
  170. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/BUILD +121 -0
  171. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/README.md +7 -0
  172. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.c +300 -0
  173. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.h +66 -0
  174. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare_test.cc +236 -0
  175. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.c +572 -0
  176. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.h +62 -0
  177. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_public_import_test.proto +32 -0
  178. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_regular_import_test.proto +36 -0
  179. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.cc +143 -0
  180. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.proto +119 -0
  181. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_weak_import_test.proto +28 -0
  182. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_wweak_import_test.proto +28 -0
  183. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.c +311 -0
  184. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.h +94 -0
  185. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.cc +202 -0
  186. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.proto +48 -0
  187. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/BUILD +78 -0
  188. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.cc +77 -0
  189. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.h +112 -0
  190. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upb.cc +1997 -0
  191. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upbdefs.cc +193 -0
  192. data/lib/ruby_memprofiler_pprof/atfork.rb +77 -0
  193. data/lib/ruby_memprofiler_pprof/block_flusher.rb +61 -0
  194. data/lib/ruby_memprofiler_pprof/file_flusher.rb +45 -0
  195. data/lib/ruby_memprofiler_pprof/profile_app.rb +30 -0
  196. data/lib/ruby_memprofiler_pprof/profile_data.rb +18 -0
  197. data/lib/ruby_memprofiler_pprof/version.rb +5 -0
  198. data/lib/ruby_memprofiler_pprof.rb +8 -0
  199. data/libexec/ruby_memprofiler_pprof_profile +16 -0
  200. metadata +257 -0
@@ -0,0 +1,193 @@
1
+ // Copyright (c) 2009-2021, Google LLC
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are met:
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above copyright
9
+ // notice, this list of conditions and the following disclaimer in the
10
+ // documentation and/or other materials provided with the distribution.
11
+ // * Neither the name of Google LLC nor the
12
+ // names of its contributors may be used to endorse or promote products
13
+ // derived from this software without specific prior written permission.
14
+ //
15
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
+ // ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
19
+ // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #include <memory>
27
+
28
+ #include "google/protobuf/compiler/code_generator.h"
29
+ #include "google/protobuf/compiler/plugin.h"
30
+ #include "google/protobuf/descriptor.h"
31
+ #include "google/protobuf/descriptor.pb.h"
32
+ #include "upbc/common.h"
33
+
34
+ namespace upbc {
35
+ namespace {
36
+
37
+ namespace protoc = ::google::protobuf::compiler;
38
+ namespace protobuf = ::google::protobuf;
39
+
40
+ std::string DefInitSymbol(const protobuf::FileDescriptor* file) {
41
+ return ToCIdent(file->name()) + "_upbdefinit";
42
+ }
43
+
44
+ static std::string DefHeaderFilename(std::string proto_filename) {
45
+ return StripExtension(proto_filename) + ".upbdefs.h";
46
+ }
47
+
48
+ static std::string DefSourceFilename(std::string proto_filename) {
49
+ return StripExtension(proto_filename) + ".upbdefs.c";
50
+ }
51
+
52
+ void GenerateMessageDefAccessor(const protobuf::Descriptor* d, Output& output) {
53
+ output("UPB_INLINE const upb_MessageDef *$0_getmsgdef(upb_DefPool *s) {\n",
54
+ ToCIdent(d->full_name()));
55
+ output(" _upb_DefPool_LoadDefInit(s, &$0);\n", DefInitSymbol(d->file()));
56
+ output(" return upb_DefPool_FindMessageByName(s, \"$0\");\n",
57
+ d->full_name());
58
+ output("}\n");
59
+ output("\n");
60
+
61
+ for (int i = 0; i < d->nested_type_count(); i++) {
62
+ GenerateMessageDefAccessor(d->nested_type(i), output);
63
+ }
64
+ }
65
+
66
+ void WriteDefHeader(const protobuf::FileDescriptor* file, Output& output) {
67
+ EmitFileWarning(file, output);
68
+
69
+ output(
70
+ "#ifndef $0_UPBDEFS_H_\n"
71
+ "#define $0_UPBDEFS_H_\n\n"
72
+ "#include \"upb/def.h\"\n"
73
+ "#include \"upb/port_def.inc\"\n"
74
+ "#ifdef __cplusplus\n"
75
+ "extern \"C\" {\n"
76
+ "#endif\n\n",
77
+ ToPreproc(file->name()));
78
+
79
+ output("#include \"upb/def.h\"\n");
80
+ output("\n");
81
+ output("#include \"upb/port_def.inc\"\n");
82
+ output("\n");
83
+
84
+ output("extern _upb_DefPool_Init $0;\n", DefInitSymbol(file));
85
+ output("\n");
86
+
87
+ for (int i = 0; i < file->message_type_count(); i++) {
88
+ GenerateMessageDefAccessor(file->message_type(i), output);
89
+ }
90
+
91
+ output(
92
+ "#ifdef __cplusplus\n"
93
+ "} /* extern \"C\" */\n"
94
+ "#endif\n"
95
+ "\n"
96
+ "#include \"upb/port_undef.inc\"\n"
97
+ "\n"
98
+ "#endif /* $0_UPBDEFS_H_ */\n",
99
+ ToPreproc(file->name()));
100
+ }
101
+
102
+ void WriteDefSource(const protobuf::FileDescriptor* file, Output& output) {
103
+ EmitFileWarning(file, output);
104
+
105
+ output("#include \"upb/def.h\"\n");
106
+ output("#include \"$0\"\n", DefHeaderFilename(file->name()));
107
+ output("#include \"$0\"\n", HeaderFilename(file));
108
+ output("\n");
109
+
110
+ for (int i = 0; i < file->dependency_count(); i++) {
111
+ output("extern _upb_DefPool_Init $0;\n",
112
+ DefInitSymbol(file->dependency(i)));
113
+ }
114
+
115
+ protobuf::FileDescriptorProto file_proto;
116
+ file->CopyTo(&file_proto);
117
+ std::string file_data;
118
+ file_proto.SerializeToString(&file_data);
119
+
120
+ output("static const char descriptor[$0] = {", file_data.size());
121
+
122
+ // C90 only guarantees that strings can be up to 509 characters, and some
123
+ // implementations have limits here (for example, MSVC only allows 64k:
124
+ // https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/fatal-error-c1091.
125
+ // So we always emit an array instead of a string.
126
+ for (size_t i = 0; i < file_data.size();) {
127
+ for (size_t j = 0; j < 25 && i < file_data.size(); ++i, ++j) {
128
+ output("'$0', ", absl::CEscape(file_data.substr(i, 1)));
129
+ }
130
+ output("\n");
131
+ }
132
+ output("};\n\n");
133
+
134
+ output("static _upb_DefPool_Init *deps[$0] = {\n",
135
+ file->dependency_count() + 1);
136
+ for (int i = 0; i < file->dependency_count(); i++) {
137
+ output(" &$0,\n", DefInitSymbol(file->dependency(i)));
138
+ }
139
+ output(" NULL\n");
140
+ output("};\n");
141
+ output("\n");
142
+
143
+ output("_upb_DefPool_Init $0 = {\n", DefInitSymbol(file));
144
+ output(" deps,\n");
145
+ output(" &$0,\n", FileLayoutName(file));
146
+ output(" \"$0\",\n", file->name());
147
+ output(" UPB_STRINGVIEW_INIT(descriptor, $0)\n", file_data.size());
148
+ output("};\n");
149
+ }
150
+
151
+ class Generator : public protoc::CodeGenerator {
152
+ ~Generator() override {}
153
+ bool Generate(const protobuf::FileDescriptor* file,
154
+ const std::string& parameter, protoc::GeneratorContext* context,
155
+ std::string* error) const override;
156
+ uint64_t GetSupportedFeatures() const override {
157
+ return FEATURE_PROTO3_OPTIONAL;
158
+ }
159
+ };
160
+
161
+ bool Generator::Generate(const protobuf::FileDescriptor* file,
162
+ const std::string& parameter,
163
+ protoc::GeneratorContext* context,
164
+ std::string* error) const {
165
+ std::vector<std::pair<std::string, std::string>> params;
166
+ google::protobuf::compiler::ParseGeneratorParameter(parameter, &params);
167
+
168
+ for (const auto& pair : params) {
169
+ *error = "Unknown parameter: " + pair.first;
170
+ return false;
171
+ }
172
+
173
+ std::unique_ptr<protobuf::io::ZeroCopyOutputStream> h_output_stream(
174
+ context->Open(DefHeaderFilename(file->name())));
175
+ Output h_def_output(h_output_stream.get());
176
+ WriteDefHeader(file, h_def_output);
177
+
178
+ std::unique_ptr<protobuf::io::ZeroCopyOutputStream> c_output_stream(
179
+ context->Open(DefSourceFilename(file->name())));
180
+ Output c_def_output(c_output_stream.get());
181
+ WriteDefSource(file, c_def_output);
182
+
183
+ return true;
184
+ }
185
+
186
+ } // namespace
187
+ } // namespace upbc
188
+
189
+ int main(int argc, char** argv) {
190
+ std::unique_ptr<google::protobuf::compiler::CodeGenerator> generator(
191
+ new upbc::Generator());
192
+ return google::protobuf::compiler::PluginMain(argc, argv, generator.get());
193
+ }
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A mechanism for adding atfork handlers, so that background profile flushing threads
4
+ # can re-create themselves in forked children.
5
+ # Mostly ripped off from the Datadog one here:
6
+ # https://github.com/DataDog/dd-trace-rb/blob/master/lib/datadog/profiling/ext/forking.rb
7
+
8
+ module MemprofilerPprof
9
+ module Atfork
10
+ class Handler
11
+ attr_accessor :block
12
+ attr_accessor :stage
13
+
14
+ def call
15
+ block.call
16
+ end
17
+
18
+ def remove!
19
+ Atfork.at_fork_handlers.reject! { |h| h === self }
20
+ end
21
+ end
22
+
23
+ module_function
24
+ def at_fork_handlers
25
+ @@at_fork_handlers ||= []
26
+ end
27
+
28
+ def at_fork(stage = :prepare, &block)
29
+ handler = Handler.new.tap do |h|
30
+ h.block = block
31
+ h.stage = stage
32
+ end
33
+ at_fork_handlers << handler
34
+ handler
35
+ end
36
+
37
+ def fork
38
+ # If a block is provided, it must be wrapped to trigger callbacks.
39
+ child_block = if block_given?
40
+ proc do
41
+ # Trigger :child callback
42
+ at_fork_handlers.select { |h| h.stage == :child }.each(&:call)
43
+
44
+ # Invoke original block
45
+ yield
46
+ end
47
+ end
48
+
49
+ # Trigger :prepare callback
50
+ at_fork_handlers.select { |h| h.stage == :prepare }.each(&:call)
51
+
52
+ # Start fork
53
+ # If a block is provided, use the wrapped version.
54
+ result = child_block.nil? ? super : super(&child_block)
55
+
56
+ # Trigger correct callbacks depending on whether we're in the parent or child.
57
+ # If we're in the fork, result = nil: trigger child callbacks.
58
+ # If we're in the parent, result = fork PID: trigger parent callbacks.
59
+ # rubocop:disable Style/IfInsideElse
60
+ if result.nil?
61
+ # Trigger :child callback
62
+ at_fork_handlers.select { |h| h.stage == :child }.each(&:call)
63
+ else
64
+ # Trigger :parent callback
65
+ at_fork_handlers.select { |h| h.stage == :parent }.each(&:call)
66
+ end
67
+ # rubocop:enable Style/IfInsideElse
68
+
69
+ # Return PID from #fork
70
+ result
71
+ end
72
+ end
73
+ end
74
+
75
+ ::Process.singleton_class.prepend(MemprofilerPprof::Atfork)
76
+ ::Kernel.singleton_class.prepend(MemprofilerPprof::Atfork)
77
+ TOPLEVEL_BINDING.receiver.class.prepend(MemprofilerPprof::Atfork)
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MemprofilerPprof
4
+ class BlockFlusher
5
+ attr_reader :collector
6
+
7
+ def initialize(collector, interval: 30, logger: nil, on_flush: nil)
8
+ @collector = collector
9
+ @interval = interval
10
+ @logger = logger
11
+ @thread = nil
12
+ @on_flush = on_flush
13
+ end
14
+
15
+ def start!
16
+ stop!
17
+ @thread = Thread.new { flusher_thread }
18
+ @atfork_handler = MemprofilerPprof::Atfork.at_fork(:child, &method(:at_fork_in_child))
19
+ end
20
+
21
+ def stop!
22
+ @thread&.kill
23
+ @thread&.join
24
+ @thread = nil
25
+ @atfork_handler&.remove!
26
+ @atfork_handler = nil
27
+ end
28
+
29
+ def run
30
+ start!
31
+ begin
32
+ yield
33
+ ensure
34
+ stop!
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def flusher_thread
41
+ prev_flush_duration = 0
42
+ loop do
43
+ sleep([0, @interval - prev_flush_duration].max)
44
+ t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
45
+ begin
46
+ profile_data = @collector.flush
47
+ @on_flush&.call(profile_data)
48
+ rescue => e
49
+ @logger&.error("BaseFlusher: failed to flush profiling data: #{e.inspect}")
50
+ ensure
51
+ t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
52
+ prev_flush_duration = (t2 - t1)
53
+ end
54
+ end
55
+ end
56
+
57
+ def at_fork_in_child
58
+ start! if @thread && !@thread.alive?
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'forwardable'
5
+
6
+ module MemprofilerPprof
7
+ class FileFlusher
8
+ extend Forwardable
9
+
10
+ def initialize(collector, pattern: 'tmp/profiles/mem-%{pid}-%{isotime}.pprof', interval: 30, logger: nil)
11
+ @logger = logger
12
+ @pattern = pattern
13
+ @profile_counter = 0
14
+ @block_flusher = BlockFlusher.new(collector, interval: interval, logger: logger, on_flush: method(:on_flush))
15
+ end
16
+
17
+ def_delegators :@block_flusher, :start!, :stop!, :run
18
+ attr_accessor :pattern
19
+
20
+ private
21
+
22
+ def on_flush(profile_data)
23
+ fname = template_string(@pattern)
24
+ dirname = File.dirname(fname)
25
+ FileUtils.mkdir_p dirname
26
+ # Need to explicitly specify the encoding, because some applications might do exotic
27
+ # things to File#default_external/#default_internal that would attempt to convert
28
+ # our protobuf to UTF-8.
29
+ File.write(template_string(@pattern), profile_data.pprof_data, encoding: 'ASCII-8BIT')
30
+ @profile_counter += 1
31
+ rescue => e
32
+ @logger&.error("FileFlusher: failed to flush profiling data: #{e.inspect}")
33
+ end
34
+
35
+ def template_string(tmpl)
36
+ vars = {
37
+ pid: Process.pid,
38
+ isotime: Time.now.iso8601,
39
+ unixtime: Time.now.to_i,
40
+ index: @profile_counter,
41
+ }
42
+ sprintf(tmpl, vars)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file gets loaded by libexec/ruby_memprofiler_pprof_profile as part
4
+ # of RUBYOPTS for a child process. This means we're going to run in some target
5
+ # process _before_ any of the app code is run. Our job here is to set up
6
+ # heap profiling in some default way.
7
+
8
+ require 'logger'
9
+ require 'ruby_memprofiler_pprof'
10
+
11
+ collector = MemprofilerPprof::Collector.new
12
+ collector.sample_rate = ENV.fetch('RUBY_MEMPROFILER_PPROF_SAMPLE_RATE', '1').to_f
13
+ collector.allocation_retain_rate = ENV.fetch('RUBY_MEMPROFILER_PPROF_ALLOC_RETAIN_RATE', '1').to_f
14
+ if ENV.key?('RUBY_MEMPROFILER_PPROF_MAX_ALLOC_SAMPLES')
15
+ collector.max_allocation_samples = ENV['RUBY_MEMPROFILER_PPROF_MAX_ALLOC_SAMPLES'].to_i
16
+ end
17
+ if ENV.key?('RUBY_MEMPROFILER_PPROF_MAX_HEAP_SAMPLES')
18
+ collector.max_heap_samples = ENV['RUBY_MEMPROFILER_PPROF_MAX_HEAP_SAMPLES'].to_i
19
+ end
20
+
21
+ kwargs = {
22
+ logger: Logger.new(STDERR)
23
+ }
24
+ if ENV.key?('RUBY_MEMPROFILER_PPROF_FILE_PATTERN')
25
+ kwargs[:pattern] = ENV['RUBY_MEMPROFILER_PPROF_FILE_PATTERN']
26
+ end
27
+
28
+ flusher = MemprofilerPprof::FileFlusher.new(collector, **kwargs)
29
+ collector.start!
30
+ flusher.start!
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MemprofilerPprof
4
+ class ProfileData
5
+ attr_accessor :pprof_data, :allocation_samples_count, :heap_samples_count,
6
+ :dropped_samples_nolock, :dropped_samples_allocation_bufsize, :dropped_samples_heap_bufsize
7
+
8
+ def to_s
9
+ "<MemprofilerPprof::ProfileData:#{object_id.to_s(16)} (sample counts: " +
10
+ "allocation=#{allocation_samples_count}, " +
11
+ "heap=#{heap_samples_count}, " +
12
+ "dropped_nolock=#{dropped_samples_nolock}, " +
13
+ "dropped_allocation_bufsize=#{dropped_samples_allocation_bufsize}, " +
14
+ "dropped_heap_bufsize=#{dropped_samples_heap_bufsize}" +
15
+ ")>"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MemprofilerPprof
4
+ VERSION = "0.0.1"
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ruby_memprofiler_pprof/version"
4
+ require "ruby_memprofiler_pprof/profile_data"
5
+ require "ruby_memprofiler_pprof/ruby_memprofiler_pprof_ext"
6
+ require 'ruby_memprofiler_pprof/atfork'
7
+ require 'ruby_memprofiler_pprof/block_flusher'
8
+ require 'ruby_memprofiler_pprof/file_flusher'
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Simply starts the provided program as-is, but sets RUBYLIB so that it will be
5
+ # profiled by ruby_memprofiler_pprof.
6
+
7
+ require 'shellwords'
8
+
9
+ base_path = File.expand_path("../lib", __dir__)
10
+ profile_lib = File.join(base_path, 'ruby_memprofiler_pprof', 'profile_app.rb')
11
+ opts = [
12
+ "-I#{Shellwords.escape base_path}",
13
+ "-r#{Shellwords.escape profile_lib}"
14
+ ]
15
+ ENV['RUBYOPT'] = ([ENV.fetch('RUBYOPT', nil)] + opts).compact.join(" ")
16
+ exec *ARGV