xet_runtime::test_configurable_constants! {
ref TARGET_CHUNK_SIZE: usize = 64 * 1024;
ref MINIMUM_CHUNK_DIVISOR: usize = 8;
ref MAXIMUM_CHUNK_MULTIPLIER: usize = 2;
ref MAX_XORB_BYTES: usize = 64 * 1024 * 1024;
ref MAX_XORB_CHUNKS: usize = 8 * 1024;
ref XORB_BLOCK_SIZE: usize = 64 * 1024 * 1024;
}
lazy_static::lazy_static! {
pub static ref MAX_CHUNK_SIZE: usize = (*TARGET_CHUNK_SIZE) * (*MAXIMUM_CHUNK_MULTIPLIER);
}
pub fn next_stable_chunk_boundary(starting_position: usize, chunk_boundaries: &[usize]) -> Option<usize> {
let start_idx = chunk_boundaries.partition_point(|&x| x < starting_position);
for i in start_idx..chunk_boundaries.len().saturating_sub(2) {
let size_a = chunk_boundaries[i + 1] - chunk_boundaries[i];
let size_b = chunk_boundaries[i + 2] - chunk_boundaries[i + 1];
if is_stable_chunk_size(size_a) && is_stable_chunk_size(size_b) {
return Some(chunk_boundaries[i + 2]);
}
}
None
}
pub fn is_stable_chunk_size(size: usize) -> bool {
let minimum_chunk = *TARGET_CHUNK_SIZE / *MINIMUM_CHUNK_DIVISOR;
let maximum_chunk = *TARGET_CHUNK_SIZE * *MAXIMUM_CHUNK_MULTIPLIER;
size >= 2 * minimum_chunk && size < maximum_chunk - minimum_chunk
}