Skip to content

Commit b81c3d3

Browse files
authored
feat(render): Generate Rust perfect hash (#423)
Add Rust support for perfect hashes generated by Render. (cherry picked from commit 86feed5)
1 parent f765575 commit b81c3d3

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

cmake/render.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ function(render_compile INPUT_DIR)
8989
# Rust per-app crate files live under src/
9090
"${OUTPUT_DIR}/${PACKAGE}/${APP}/src/wire_messages.rs"
9191
"${OUTPUT_DIR}/${PACKAGE}/${APP}/src/encoder.rs"
92+
"${OUTPUT_DIR}/${PACKAGE}/${APP}/src/hash.rs"
9293
"${OUTPUT_DIR}/${PACKAGE}/${APP}/Cargo.toml"
9394
"${OUTPUT_DIR}/${PACKAGE}/${APP}/src/lib.rs"
9495
# Headers that are also generated alongside sources
@@ -296,6 +297,7 @@ function(render_compile INPUT_DIR)
296297
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_src_dir}/src/lib.rs" "${_dest_dir}/src/lib.rs"
297298
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_src_dir}/src/encoder.rs" "${_dest_dir}/src/encoder.rs"
298299
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_src_dir}/src/wire_messages.rs" "${_dest_dir}/src/wire_messages.rs"
300+
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_src_dir}/src/hash.rs" "${_dest_dir}/src/hash.rs"
299301
DEPENDS render_compile_${PACKAGE}
300302
VERBATIM
301303
)

renderc/io.opentelemetry.render/src/io/opentelemetry/render/generator/HashGenerator.xtend

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import static io.opentelemetry.render.generator.RenderGenerator.generatedCodeWar
1111
import static extension io.opentelemetry.render.extensions.AppExtensions.hashName
1212
import static extension io.opentelemetry.render.extensions.AppExtensions.hashSize
1313
import static extension io.opentelemetry.render.extensions.AppExtensions.hashFunctor
14+
import static extension io.opentelemetry.render.extensions.AppExtensions.pkg
1415

1516
class HashGenerator {
1617

@@ -20,6 +21,8 @@ class HashGenerator {
2021

2122
fsa.generateFile(outputPath(app, "hash.c"), generateC(app, hash))
2223
fsa.generateFile(outputPath(app, "hash.h"), generateH(app, hash))
24+
// Rust port: generate perfect hash for rpc_id into src/hash.rs
25+
fsa.generateFile(outputPath(app, "src/hash.rs"), generateRust(app, hash))
2326
}
2427

2528
private def generateC(App app, PerfectHash hash) {
@@ -71,4 +74,36 @@ class HashGenerator {
7174
'''
7275
}
7376

77+
private def generateRust(App app, PerfectHash hash) {
78+
'''
79+
«generatedCodeWarning()»
80+
// Perfect hash for RPC IDs for «app.pkg.name»::«app.name»
81+
//
82+
// g_type: «hash.g_type»
83+
// g_size: «hash.g_size»
84+
// g_shift: «hash.g_shift»
85+
// hash_shift: «hash.hash_shift»
86+
// hash_mask: «hash.hash_mask»
87+
// n_keys: «hash.n_keys»
88+
// multiplier: «hash.multiplier»
89+
// hash_seed: «hash.hash_seed»
90+
91+
#[allow(dead_code)]
92+
pub const «app.hashSize»: u32 = «hash.hash_mask + 1»u32;
93+
94+
#[allow(dead_code)]
95+
pub static G_ARRAY: [«hash.g_type»; «hash.g_size»] = [
96+
«hash.g_array.map[toString].join(",")»
97+
];
98+
99+
#[inline]
100+
#[allow(dead_code)]
101+
pub fn «app.hashName»(rpc_id: u32) -> u32 {
102+
let k = (rpc_id ^ «hash.hash_seed»u32).wrapping_mul(«hash.multiplier»u32);
103+
let g = G_ARRAY[(k >> «hash.g_shift») as usize] as u32;
104+
(k >> «hash.hash_shift»).wrapping_add(g) & «hash.hash_mask»u32
105+
}
106+
'''
107+
}
108+
74109
}

renderc/io.opentelemetry.render/src/io/opentelemetry/render/generator/RustCargoGenerator.xtend

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ class RustCargoGenerator {
8686
pub mod encoder {
8787
include!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/encoder.rs"));
8888
}
89+
90+
#[allow(dead_code)]
91+
pub mod hash {
92+
include!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/hash.rs"));
93+
}
8994
'''
9095
}
9196

0 commit comments

Comments
 (0)