fix: #38 EVENT_BUFFER 增加 MAX_BUFFER_SIZE=1000 上限

push_reading_event 时超出上限自动丢弃最旧事件,防止未导出事件堆积导致 OOM。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
wangdl 2026-06-06 12:55:00 +08:00
parent 1a246445fe
commit fc9e4eec81

View File

@ -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<Vec<ReadingEvent>> = 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 {