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.
- checksums.yaml +7 -0
- data/ext/ruby_memprofiler_pprof/backtrace.c +429 -0
- data/ext/ruby_memprofiler_pprof/collector.c +1055 -0
- data/ext/ruby_memprofiler_pprof/compat.c +182 -0
- data/ext/ruby_memprofiler_pprof/extconf.rb +72 -0
- data/ext/ruby_memprofiler_pprof/pprof.upb.c +170 -0
- data/ext/ruby_memprofiler_pprof/pprof.upb.h +848 -0
- data/ext/ruby_memprofiler_pprof/pprof_out.c +285 -0
- data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.c +11 -0
- data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.h +301 -0
- data/ext/ruby_memprofiler_pprof/strtab.c +391 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/BUILD +719 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/CONTRIBUTING.md +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/DESIGN.md +201 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/LICENSE +26 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/README.md +78 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/WORKSPACE +58 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/BUILD +53 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/amalgamate.py +129 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/build_defs.bzl +160 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/lua.BUILD +127 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/protobuf.patch +54 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/py_proto_library.bzl +137 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/python_downloads.bzl +84 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/system_python.bzl +101 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/upb_proto_library.bzl +388 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/workspace_deps.bzl +89 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD +252 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD.googleapis +54 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/benchmark.cc +333 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/build_defs.bzl +88 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/compare.py +118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor.proto +888 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor_sv.proto +890 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/empty.proto +6 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_protobuf_binary_cc.py +64 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_synthetic_protos.py +118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_upb_binary_c.py +65 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/BUILD.bazel +102 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/README.md +23 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/build_defs.bzl +73 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/make_cmakelists.py +340 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test.py +57 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test_lib.py +186 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/render.py +43 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/style-guide.md +65 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/vs-cpp-protos.md +255 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/wrapping-upb.md +444 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/BUILD +216 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.c +394 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.h +63 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.c +1694 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.h +80 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.c +704 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.h +114 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.c +650 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.h +48 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/BUILD.bazel +193 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/dist.bzl +190 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.c +247 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.h +39 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.c +522 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.h +66 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.c +1909 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.h +101 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/minimal_test.py +183 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/BUILD +70 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/README.md +11 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_database_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_pool_test_wrapper.py +45 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_test_wrapper.py +46 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/generator_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/json_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/keywords_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_factory_test_wrapper.py +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_test_wrapper.py +52 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/proto_builder_test_wrapper.py +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/pyproto_test_wrapper.bzl +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/reflection_test_wrapper.py +45 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/service_reflection_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/symbol_database_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_encoding_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/unknown_fields_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/well_known_types_test_wrapper.py +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/wire_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.c +350 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.h +230 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/py_extension.bzl +55 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/python_api.h +61 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.c +828 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.h +69 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.c +404 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.h +39 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/version_script.lds +6 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/LICENSE +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/README.google +9 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/console.lua +156 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/lunit.lua +725 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/BUILD +19 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/LICENSE +21 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/naive.c +92 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-neon.c +157 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-sse.c +170 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/utf8_range.h +9 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/BUILD.bazel +129 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/README.md +8 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/def.c +939 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/lua_proto_library.bzl +138 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/main.c +83 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/msg.c +1118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test.proto +69 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test_upb.lua +846 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.c +258 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.h +132 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.lua +58 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upbc.cc +134 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.c +192 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.h +174 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb.c +346 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb_failures.txt +1 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.c +1221 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.h +94 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.c +1055 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.h +153 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_internal.h +211 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.c +3262 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.h +414 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.hpp +438 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/empty.proto +1 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.c +604 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.h +71 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/BUILD +13 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/file_descriptor_parsenew_fuzzer.cc +43 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.c +1509 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.h +47 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.c +776 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.h +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.c +1147 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.h +189 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.hpp +112 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.c +363 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.h +263 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_internal.h +59 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_test.cc +425 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_test.cc +230 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.c +428 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.h +114 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_internal.h +836 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.cc +491 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.proto +195 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_def.inc +261 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_undef.inc +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.c +323 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.h +109 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.hpp +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table.c +926 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table_internal.h +385 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test.proto +74 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.cc +186 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.proto +12 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_generated_code.cc +977 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_table.cc +580 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.c +472 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.h +64 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.c +362 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.h +378 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.hpp +115 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb_internal.h +68 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/BUILD +121 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/README.md +7 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.c +300 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.h +66 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare_test.cc +236 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.c +572 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.h +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_public_import_test.proto +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_regular_import_test.proto +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.cc +143 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.proto +119 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_weak_import_test.proto +28 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_wweak_import_test.proto +28 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.c +311 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.h +94 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.cc +202 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.proto +48 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/BUILD +78 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.cc +77 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.h +112 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upb.cc +1997 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upbdefs.cc +193 -0
- data/lib/ruby_memprofiler_pprof/atfork.rb +77 -0
- data/lib/ruby_memprofiler_pprof/block_flusher.rb +61 -0
- data/lib/ruby_memprofiler_pprof/file_flusher.rb +45 -0
- data/lib/ruby_memprofiler_pprof/profile_app.rb +30 -0
- data/lib/ruby_memprofiler_pprof/profile_data.rb +18 -0
- data/lib/ruby_memprofiler_pprof/version.rb +5 -0
- data/lib/ruby_memprofiler_pprof.rb +8 -0
- data/libexec/ruby_memprofiler_pprof_profile +16 -0
- metadata +257 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2009-2021, Google LLC
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
|
7
|
+
* * Redistributions of source code must retain the above copyright
|
|
8
|
+
* notice, this list of conditions and the following disclaimer.
|
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright
|
|
10
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
11
|
+
* documentation and/or other materials provided with the distribution.
|
|
12
|
+
* * Neither the name of Google LLC nor the
|
|
13
|
+
* names of its contributors may be used to endorse or promote products
|
|
14
|
+
* derived from this software without specific prior written permission.
|
|
15
|
+
*
|
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
|
|
20
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
21
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
22
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
23
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
25
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#include <errno.h>
|
|
29
|
+
#include <float.h>
|
|
30
|
+
#include <stdarg.h>
|
|
31
|
+
#include <stddef.h>
|
|
32
|
+
#include <stdint.h>
|
|
33
|
+
#include <stdio.h>
|
|
34
|
+
#include <stdlib.h>
|
|
35
|
+
#include <string.h>
|
|
36
|
+
|
|
37
|
+
#include "upb/upb_internal.h"
|
|
38
|
+
|
|
39
|
+
// Must be last.
|
|
40
|
+
#include "upb/port_def.inc"
|
|
41
|
+
|
|
42
|
+
/* upb_Status *****************************************************************/
|
|
43
|
+
|
|
44
|
+
void upb_Status_Clear(upb_Status* status) {
|
|
45
|
+
if (!status) return;
|
|
46
|
+
status->ok = true;
|
|
47
|
+
status->msg[0] = '\0';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
bool upb_Status_IsOk(const upb_Status* status) { return status->ok; }
|
|
51
|
+
|
|
52
|
+
const char* upb_Status_ErrorMessage(const upb_Status* status) {
|
|
53
|
+
return status->msg;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void upb_Status_SetErrorMessage(upb_Status* status, const char* msg) {
|
|
57
|
+
if (!status) return;
|
|
58
|
+
status->ok = false;
|
|
59
|
+
strncpy(status->msg, msg, _kUpb_Status_MaxMessage - 1);
|
|
60
|
+
status->msg[_kUpb_Status_MaxMessage - 1] = '\0';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void upb_Status_SetErrorFormat(upb_Status* status, const char* fmt, ...) {
|
|
64
|
+
va_list args;
|
|
65
|
+
va_start(args, fmt);
|
|
66
|
+
upb_Status_VSetErrorFormat(status, fmt, args);
|
|
67
|
+
va_end(args);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void upb_Status_VSetErrorFormat(upb_Status* status, const char* fmt,
|
|
71
|
+
va_list args) {
|
|
72
|
+
if (!status) return;
|
|
73
|
+
status->ok = false;
|
|
74
|
+
vsnprintf(status->msg, sizeof(status->msg), fmt, args);
|
|
75
|
+
status->msg[_kUpb_Status_MaxMessage - 1] = '\0';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void upb_Status_VAppendErrorFormat(upb_Status* status, const char* fmt,
|
|
79
|
+
va_list args) {
|
|
80
|
+
size_t len;
|
|
81
|
+
if (!status) return;
|
|
82
|
+
status->ok = false;
|
|
83
|
+
len = strlen(status->msg);
|
|
84
|
+
vsnprintf(status->msg + len, sizeof(status->msg) - len, fmt, args);
|
|
85
|
+
status->msg[_kUpb_Status_MaxMessage - 1] = '\0';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* upb_alloc ******************************************************************/
|
|
89
|
+
|
|
90
|
+
static void* upb_global_allocfunc(upb_alloc* alloc, void* ptr, size_t oldsize,
|
|
91
|
+
size_t size) {
|
|
92
|
+
UPB_UNUSED(alloc);
|
|
93
|
+
UPB_UNUSED(oldsize);
|
|
94
|
+
if (size == 0) {
|
|
95
|
+
free(ptr);
|
|
96
|
+
return NULL;
|
|
97
|
+
} else {
|
|
98
|
+
return realloc(ptr, size);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static uint32_t* upb_cleanup_pointer(uintptr_t cleanup_metadata) {
|
|
103
|
+
return (uint32_t*)(cleanup_metadata & ~0x1);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static bool upb_cleanup_has_initial_block(uintptr_t cleanup_metadata) {
|
|
107
|
+
return cleanup_metadata & 0x1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static uintptr_t upb_cleanup_metadata(uint32_t* cleanup,
|
|
111
|
+
bool has_initial_block) {
|
|
112
|
+
return (uintptr_t)cleanup | has_initial_block;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
upb_alloc upb_alloc_global = {&upb_global_allocfunc};
|
|
116
|
+
|
|
117
|
+
/* upb_Arena ******************************************************************/
|
|
118
|
+
|
|
119
|
+
/* Be conservative and choose 16 in case anyone is using SSE. */
|
|
120
|
+
|
|
121
|
+
struct mem_block {
|
|
122
|
+
struct mem_block* next;
|
|
123
|
+
uint32_t size;
|
|
124
|
+
uint32_t cleanups;
|
|
125
|
+
/* Data follows. */
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
typedef struct cleanup_ent {
|
|
129
|
+
upb_CleanupFunc* cleanup;
|
|
130
|
+
void* ud;
|
|
131
|
+
} cleanup_ent;
|
|
132
|
+
|
|
133
|
+
static const size_t memblock_reserve = UPB_ALIGN_UP(sizeof(mem_block), 16);
|
|
134
|
+
|
|
135
|
+
static upb_Arena* arena_findroot(upb_Arena* a) {
|
|
136
|
+
/* Path splitting keeps time complexity down, see:
|
|
137
|
+
* https://en.wikipedia.org/wiki/Disjoint-set_data_structure */
|
|
138
|
+
while (a->parent != a) {
|
|
139
|
+
upb_Arena* next = a->parent;
|
|
140
|
+
a->parent = next->parent;
|
|
141
|
+
a = next;
|
|
142
|
+
}
|
|
143
|
+
return a;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static void upb_Arena_addblock(upb_Arena* a, upb_Arena* root, void* ptr,
|
|
147
|
+
size_t size) {
|
|
148
|
+
mem_block* block = ptr;
|
|
149
|
+
|
|
150
|
+
/* The block is for arena |a|, but should appear in the freelist of |root|. */
|
|
151
|
+
block->next = root->freelist;
|
|
152
|
+
block->size = (uint32_t)size;
|
|
153
|
+
block->cleanups = 0;
|
|
154
|
+
root->freelist = block;
|
|
155
|
+
a->last_size = block->size;
|
|
156
|
+
if (!root->freelist_tail) root->freelist_tail = block;
|
|
157
|
+
|
|
158
|
+
a->head.ptr = UPB_PTR_AT(block, memblock_reserve, char);
|
|
159
|
+
a->head.end = UPB_PTR_AT(block, size, char);
|
|
160
|
+
a->cleanup_metadata = upb_cleanup_metadata(
|
|
161
|
+
&block->cleanups, upb_cleanup_has_initial_block(a->cleanup_metadata));
|
|
162
|
+
|
|
163
|
+
UPB_POISON_MEMORY_REGION(a->head.ptr, a->head.end - a->head.ptr);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static bool upb_Arena_Allocblock(upb_Arena* a, size_t size) {
|
|
167
|
+
upb_Arena* root = arena_findroot(a);
|
|
168
|
+
size_t block_size = UPB_MAX(size, a->last_size * 2) + memblock_reserve;
|
|
169
|
+
mem_block* block = upb_malloc(root->block_alloc, block_size);
|
|
170
|
+
|
|
171
|
+
if (!block) return false;
|
|
172
|
+
upb_Arena_addblock(a, root, block, block_size);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
void* _upb_Arena_SlowMalloc(upb_Arena* a, size_t size) {
|
|
177
|
+
if (!upb_Arena_Allocblock(a, size)) return NULL; /* Out of memory. */
|
|
178
|
+
UPB_ASSERT(_upb_ArenaHas(a) >= size);
|
|
179
|
+
return upb_Arena_Malloc(a, size);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
static void* upb_Arena_doalloc(upb_alloc* alloc, void* ptr, size_t oldsize,
|
|
183
|
+
size_t size) {
|
|
184
|
+
upb_Arena* a = (upb_Arena*)alloc; /* upb_alloc is initial member. */
|
|
185
|
+
return upb_Arena_Realloc(a, ptr, oldsize, size);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Public Arena API ***********************************************************/
|
|
189
|
+
|
|
190
|
+
upb_Arena* arena_initslow(void* mem, size_t n, upb_alloc* alloc) {
|
|
191
|
+
const size_t first_block_overhead = sizeof(upb_Arena) + memblock_reserve;
|
|
192
|
+
upb_Arena* a;
|
|
193
|
+
|
|
194
|
+
/* We need to malloc the initial block. */
|
|
195
|
+
n = first_block_overhead + 256;
|
|
196
|
+
if (!alloc || !(mem = upb_malloc(alloc, n))) {
|
|
197
|
+
return NULL;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
a = UPB_PTR_AT(mem, n - sizeof(*a), upb_Arena);
|
|
201
|
+
n -= sizeof(*a);
|
|
202
|
+
|
|
203
|
+
a->head.alloc.func = &upb_Arena_doalloc;
|
|
204
|
+
a->block_alloc = alloc;
|
|
205
|
+
a->parent = a;
|
|
206
|
+
a->refcount = 1;
|
|
207
|
+
a->freelist = NULL;
|
|
208
|
+
a->freelist_tail = NULL;
|
|
209
|
+
a->cleanup_metadata = upb_cleanup_metadata(NULL, false);
|
|
210
|
+
|
|
211
|
+
upb_Arena_addblock(a, a, mem, n);
|
|
212
|
+
|
|
213
|
+
return a;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc) {
|
|
217
|
+
upb_Arena* a;
|
|
218
|
+
|
|
219
|
+
if (n) {
|
|
220
|
+
/* Align initial pointer up so that we return properly-aligned pointers. */
|
|
221
|
+
void* aligned = (void*)UPB_ALIGN_UP((uintptr_t)mem, 16);
|
|
222
|
+
size_t delta = (uintptr_t)aligned - (uintptr_t)mem;
|
|
223
|
+
n = delta <= n ? n - delta : 0;
|
|
224
|
+
mem = aligned;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* Round block size down to alignof(*a) since we will allocate the arena
|
|
228
|
+
* itself at the end. */
|
|
229
|
+
n = UPB_ALIGN_DOWN(n, UPB_ALIGN_OF(upb_Arena));
|
|
230
|
+
|
|
231
|
+
if (UPB_UNLIKELY(n < sizeof(upb_Arena))) {
|
|
232
|
+
return arena_initslow(mem, n, alloc);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
a = UPB_PTR_AT(mem, n - sizeof(*a), upb_Arena);
|
|
236
|
+
|
|
237
|
+
a->head.alloc.func = &upb_Arena_doalloc;
|
|
238
|
+
a->block_alloc = alloc;
|
|
239
|
+
a->parent = a;
|
|
240
|
+
a->refcount = 1;
|
|
241
|
+
a->last_size = UPB_MAX(128, n);
|
|
242
|
+
a->head.ptr = mem;
|
|
243
|
+
a->head.end = UPB_PTR_AT(mem, n - sizeof(*a), char);
|
|
244
|
+
a->freelist = NULL;
|
|
245
|
+
a->cleanup_metadata = upb_cleanup_metadata(NULL, true);
|
|
246
|
+
|
|
247
|
+
return a;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
static void arena_dofree(upb_Arena* a) {
|
|
251
|
+
mem_block* block = a->freelist;
|
|
252
|
+
UPB_ASSERT(a->parent == a);
|
|
253
|
+
UPB_ASSERT(a->refcount == 0);
|
|
254
|
+
|
|
255
|
+
while (block) {
|
|
256
|
+
/* Load first since we are deleting block. */
|
|
257
|
+
mem_block* next = block->next;
|
|
258
|
+
|
|
259
|
+
if (block->cleanups > 0) {
|
|
260
|
+
cleanup_ent* end = UPB_PTR_AT(block, block->size, void);
|
|
261
|
+
cleanup_ent* ptr = end - block->cleanups;
|
|
262
|
+
|
|
263
|
+
for (; ptr < end; ptr++) {
|
|
264
|
+
ptr->cleanup(ptr->ud);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
upb_free(a->block_alloc, block);
|
|
269
|
+
block = next;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
void upb_Arena_Free(upb_Arena* a) {
|
|
274
|
+
a = arena_findroot(a);
|
|
275
|
+
if (--a->refcount == 0) arena_dofree(a);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
bool upb_Arena_AddCleanup(upb_Arena* a, void* ud, upb_CleanupFunc* func) {
|
|
279
|
+
cleanup_ent* ent;
|
|
280
|
+
uint32_t* cleanups = upb_cleanup_pointer(a->cleanup_metadata);
|
|
281
|
+
|
|
282
|
+
if (!cleanups || _upb_ArenaHas(a) < sizeof(cleanup_ent)) {
|
|
283
|
+
if (!upb_Arena_Allocblock(a, 128)) return false; /* Out of memory. */
|
|
284
|
+
UPB_ASSERT(_upb_ArenaHas(a) >= sizeof(cleanup_ent));
|
|
285
|
+
cleanups = upb_cleanup_pointer(a->cleanup_metadata);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
a->head.end -= sizeof(cleanup_ent);
|
|
289
|
+
ent = (cleanup_ent*)a->head.end;
|
|
290
|
+
(*cleanups)++;
|
|
291
|
+
UPB_UNPOISON_MEMORY_REGION(ent, sizeof(cleanup_ent));
|
|
292
|
+
|
|
293
|
+
ent->cleanup = func;
|
|
294
|
+
ent->ud = ud;
|
|
295
|
+
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
bool upb_Arena_Fuse(upb_Arena* a1, upb_Arena* a2) {
|
|
300
|
+
upb_Arena* r1 = arena_findroot(a1);
|
|
301
|
+
upb_Arena* r2 = arena_findroot(a2);
|
|
302
|
+
|
|
303
|
+
if (r1 == r2) return true; /* Already fused. */
|
|
304
|
+
|
|
305
|
+
/* Do not fuse initial blocks since we cannot lifetime extend them. */
|
|
306
|
+
if (upb_cleanup_has_initial_block(r1->cleanup_metadata)) return false;
|
|
307
|
+
if (upb_cleanup_has_initial_block(r2->cleanup_metadata)) return false;
|
|
308
|
+
|
|
309
|
+
/* Only allow fuse with a common allocator */
|
|
310
|
+
if (r1->block_alloc != r2->block_alloc) return false;
|
|
311
|
+
|
|
312
|
+
/* We want to join the smaller tree to the larger tree.
|
|
313
|
+
* So swap first if they are backwards. */
|
|
314
|
+
if (r1->refcount < r2->refcount) {
|
|
315
|
+
upb_Arena* tmp = r1;
|
|
316
|
+
r1 = r2;
|
|
317
|
+
r2 = tmp;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* r1 takes over r2's freelist and refcount. */
|
|
321
|
+
r1->refcount += r2->refcount;
|
|
322
|
+
if (r2->freelist_tail) {
|
|
323
|
+
UPB_ASSERT(r2->freelist_tail->next == NULL);
|
|
324
|
+
r2->freelist_tail->next = r1->freelist;
|
|
325
|
+
r1->freelist = r2->freelist;
|
|
326
|
+
}
|
|
327
|
+
r2->parent = r1;
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Miscellaneous utilities ****************************************************/
|
|
332
|
+
|
|
333
|
+
static void upb_FixLocale(char* p) {
|
|
334
|
+
/* printf() is dependent on locales; sadly there is no easy and portable way
|
|
335
|
+
* to avoid this. This little post-processing step will translate 1,2 -> 1.2
|
|
336
|
+
* since JSON needs the latter. Arguably a hack, but it is simple and the
|
|
337
|
+
* alternatives are far more complicated, platform-dependent, and/or larger
|
|
338
|
+
* in code size. */
|
|
339
|
+
for (; *p; p++) {
|
|
340
|
+
if (*p == ',') *p = '.';
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
void _upb_EncodeRoundTripDouble(double val, char* buf, size_t size) {
|
|
345
|
+
assert(size >= kUpb_RoundTripBufferSize);
|
|
346
|
+
snprintf(buf, size, "%.*g", DBL_DIG, val);
|
|
347
|
+
if (strtod(buf, NULL) != val) {
|
|
348
|
+
snprintf(buf, size, "%.*g", DBL_DIG + 2, val);
|
|
349
|
+
assert(strtod(buf, NULL) == val);
|
|
350
|
+
}
|
|
351
|
+
upb_FixLocale(buf);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
void _upb_EncodeRoundTripFloat(float val, char* buf, size_t size) {
|
|
355
|
+
assert(size >= kUpb_RoundTripBufferSize);
|
|
356
|
+
snprintf(buf, size, "%.*g", FLT_DIG, val);
|
|
357
|
+
if (strtof(buf, NULL) != val) {
|
|
358
|
+
snprintf(buf, size, "%.*g", FLT_DIG + 3, val);
|
|
359
|
+
assert(strtof(buf, NULL) == val);
|
|
360
|
+
}
|
|
361
|
+
upb_FixLocale(buf);
|
|
362
|
+
}
|