From fc9e4eec816c982d9ef714e6713cdddaf7cd274f Mon Sep 17 00:00:00 2001 From: wangdl Date: Sat, 6 Jun 2026 12:55:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20#38=20EVENT=5FBUFFER=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20MAX=5FBUFFER=5FSIZE=3D1000=20=E4=B8=8A=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit push_reading_event 时超出上限自动丢弃最旧事件,防止未导出事件堆积导致 OOM。 Co-Authored-By: Claude Opus 4.7 --- crates/zx_document_core/src/events.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/zx_document_core/src/events.rs b/crates/zx_document_core/src/events.rs index 56f4a93..7b9fed6 100644 --- a/crates/zx_document_core/src/events.rs +++ b/crates/zx_document_core/src/events.rs @@ -4,12 +4,19 @@ use serde::{Deserialize, Serialize}; use crate::progress::ReadingPosition; +/// Maximum number of events before oldest are dropped to prevent unbounded memory growth. +const MAX_BUFFER_SIZE: usize = 1000; + // Global event buffer, protected by a Mutex for thread safety. static EVENT_BUFFER: Mutex> = Mutex::new(Vec::new()); /// Push a reading event into the global buffer. +/// If the buffer exceeds MAX_BUFFER_SIZE, the oldest event is dropped. pub fn push_reading_event(event: ReadingEvent) { if let Ok(mut buf) = EVENT_BUFFER.lock() { + if buf.len() >= MAX_BUFFER_SIZE { + buf.remove(0); + } buf.push(event); } } @@ -45,7 +52,7 @@ fn now_ms() -> i64 { .unwrap_or(0) } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, uniffi::Enum)] #[serde(tag = "type")] pub enum ReadingEvent { MaterialOpened {