Browse Source

Prevent OOM abort when printing large strings

jmap
Manos Pitsidianakis 2 years ago
parent
commit
f3c938d8c3
Signed by: epilys GPG Key ID: 73627C2F690DF710
  1. 13
      text_processing/src/lib.rs
  2. 5
      ui/src/terminal/cells.rs
  3. 7
      ui/src/workers.rs

13
text_processing/src/lib.rs

@ -7,3 +7,16 @@ pub mod wcwidth;
pub use grapheme_clusters::*;
pub use line_break::*;
pub use wcwidth::*;
pub trait Truncate {
fn truncate_at_boundary(self, new_len: usize);
}
impl Truncate for &mut String {
fn truncate_at_boundary(self, mut new_len: usize) {
while new_len > 0 && !self.is_char_boundary(new_len) {
new_len -= 1;
}
String::truncate(self, new_len);
}
}

5
ui/src/terminal/cells.rs

@ -172,6 +172,11 @@ impl CellBuffer {
self.rows = newrows;
return;
}
if newlen >= 200_000 {
return;
}
let mut newbuf: Vec<Cell> = Vec::with_capacity(newlen);
for y in 0..newrows {
for x in 0..newcols {

7
ui/src/workers.rs

@ -8,6 +8,7 @@ use melib::async_workers::{Work, WorkContext};
use std::sync::Arc;
use std::sync::Mutex;
use std::thread;
use text_processing::Truncate;
const MAX_WORKER: usize = 4;
@ -235,7 +236,8 @@ impl WorkController {
}
}
recv(set_name_rx) -> new_name => {
if let Ok((thread_id, new_name)) = new_name {
if let Ok((thread_id, mut new_name)) = new_name {
new_name.truncate_at_boundary(256);
let mut threads = threads_lock.lock().unwrap();
let mut static_threads = _static_threads_lock.lock().unwrap();
if threads.contains_key(&thread_id) {
@ -249,7 +251,8 @@ impl WorkController {
}
}
recv(set_status_rx) -> new_status => {
if let Ok((thread_id, new_status)) = new_status {
if let Ok((thread_id, mut new_status)) = new_status {
new_status.truncate_at_boundary(256);
let mut threads = threads_lock.lock().unwrap();
let mut static_threads = _static_threads_lock.lock().unwrap();
if threads.contains_key(&thread_id) {

Loading…
Cancel
Save