mod backend;
mod backend_dispatch;
mod backend_prepared;
mod backend_triggered;
mod boundary;
pub(crate) use boundary::derive_pattern_boundary_context;
#[cfg(feature = "gpu")]
pub(crate) use boundary::regex_match_byte_upper_bound;
#[cfg(test)]
pub(crate) use boundary::scan_chunk_boundaries as scan_chunk_boundaries_for_test;
mod csr;
pub(crate) use csr::CsrU32;
mod extract;
pub(crate) use crate::gpu_matcher_cache as gpu_cache;
#[cfg(all(test, feature = "gpu"))]
pub(crate) use gpu_cache::gpu_matcher_cache_dir_from_base;
mod gpu_forced;
#[cfg(any(feature = "gpu", test))]
mod gpu_forced_helpers;
mod gpu_lazy;
mod gpu_lazy_helpers;
mod gpu_literal_scratch;
#[cfg(feature = "gpu")]
pub(crate) mod gpu_region_batch;
#[cfg(feature = "gpu")]
mod gpu_region_dispatch;
#[cfg(feature = "gpu")]
mod gpu_region_dispatch_helpers;
#[cfg(feature = "gpu")]
pub(crate) use crate::gpu::GpuResidentLiteralSlot;
mod gpu_stack;
mod hot_patterns;
pub(crate) mod phase2;
pub(crate) mod phase2_anchor;
#[cfg(test)]
pub(crate) use phase2_anchor::required_prefix_literals as phase2_required_prefix_literals_for_test;
pub(crate) use phase2_anchor::Phase2AnchorIndex;
pub(crate) use phase2_anchor::{
required_prefix_literals_with_cap, CONFIRMED_MAX_LITERALS_PER_PATTERN,
};
mod phase1_admission;
mod phase2_anchor_scan;
mod phase2_compiled;
mod phase2_compiled_anchored;
pub(crate) mod phase2_entropy;
#[path = "phase2/first_bigram.rs"]
mod phase2_first_bigram;
pub(crate) mod phase2_generic;
#[cfg(feature = "gpu")]
mod phase2_gpu_dfa;
#[cfg(feature = "gpu")]
pub(crate) use phase2_gpu_dfa::Phase2GpuDfaCatalogCache;
#[cfg(feature = "simd")]
mod phase2_hs;
#[cfg(feature = "gpu")]
pub(crate) use crate::gpu_input_budget;
#[cfg(all(test, feature = "simd"))]
pub(crate) use phase2_hs::hs_prefilter_requires_host_regex as hs_prefilter_requires_host_regex_for_test;
#[cfg(all(test, feature = "simd"))]
pub(crate) use phase2_hs::Phase2HsEngine;
mod phase2_prefilter;
pub(crate) use crate::phase2_truncate;
mod process;
pub(crate) use crate::scan_profile as profile;
mod recovery;
pub use recovery::{BackendRecoveryReceipt, CoalescedScanOutcome, RecoveredInputRange};
mod scan;
mod scan_coalesced;
pub(crate) mod scan_filters;
pub(crate) mod scan_inner_profile;
pub(crate) mod scan_postprocess;
pub(crate) use scan_postprocess::{
build_confirmed_suffix_gate, confirmed_anchor::ConfirmedAnchorIndex,
};
#[path = "scan_postprocess/confirmed_extract.rs"]
mod scan_postprocess_confirmed_extract;
#[path = "scan_postprocess/fragments.rs"]
mod scan_postprocess_fragments;
#[cfg(feature = "ml")]
#[path = "scan_postprocess/ml.rs"]
mod scan_postprocess_ml;
#[cfg(all(test, feature = "ml"))]
pub(crate) use scan_postprocess_ml::finalize_pending_match_for_test;
#[path = "scan_postprocess/profile.rs"]
mod scan_postprocess_profile;
#[path = "scan_postprocess/suffix_gate.rs"]
mod scan_postprocess_suffix_gate;
pub(crate) mod trigger_bitmap;
mod windowed;
mod windowed_support;
pub(crate) use backend_prepared::code_lines_from_offsets;
pub(crate) use backend_prepared::PreparedChunk;
#[cfg(feature = "simd")]
pub(crate) use backend_prepared::{
build_simd_compile_plan, SimdPhase1CompilePlan, SimdPhase1Prefilter,
};
#[cfg(test)]
pub(crate) use boundary::scan_chunk_boundaries;
#[cfg(test)]
pub(crate) use gpu_forced_helpers::gpu_forced_unavailable_message;
#[cfg(test)]
pub(crate) use phase2::{phase2_gate_stats_dump, phase2_mark_stats, phase2_mark_stats_reset};
#[cfg(test)]
pub(crate) use scan_inner_profile::scan_inner_profile_dump;
#[cfg(test)]
pub(crate) use scan_postprocess::decode_profile_dump;
pub(crate) use scan_postprocess_suffix_gate::suffix_gate_literals;
pub(crate) use windowed::{reject_oversized_window_chunk, MAX_WINDOW_CHUNK_BYTES};
pub(crate) use windowed_support::{absolute_line, absolute_offset, ceil_char_boundary};
pub use windowed_support::{
floor_char_boundary, line_number_for_offset, next_window_offset, record_window_match,
window_chunk, window_end_offset, window_ranges,
};
use crate::compiled_scanner::{GpuBackendAcquisitionFailure, GpuBackendPeers};
use crate::pipeline::*;
use crate::types::*;
use aho_corasick::AhoCorasick;
use keyhog_core::{Chunk, RawMatch};
use std::sync::Arc;
use std::sync::OnceLock;
pub(crate) const MAX_INNER_LOOP_ITERS: usize = 1_000_000;
pub(crate) const BIGRAM_BLOOM_MIN_CHUNK_BYTES: usize = 64;
pub(crate) use phase1_admission::{Phase1Admission, Phase1AdmissionPlanIdentityError};
pub use phase1_admission::{
Phase1AdmissionPlan, Phase1AdmissionSummary, Phase2KeywordTriggerSummary,
};
pub struct CompiledScanner {
pub(crate) detector_digest: u64,
pub(crate) fragment_cache: crate::fragment_cache::FragmentCache,
pub(crate) ac: Option<AhoCorasick>,
pub(crate) gpu_backends: GpuBackendPeers,
pub(crate) gpu_acquisition_failures: Vec<GpuBackendAcquisitionFailure>,
pub(crate) gpu_literals: Option<Arc<Vec<Vec<u8>>>>,
#[cfg(feature = "gpu")]
pub(crate) gpu_max_literal_len: usize,
pub(crate) gpu_matcher: OnceLock<Option<vyre_libs::scan::GpuLiteralSet>>,
#[cfg(feature = "gpu")]
pub(crate) gpu_resident_literal_cuda: std::sync::Mutex<GpuResidentLiteralSlot>,
#[cfg(feature = "gpu")]
pub(crate) gpu_resident_literal_metal: std::sync::Mutex<GpuResidentLiteralSlot>,
#[cfg(feature = "gpu")]
pub(crate) gpu_resident_literal_wgpu: std::sync::Mutex<GpuResidentLiteralSlot>,
pub(crate) gpu_last_degrade_reason: std::sync::Mutex<Option<String>>,
pub(crate) gpu_degrade_count: std::sync::atomic::AtomicU64,
pub(crate) autoroute_gpu_shared_cold_ns: std::sync::atomic::AtomicU64,
pub(crate) static_intern: Arc<crate::static_intern::StaticInterner>,
pub(crate) detector_plans: crate::detector_plan::CompiledDetectorPlans,
pub(crate) assignment_keyword_matcher:
std::sync::Mutex<crate::assignment_keyword_matcher::AssignmentKeywordMatcherCache>,
#[cfg(feature = "gpu")]
pub(crate) ac_match_upper_bounds: Vec<Option<usize>>,
pub(crate) ac_map: Vec<CompiledPattern>,
pub(crate) structural_confirmed_patterns: Vec<Vec<usize>>,
pub(crate) pattern_boundary_context: boundary::BoundaryContextBytes,
pub(crate) suffix_gate_ac: Option<AhoCorasick>,
pub(crate) ac_suffix_gate: Vec<Vec<u32>>,
pub(crate) hot_confirmed_by_pattern: Vec<bool>,
pub(crate) confirmed_anchor_index:
Option<scan_postprocess::confirmed_anchor::ConfirmedAnchorIndex>,
pub(crate) prefix_propagation: CsrU32,
pub(crate) phase2_patterns: Vec<(CompiledPattern, Vec<String>)>,
pub(crate) structural_phase2_patterns: Vec<Vec<usize>>,
pub(crate) same_prefix_patterns: CsrU32,
pub(crate) phase2_keyword_ac: Option<AhoCorasick>,
pub(crate) phase2_keyword_to_patterns: CsrU32,
pub(crate) phase2_keyword_count: usize,
pub(crate) phase2_always_anchor_literal_count: usize,
#[cfg(feature = "gpu")]
pub(crate) confirmed_anchor_literal_count: usize,
#[cfg(feature = "gpu")]
pub(crate) generic_keyword_literal_count: usize,
pub(crate) phase2_always_active_indices: Vec<usize>,
pub(crate) phase2_always_active_prefilter: Option<phase2::Phase2AlwaysActivePrefilter>,
pub(crate) phase2_anchor_index: Option<phase2_anchor::Phase2AnchorIndex>,
#[cfg(feature = "gpu")]
pub(crate) phase2_gpu_dfa: phase2_gpu_dfa::Phase2GpuDfaCatalogCache,
pub(crate) tuning: phase2::ScannerTuning,
#[cfg(feature = "simd")]
pub(crate) simd_candidate_available: bool,
#[cfg(feature = "simd")]
pub(crate) simd_compile_plan: std::sync::Mutex<Option<SimdPhase1CompilePlan>>,
#[cfg(feature = "simd")]
pub(crate) simd_prefilter: OnceLock<std::result::Result<SimdPhase1Prefilter, String>>,
#[cfg(feature = "simd")]
pub(crate) simd_initialization_ns: std::sync::atomic::AtomicU64,
#[cfg(feature = "simdsieve")]
pub(crate) hot_pattern_slots: Vec<crate::simdsieve_prefilter::HotPatternSlot>,
pub config: ScannerConfig,
pub(crate) alphabet_screen: Option<crate::alphabet_filter::AlphabetScreen>,
pub(crate) bigram_bloom: crate::bigram_bloom::BigramBloom,
}
const _: () = {
const fn assert_send_sync<T: Send + Sync>() {}
let _ = assert_send_sync::<CompiledScanner>; };
#[cfg(test)]
mod max_inner_loop_iters_tests {
use super::MAX_INNER_LOOP_ITERS;
use crate::deadline::HOT_LOOP_DEADLINE_CADENCE;
#[test]
fn canonical_cap_is_one_million() {
assert_eq!(MAX_INNER_LOOP_ITERS, 1_000_000);
}
#[test]
fn cap_is_whole_multiple_of_deadline_cadence() {
assert_eq!(HOT_LOOP_DEADLINE_CADENCE, 64);
assert_eq!(MAX_INNER_LOOP_ITERS % HOT_LOOP_DEADLINE_CADENCE, 0);
assert_eq!(MAX_INNER_LOOP_ITERS / HOT_LOOP_DEADLINE_CADENCE, 15_625);
}
#[test]
fn bigram_bloom_min_chunk_bytes_is_sixty_four() {
assert_eq!(super::BIGRAM_BLOOM_MIN_CHUNK_BYTES, 64);
}
#[test]
fn boundary_seam_cap_matches_window_overlap() {
assert_eq!(
super::boundary::MAX_BOUNDARY_SEAM_BYTES,
crate::types::WINDOW_OVERLAP_BYTES
);
assert_eq!(super::boundary::MAX_BOUNDARY_SEAM_BYTES, 128 * 1024);
}
}