tigerbeetle 0.0.34 → 0.0.37
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 +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- data/ext/tb_client/pkg.tar.gz +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const assert = std.debug.assert;
|
|
3
|
+
|
|
4
|
+
const Signal = @import("./signal.zig").Signal;
|
|
5
|
+
const IO = @import("../../../io.zig").IO;
|
|
6
|
+
const stdx = @import("stdx");
|
|
7
|
+
const fuzz = @import("../../../testing/fuzz.zig");
|
|
8
|
+
|
|
9
|
+
const threads_limit = 8;
|
|
10
|
+
const Threads = stdx.BoundedArrayType(std.Thread, threads_limit);
|
|
11
|
+
|
|
12
|
+
const StopRequest = enum(u8) {
|
|
13
|
+
none,
|
|
14
|
+
io_thread,
|
|
15
|
+
user_thread,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const Context = struct {
|
|
19
|
+
const Atomic = std.atomic.Value(StopRequest);
|
|
20
|
+
|
|
21
|
+
main_thread_id: std.Thread.Id,
|
|
22
|
+
signal: Signal,
|
|
23
|
+
running_count: u32 = 0,
|
|
24
|
+
stop_request: Atomic = Atomic.init(.none),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
pub fn main(_: std.mem.Allocator, args: fuzz.FuzzArgs) !void {
|
|
28
|
+
var prng = stdx.PRNG.from_seed(args.seed);
|
|
29
|
+
const events_max = args.events_max orelse 100;
|
|
30
|
+
|
|
31
|
+
for (0..events_max) |_| {
|
|
32
|
+
var io = try IO.init(32, 0);
|
|
33
|
+
defer io.deinit();
|
|
34
|
+
|
|
35
|
+
var context: Context = .{
|
|
36
|
+
.main_thread_id = std.Thread.getCurrentId(),
|
|
37
|
+
.signal = undefined,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
try Signal.init(&context.signal, &io, on_signal);
|
|
41
|
+
defer context.signal.deinit();
|
|
42
|
+
|
|
43
|
+
const threads_max = prng.range_inclusive(u32, 1, threads_limit);
|
|
44
|
+
var threads: Threads = .{};
|
|
45
|
+
for (0..threads_max) |_| {
|
|
46
|
+
const thread = try std.Thread.spawn(.{}, notify, .{&context});
|
|
47
|
+
threads.push(thread);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
while (context.signal.status() != .stopped) {
|
|
51
|
+
if (context.running_count > 0) {
|
|
52
|
+
// Setting a random `stop_request`.
|
|
53
|
+
_ = context.stop_request.cmpxchgStrong(
|
|
54
|
+
.none,
|
|
55
|
+
prng.enum_uniform(StopRequest),
|
|
56
|
+
.acquire,
|
|
57
|
+
.monotonic,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const tick_us = 10;
|
|
62
|
+
try io.run_for_ns(tick_us * std.time.ns_per_us);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
for (threads.slice()) |*thread| {
|
|
66
|
+
thread.join();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
assert(context.running_count > 0);
|
|
70
|
+
assert(context.stop_request.load(.monotonic) != .none);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
fn notify(context: *Context) void {
|
|
75
|
+
assert(std.Thread.getCurrentId() != context.main_thread_id);
|
|
76
|
+
while (context.signal.status() != .stopped) {
|
|
77
|
+
const delay_us = 1; // Shorter than `tick_us`.
|
|
78
|
+
std.time.sleep(delay_us * std.time.ns_per_us);
|
|
79
|
+
|
|
80
|
+
if (context.stop_request.load(.monotonic) == .user_thread) {
|
|
81
|
+
// Stop can be called by multiple threads.
|
|
82
|
+
context.signal.stop();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Notify has no effect if called after `stop()`.
|
|
86
|
+
context.signal.notify();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
fn on_signal(signal: *Signal) void {
|
|
91
|
+
const context: *Context = @fieldParentPtr("signal", signal);
|
|
92
|
+
assert(std.Thread.getCurrentId() == context.main_thread_id);
|
|
93
|
+
switch (context.signal.status()) {
|
|
94
|
+
.running => {
|
|
95
|
+
context.running_count += 1;
|
|
96
|
+
if (context.stop_request.load(.monotonic) == .io_thread) {
|
|
97
|
+
// Stop the signal while the notification is running.
|
|
98
|
+
context.signal.stop();
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
.stop_requested => {
|
|
102
|
+
// It's not possible if `stop` was called from the IO thread.
|
|
103
|
+
assert(context.stop_request.load(.monotonic) == .user_thread);
|
|
104
|
+
|
|
105
|
+
// Requested while running, so still counts as one event.
|
|
106
|
+
context.running_count += 1;
|
|
107
|
+
},
|
|
108
|
+
.stopped => unreachable,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
//////////////////////////////////////////////////////////
|
|
2
|
+
// This file was auto-generated by tb_client_header.zig //
|
|
3
|
+
// Do not manually modify. //
|
|
4
|
+
//////////////////////////////////////////////////////////
|
|
5
|
+
|
|
6
|
+
#ifndef TB_CLIENT_H
|
|
7
|
+
#define TB_CLIENT_H
|
|
8
|
+
|
|
9
|
+
#ifdef __cplusplus
|
|
10
|
+
extern "C" {
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#include <stddef.h>
|
|
14
|
+
#include <stdint.h>
|
|
15
|
+
#include <stdbool.h>
|
|
16
|
+
|
|
17
|
+
typedef __uint128_t tb_uint128_t;
|
|
18
|
+
|
|
19
|
+
typedef enum TB_ACCOUNT_FLAGS {
|
|
20
|
+
TB_ACCOUNT_LINKED = 1 << 0,
|
|
21
|
+
TB_ACCOUNT_DEBITS_MUST_NOT_EXCEED_CREDITS = 1 << 1,
|
|
22
|
+
TB_ACCOUNT_CREDITS_MUST_NOT_EXCEED_DEBITS = 1 << 2,
|
|
23
|
+
TB_ACCOUNT_HISTORY = 1 << 3,
|
|
24
|
+
TB_ACCOUNT_IMPORTED = 1 << 4,
|
|
25
|
+
TB_ACCOUNT_CLOSED = 1 << 5,
|
|
26
|
+
} TB_ACCOUNT_FLAGS;
|
|
27
|
+
|
|
28
|
+
typedef struct tb_account_t {
|
|
29
|
+
tb_uint128_t id;
|
|
30
|
+
tb_uint128_t debits_pending;
|
|
31
|
+
tb_uint128_t debits_posted;
|
|
32
|
+
tb_uint128_t credits_pending;
|
|
33
|
+
tb_uint128_t credits_posted;
|
|
34
|
+
tb_uint128_t user_data_128;
|
|
35
|
+
uint64_t user_data_64;
|
|
36
|
+
uint32_t user_data_32;
|
|
37
|
+
uint32_t reserved;
|
|
38
|
+
uint32_t ledger;
|
|
39
|
+
uint16_t code;
|
|
40
|
+
uint16_t flags;
|
|
41
|
+
uint64_t timestamp;
|
|
42
|
+
} tb_account_t;
|
|
43
|
+
|
|
44
|
+
typedef enum TB_TRANSFER_FLAGS {
|
|
45
|
+
TB_TRANSFER_LINKED = 1 << 0,
|
|
46
|
+
TB_TRANSFER_PENDING = 1 << 1,
|
|
47
|
+
TB_TRANSFER_POST_PENDING_TRANSFER = 1 << 2,
|
|
48
|
+
TB_TRANSFER_VOID_PENDING_TRANSFER = 1 << 3,
|
|
49
|
+
TB_TRANSFER_BALANCING_DEBIT = 1 << 4,
|
|
50
|
+
TB_TRANSFER_BALANCING_CREDIT = 1 << 5,
|
|
51
|
+
TB_TRANSFER_CLOSING_DEBIT = 1 << 6,
|
|
52
|
+
TB_TRANSFER_CLOSING_CREDIT = 1 << 7,
|
|
53
|
+
TB_TRANSFER_IMPORTED = 1 << 8,
|
|
54
|
+
} TB_TRANSFER_FLAGS;
|
|
55
|
+
|
|
56
|
+
typedef struct tb_transfer_t {
|
|
57
|
+
tb_uint128_t id;
|
|
58
|
+
tb_uint128_t debit_account_id;
|
|
59
|
+
tb_uint128_t credit_account_id;
|
|
60
|
+
tb_uint128_t amount;
|
|
61
|
+
tb_uint128_t pending_id;
|
|
62
|
+
tb_uint128_t user_data_128;
|
|
63
|
+
uint64_t user_data_64;
|
|
64
|
+
uint32_t user_data_32;
|
|
65
|
+
uint32_t timeout;
|
|
66
|
+
uint32_t ledger;
|
|
67
|
+
uint16_t code;
|
|
68
|
+
uint16_t flags;
|
|
69
|
+
uint64_t timestamp;
|
|
70
|
+
} tb_transfer_t;
|
|
71
|
+
|
|
72
|
+
typedef enum TB_CREATE_ACCOUNT_RESULT {
|
|
73
|
+
TB_CREATE_ACCOUNT_OK = 0,
|
|
74
|
+
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
|
|
75
|
+
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
|
|
76
|
+
TB_CREATE_ACCOUNT_IMPORTED_EVENT_EXPECTED = 22,
|
|
77
|
+
TB_CREATE_ACCOUNT_IMPORTED_EVENT_NOT_EXPECTED = 23,
|
|
78
|
+
TB_CREATE_ACCOUNT_TIMESTAMP_MUST_BE_ZERO = 3,
|
|
79
|
+
TB_CREATE_ACCOUNT_IMPORTED_EVENT_TIMESTAMP_OUT_OF_RANGE = 24,
|
|
80
|
+
TB_CREATE_ACCOUNT_IMPORTED_EVENT_TIMESTAMP_MUST_NOT_ADVANCE = 25,
|
|
81
|
+
TB_CREATE_ACCOUNT_RESERVED_FIELD = 4,
|
|
82
|
+
TB_CREATE_ACCOUNT_RESERVED_FLAG = 5,
|
|
83
|
+
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 6,
|
|
84
|
+
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 7,
|
|
85
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 15,
|
|
86
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 16,
|
|
87
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 17,
|
|
88
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 18,
|
|
89
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 19,
|
|
90
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 20,
|
|
91
|
+
TB_CREATE_ACCOUNT_EXISTS = 21,
|
|
92
|
+
TB_CREATE_ACCOUNT_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 8,
|
|
93
|
+
TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 9,
|
|
94
|
+
TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 10,
|
|
95
|
+
TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 11,
|
|
96
|
+
TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 12,
|
|
97
|
+
TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 13,
|
|
98
|
+
TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 14,
|
|
99
|
+
TB_CREATE_ACCOUNT_IMPORTED_EVENT_TIMESTAMP_MUST_NOT_REGRESS = 26,
|
|
100
|
+
} TB_CREATE_ACCOUNT_RESULT;
|
|
101
|
+
|
|
102
|
+
typedef enum TB_CREATE_TRANSFER_RESULT {
|
|
103
|
+
TB_CREATE_TRANSFER_OK = 0,
|
|
104
|
+
TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = 1,
|
|
105
|
+
TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = 2,
|
|
106
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_EXPECTED = 56,
|
|
107
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_NOT_EXPECTED = 57,
|
|
108
|
+
TB_CREATE_TRANSFER_TIMESTAMP_MUST_BE_ZERO = 3,
|
|
109
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMESTAMP_OUT_OF_RANGE = 58,
|
|
110
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMESTAMP_MUST_NOT_ADVANCE = 59,
|
|
111
|
+
TB_CREATE_TRANSFER_RESERVED_FLAG = 4,
|
|
112
|
+
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = 5,
|
|
113
|
+
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = 6,
|
|
114
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = 36,
|
|
115
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = 40,
|
|
116
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = 44,
|
|
117
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = 37,
|
|
118
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = 38,
|
|
119
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = 39,
|
|
120
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_128 = 41,
|
|
121
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_64 = 42,
|
|
122
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA_32 = 43,
|
|
123
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_LEDGER = 67,
|
|
124
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = 45,
|
|
125
|
+
TB_CREATE_TRANSFER_EXISTS = 46,
|
|
126
|
+
TB_CREATE_TRANSFER_ID_ALREADY_FAILED = 68,
|
|
127
|
+
TB_CREATE_TRANSFER_FLAGS_ARE_MUTUALLY_EXCLUSIVE = 7,
|
|
128
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 8,
|
|
129
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 9,
|
|
130
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 10,
|
|
131
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 11,
|
|
132
|
+
TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = 12,
|
|
133
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = 13,
|
|
134
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = 14,
|
|
135
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = 15,
|
|
136
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = 16,
|
|
137
|
+
TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = 17,
|
|
138
|
+
TB_CREATE_TRANSFER_CLOSING_TRANSFER_MUST_BE_PENDING = 64,
|
|
139
|
+
TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = 19,
|
|
140
|
+
TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = 20,
|
|
141
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = 21,
|
|
142
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = 22,
|
|
143
|
+
TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = 23,
|
|
144
|
+
TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = 24,
|
|
145
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = 25,
|
|
146
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = 26,
|
|
147
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = 27,
|
|
148
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = 28,
|
|
149
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = 29,
|
|
150
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = 30,
|
|
151
|
+
TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = 31,
|
|
152
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = 32,
|
|
153
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = 33,
|
|
154
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = 34,
|
|
155
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = 35,
|
|
156
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMESTAMP_MUST_NOT_REGRESS = 60,
|
|
157
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMESTAMP_MUST_POSTDATE_DEBIT_ACCOUNT = 61,
|
|
158
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMESTAMP_MUST_POSTDATE_CREDIT_ACCOUNT = 62,
|
|
159
|
+
TB_CREATE_TRANSFER_IMPORTED_EVENT_TIMEOUT_MUST_BE_ZERO = 63,
|
|
160
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ALREADY_CLOSED = 65,
|
|
161
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ALREADY_CLOSED = 66,
|
|
162
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = 47,
|
|
163
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = 48,
|
|
164
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = 49,
|
|
165
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = 50,
|
|
166
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = 51,
|
|
167
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = 52,
|
|
168
|
+
TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = 53,
|
|
169
|
+
TB_CREATE_TRANSFER_EXCEEDS_CREDITS = 54,
|
|
170
|
+
TB_CREATE_TRANSFER_EXCEEDS_DEBITS = 55,
|
|
171
|
+
} TB_CREATE_TRANSFER_RESULT;
|
|
172
|
+
|
|
173
|
+
typedef struct tb_create_accounts_result_t {
|
|
174
|
+
uint32_t index;
|
|
175
|
+
uint32_t result;
|
|
176
|
+
} tb_create_accounts_result_t;
|
|
177
|
+
|
|
178
|
+
typedef struct tb_create_transfers_result_t {
|
|
179
|
+
uint32_t index;
|
|
180
|
+
uint32_t result;
|
|
181
|
+
} tb_create_transfers_result_t;
|
|
182
|
+
|
|
183
|
+
typedef struct tb_account_filter_t {
|
|
184
|
+
tb_uint128_t account_id;
|
|
185
|
+
tb_uint128_t user_data_128;
|
|
186
|
+
uint64_t user_data_64;
|
|
187
|
+
uint32_t user_data_32;
|
|
188
|
+
uint16_t code;
|
|
189
|
+
uint8_t reserved[58];
|
|
190
|
+
uint64_t timestamp_min;
|
|
191
|
+
uint64_t timestamp_max;
|
|
192
|
+
uint32_t limit;
|
|
193
|
+
uint32_t flags;
|
|
194
|
+
} tb_account_filter_t;
|
|
195
|
+
|
|
196
|
+
typedef enum TB_ACCOUNT_FILTER_FLAGS {
|
|
197
|
+
TB_ACCOUNT_FILTER_DEBITS = 1 << 0,
|
|
198
|
+
TB_ACCOUNT_FILTER_CREDITS = 1 << 1,
|
|
199
|
+
TB_ACCOUNT_FILTER_REVERSED = 1 << 2,
|
|
200
|
+
} TB_ACCOUNT_FILTER_FLAGS;
|
|
201
|
+
|
|
202
|
+
typedef struct tb_account_balance_t {
|
|
203
|
+
tb_uint128_t debits_pending;
|
|
204
|
+
tb_uint128_t debits_posted;
|
|
205
|
+
tb_uint128_t credits_pending;
|
|
206
|
+
tb_uint128_t credits_posted;
|
|
207
|
+
uint64_t timestamp;
|
|
208
|
+
uint8_t reserved[56];
|
|
209
|
+
} tb_account_balance_t;
|
|
210
|
+
|
|
211
|
+
typedef struct tb_query_filter_t {
|
|
212
|
+
tb_uint128_t user_data_128;
|
|
213
|
+
uint64_t user_data_64;
|
|
214
|
+
uint32_t user_data_32;
|
|
215
|
+
uint32_t ledger;
|
|
216
|
+
uint16_t code;
|
|
217
|
+
uint8_t reserved[6];
|
|
218
|
+
uint64_t timestamp_min;
|
|
219
|
+
uint64_t timestamp_max;
|
|
220
|
+
uint32_t limit;
|
|
221
|
+
uint32_t flags;
|
|
222
|
+
} tb_query_filter_t;
|
|
223
|
+
|
|
224
|
+
typedef enum TB_QUERY_FILTER_FLAGS {
|
|
225
|
+
TB_QUERY_FILTER_REVERSED = 1 << 0,
|
|
226
|
+
} TB_QUERY_FILTER_FLAGS;
|
|
227
|
+
|
|
228
|
+
// Opaque struct serving as a handle for the client instance.
|
|
229
|
+
// This struct must be "pinned" (not copyable or movable), as its address must remain stable
|
|
230
|
+
// throughout the lifetime of the client instance.
|
|
231
|
+
typedef struct tb_client_t {
|
|
232
|
+
uint64_t opaque[4];
|
|
233
|
+
} tb_client_t;
|
|
234
|
+
|
|
235
|
+
// Struct containing the state of a request submitted through the client.
|
|
236
|
+
// This struct must be "pinned" (not copyable or movable), as its address must remain stable
|
|
237
|
+
// throughout the lifetime of the request.
|
|
238
|
+
typedef struct tb_packet_t {
|
|
239
|
+
void* user_data;
|
|
240
|
+
void* data;
|
|
241
|
+
uint32_t data_size;
|
|
242
|
+
uint16_t user_tag;
|
|
243
|
+
uint8_t operation;
|
|
244
|
+
uint8_t status;
|
|
245
|
+
uint8_t opaque[64];
|
|
246
|
+
} tb_packet_t;
|
|
247
|
+
|
|
248
|
+
typedef enum TB_OPERATION {
|
|
249
|
+
TB_OPERATION_PULSE = 128,
|
|
250
|
+
TB_OPERATION_GET_CHANGE_EVENTS = 137,
|
|
251
|
+
TB_OPERATION_CREATE_ACCOUNTS = 138,
|
|
252
|
+
TB_OPERATION_CREATE_TRANSFERS = 139,
|
|
253
|
+
TB_OPERATION_LOOKUP_ACCOUNTS = 140,
|
|
254
|
+
TB_OPERATION_LOOKUP_TRANSFERS = 141,
|
|
255
|
+
TB_OPERATION_GET_ACCOUNT_TRANSFERS = 142,
|
|
256
|
+
TB_OPERATION_GET_ACCOUNT_BALANCES = 143,
|
|
257
|
+
TB_OPERATION_QUERY_ACCOUNTS = 144,
|
|
258
|
+
TB_OPERATION_QUERY_TRANSFERS = 145,
|
|
259
|
+
} TB_OPERATION;
|
|
260
|
+
|
|
261
|
+
typedef enum TB_PACKET_STATUS {
|
|
262
|
+
TB_PACKET_OK = 0,
|
|
263
|
+
TB_PACKET_TOO_MUCH_DATA = 1,
|
|
264
|
+
TB_PACKET_CLIENT_EVICTED = 2,
|
|
265
|
+
TB_PACKET_CLIENT_RELEASE_TOO_LOW = 3,
|
|
266
|
+
TB_PACKET_CLIENT_RELEASE_TOO_HIGH = 4,
|
|
267
|
+
TB_PACKET_CLIENT_SHUTDOWN = 5,
|
|
268
|
+
TB_PACKET_INVALID_OPERATION = 6,
|
|
269
|
+
TB_PACKET_INVALID_DATA_SIZE = 7,
|
|
270
|
+
} TB_PACKET_STATUS;
|
|
271
|
+
|
|
272
|
+
typedef enum TB_INIT_STATUS {
|
|
273
|
+
TB_INIT_SUCCESS = 0,
|
|
274
|
+
TB_INIT_UNEXPECTED = 1,
|
|
275
|
+
TB_INIT_OUT_OF_MEMORY = 2,
|
|
276
|
+
TB_INIT_ADDRESS_INVALID = 3,
|
|
277
|
+
TB_INIT_ADDRESS_LIMIT_EXCEEDED = 4,
|
|
278
|
+
TB_INIT_SYSTEM_RESOURCES = 5,
|
|
279
|
+
TB_INIT_NETWORK_SUBSYSTEM = 6,
|
|
280
|
+
} TB_INIT_STATUS;
|
|
281
|
+
|
|
282
|
+
typedef enum TB_CLIENT_STATUS {
|
|
283
|
+
TB_CLIENT_OK = 0,
|
|
284
|
+
TB_CLIENT_INVALID = 1,
|
|
285
|
+
} TB_CLIENT_STATUS;
|
|
286
|
+
|
|
287
|
+
typedef enum TB_REGISTER_LOG_CALLBACK_STATUS {
|
|
288
|
+
TB_REGISTER_LOG_CALLBACK_SUCCESS = 0,
|
|
289
|
+
TB_REGISTER_LOG_CALLBACK_ALREADY_REGISTERED = 1,
|
|
290
|
+
TB_REGISTER_LOG_CALLBACK_NOT_REGISTERED = 2,
|
|
291
|
+
} TB_REGISTER_LOG_CALLBACK_STATUS;
|
|
292
|
+
|
|
293
|
+
typedef enum TB_LOG_LEVEL {
|
|
294
|
+
TB_LOG_ERR = 0,
|
|
295
|
+
TB_LOG_WARN = 1,
|
|
296
|
+
TB_LOG_INFO = 2,
|
|
297
|
+
TB_LOG_DEBUG = 3,
|
|
298
|
+
} TB_LOG_LEVEL;
|
|
299
|
+
|
|
300
|
+
typedef struct tb_init_parameters_t {
|
|
301
|
+
tb_uint128_t cluster_id;
|
|
302
|
+
tb_uint128_t client_id;
|
|
303
|
+
uint8_t* addresses_ptr;
|
|
304
|
+
uint64_t addresses_len;
|
|
305
|
+
} tb_init_parameters_t;
|
|
306
|
+
|
|
307
|
+
// Per-client callback invoked every time a `tb_client_submit` completes or is canceled.
|
|
308
|
+
// Use `packet->userdata` to identify the specific submission.
|
|
309
|
+
// `result` is null iff `packet->status != TB_PACKET_OK`
|
|
310
|
+
// `result` is only valid for the duration of the callback itself.
|
|
311
|
+
typedef void (*tb_completion_t)(
|
|
312
|
+
uintptr_t userdata,
|
|
313
|
+
tb_packet_t* packet,
|
|
314
|
+
uint64_t timestamp,
|
|
315
|
+
const uint8_t *result, // nullable
|
|
316
|
+
uint32_t result_size
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
// Initialize a new TigerBeetle client which connects to the addresses provided and
|
|
320
|
+
// completes submitted packets by invoking the callback with the given context.
|
|
321
|
+
TB_INIT_STATUS tb_client_init(
|
|
322
|
+
tb_client_t *client_out,
|
|
323
|
+
// 128-bit unsigned integer represented as a 16-byte little-endian array.
|
|
324
|
+
const uint8_t cluster_id[16],
|
|
325
|
+
const char *address_ptr,
|
|
326
|
+
uint32_t address_len,
|
|
327
|
+
uintptr_t completion_ctx,
|
|
328
|
+
tb_completion_t completion_callback
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
// Initialize a new TigerBeetle client that echoes back any submitted data.
|
|
332
|
+
TB_INIT_STATUS tb_client_init_echo(
|
|
333
|
+
tb_client_t *client_out,
|
|
334
|
+
// 128-bit unsigned integer represented as a 16-byte little-endian array.
|
|
335
|
+
const uint8_t cluster_id[16],
|
|
336
|
+
const char *address_ptr,
|
|
337
|
+
uint32_t address_len,
|
|
338
|
+
uintptr_t completion_ctx,
|
|
339
|
+
tb_completion_t completion_callback
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
// Retrieve the parameters initially passed to `tb_client_init` or `tb_client_init_echo`.
|
|
343
|
+
// Return value: `TB_CLIENT_OK` on success, or `TB_CLIENT_INVALID` if the client handle was
|
|
344
|
+
// not initialized or has already been closed.
|
|
345
|
+
TB_CLIENT_STATUS tb_client_init_parameters(
|
|
346
|
+
tb_client_t* client,
|
|
347
|
+
tb_init_parameters_t* init_parameters_out
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// Retrieve the callback context initially passed to `tb_client_init` or `tb_client_init_echo`.
|
|
351
|
+
// Return value: `TB_CLIENT_OK` on success, or `TB_CLIENT_INVALID` if the client handle was
|
|
352
|
+
// not initialized or has already been closed.
|
|
353
|
+
TB_CLIENT_STATUS tb_client_completion_context(
|
|
354
|
+
tb_client_t* client,
|
|
355
|
+
uintptr_t* completion_ctx_out
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
// Submit a packet with its `operation`, `data`, and `data_size` fields set.
|
|
359
|
+
// Once completed, `completion_callback` will be invoked with `completion_ctx`
|
|
360
|
+
// and the given packet on the `tb_client` thread (separate from the caller's thread).
|
|
361
|
+
// Return value: `TB_CLIENT_OK` on success, or `TB_CLIENT_INVALID` if the client handle was
|
|
362
|
+
// not initialized or has already been closed.
|
|
363
|
+
TB_CLIENT_STATUS tb_client_submit(
|
|
364
|
+
tb_client_t *client,
|
|
365
|
+
tb_packet_t *packet
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
// Closes the client, causing any previously submitted packets to be completed with
|
|
369
|
+
// `TB_PACKET_CLIENT_SHUTDOWN` before freeing any allocated client resources from init.
|
|
370
|
+
// Return value: `TB_CLIENT_OK` on success, or `TB_CLIENT_INVALID` if the client handle was
|
|
371
|
+
// not initialized or has already been closed.
|
|
372
|
+
TB_CLIENT_STATUS tb_client_deinit(
|
|
373
|
+
tb_client_t *client
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
// Registers or unregisters the application log callback.
|
|
377
|
+
TB_REGISTER_LOG_CALLBACK_STATUS tb_client_register_log_callback(
|
|
378
|
+
void (*callback)(TB_LOG_LEVEL, const uint8_t*, uint32_t),
|
|
379
|
+
bool debug
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
#ifdef __cplusplus
|
|
383
|
+
} // extern "C"
|
|
384
|
+
#endif
|
|
385
|
+
|
|
386
|
+
#endif // TB_CLIENT_H
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
pub const vsr = @import("../../vsr.zig");
|
|
4
|
+
pub const exports = @import("tb_client_exports.zig");
|
|
5
|
+
|
|
6
|
+
const MessageBus = @import("../../message_bus.zig").MessageBusType(@import("../../io.zig").IO);
|
|
7
|
+
|
|
8
|
+
pub const InitError = @import("tb_client/context.zig").InitError;
|
|
9
|
+
pub const InitParameters = @import("tb_client/context.zig").InitParameters;
|
|
10
|
+
pub const ClientInterface = @import("tb_client/context.zig").ClientInterface;
|
|
11
|
+
pub const CompletionCallback = @import("tb_client/context.zig").CompletionCallback;
|
|
12
|
+
pub const Packet = @import("tb_client/packet.zig").Packet.Extern;
|
|
13
|
+
pub const PacketStatus = @import("tb_client/packet.zig").Packet.Status;
|
|
14
|
+
pub const Operation = vsr.tigerbeetle.Operation;
|
|
15
|
+
|
|
16
|
+
const ContextType = @import("tb_client/context.zig").ContextType;
|
|
17
|
+
const DefaultContext = blk: {
|
|
18
|
+
const ClientType = @import("../../vsr/client.zig").ClientType;
|
|
19
|
+
const Client = ClientType(Operation, MessageBus);
|
|
20
|
+
break :blk ContextType(Client);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const TestingContext = blk: {
|
|
24
|
+
const EchoClientType = @import("tb_client/echo_client.zig").EchoClientType;
|
|
25
|
+
const EchoClient = EchoClientType(MessageBus);
|
|
26
|
+
break :blk ContextType(EchoClient);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
pub const init = DefaultContext.init;
|
|
30
|
+
pub const init_echo = TestingContext.init;
|
|
31
|
+
|
|
32
|
+
test {
|
|
33
|
+
std.testing.refAllDecls(DefaultContext);
|
|
34
|
+
}
|