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:
parent
1a246445fe
commit
fc9e4eec81
@ -4,12 +4,19 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::progress::ReadingPosition;
|
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.
|
// Global event buffer, protected by a Mutex for thread safety.
|
||||||
static EVENT_BUFFER: Mutex<Vec<ReadingEvent>> = Mutex::new(Vec::new());
|
static EVENT_BUFFER: Mutex<Vec<ReadingEvent>> = Mutex::new(Vec::new());
|
||||||
|
|
||||||
/// Push a reading event into the global buffer.
|
/// 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) {
|
pub fn push_reading_event(event: ReadingEvent) {
|
||||||
if let Ok(mut buf) = EVENT_BUFFER.lock() {
|
if let Ok(mut buf) = EVENT_BUFFER.lock() {
|
||||||
|
if buf.len() >= MAX_BUFFER_SIZE {
|
||||||
|
buf.remove(0);
|
||||||
|
}
|
||||||
buf.push(event);
|
buf.push(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -45,7 +52,7 @@ fn now_ms() -> i64 {
|
|||||||
.unwrap_or(0)
|
.unwrap_or(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, uniffi::Enum)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
pub enum ReadingEvent {
|
pub enum ReadingEvent {
|
||||||
MaterialOpened {
|
MaterialOpened {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user