fix(tesseract): catches panic in init thread

This commit is contained in:
tretrauit 2024-01-23 23:40:46 +07:00
parent 093503cd97
commit 43a869660f
2 changed files with 58 additions and 11 deletions

View File

@ -338,7 +338,14 @@ pub async fn analyze_card_libtesseract(
let name_thread = task::spawn_blocking(move || {
// let mut leptess =
// libtesseract::init_tesseract(false).expect("Failed to initialize Tesseract");
let binding = unsafe { libtesseract::get_tesseract() };
let binding = unsafe {
match libtesseract::get_tesseract() {
Ok(b) => b,
Err(why) => {
panic!("{}", format!("Failed to get Tesseract: {:?}", why));
}
}
};
let mut leptess = binding.lock().unwrap();
let name_img = image_with_white_padding(card_clone.crop_imm(
CARD_NAME_X_OFFSET,
@ -366,7 +373,14 @@ pub async fn analyze_card_libtesseract(
let series_thread = task::spawn_blocking(move || {
// let mut leptess =
// libtesseract::init_tesseract(false).expect("Failed to initialize Tesseract");
let binding = unsafe { libtesseract::get_tesseract() };
let binding = unsafe {
match libtesseract::get_tesseract() {
Ok(b) => b,
Err(why) => {
panic!("{}", format!("Failed to get Tesseract: {:?}", why));
}
}
};
let mut leptess = binding.lock().unwrap();
let series_img = image_with_white_padding(card_clone.crop_imm(
CARD_SERIES_X_OFFSET,
@ -572,8 +586,7 @@ pub async fn analyze_drop_message(message: &Message) -> Result<Vec<DroppedCard>,
(i, execute_analyze_drop(card_img, i).await)
});
}
let mut handles: Vec<task::JoinHandle<(u32, Result<DroppedCard, String>)>> =
Vec::new();
let mut handles: Vec<task::JoinHandle<(u32, Result<DroppedCard, String>)>> = Vec::new();
for job in jobs {
let handle = task::spawn(job);
handles.push(handle);

View File

@ -1,21 +1,29 @@
pub use leptess::{LepTess, Variable};
use std::{
panic::catch_unwind,
sync::{Arc, Mutex},
thread,
};
use swordfish_common::error;
use tokio::task;
static mut TESSERACT_VEC: Vec<Arc<Mutex<LepTess>>> = Vec::new();
static mut TESSERACT_NUMERIC_VEC: Vec<Arc<Mutex<LepTess>>> = Vec::new();
pub unsafe fn get_tesseract() -> Arc<Mutex<LepTess>> {
pub unsafe fn get_tesseract() -> Result<Arc<Mutex<LepTess>>, String> {
let lep_tess: Arc<Mutex<LepTess>>;
if TESSERACT_VEC.len() == 0 {
lep_tess = Arc::new(Mutex::new(create_tesseract(false).unwrap()));
let ocr = match create_tesseract(false) {
Ok(ocr) => ocr,
Err(why) => {
return Err(format!("Failed to create Tesseract: {:?}", why));
}
};
lep_tess = Arc::new(Mutex::new(ocr));
} else {
lep_tess = TESSERACT_VEC.pop().unwrap();
}
lep_tess
Ok(lep_tess)
}
pub unsafe fn get_tesseract_numeric() -> Arc<Mutex<LepTess>> {
@ -72,12 +80,38 @@ pub async fn init() {
task::spawn_blocking(|| loop {
unsafe {
if TESSERACT_VEC.len() < 9 {
let ocr = create_tesseract(false).unwrap();
TESSERACT_VEC.push(Arc::new(Mutex::new(ocr)));
match catch_unwind(|| {
let ocr = match create_tesseract(false) {
Ok(ocr) => ocr,
Err(why) => {
error!("Failed to create Tesseract: {:?}", why);
return;
}
};
TESSERACT_VEC.push(Arc::new(Mutex::new(ocr)));
}) {
Ok(_) => (),
Err(why) => {
error!("Failed to create Tesseract: {:?}", why);
}
}
}
if TESSERACT_NUMERIC_VEC.len() < 9 {
let ocr = create_tesseract(true).unwrap();
TESSERACT_NUMERIC_VEC.push(Arc::new(Mutex::new(ocr)));
match catch_unwind(|| {
let ocr = match create_tesseract(true) {
Ok(ocr) => ocr,
Err(why) => {
error!("Failed to create Tesseract: {:?}", why);
return;
}
};
TESSERACT_NUMERIC_VEC.push(Arc::new(Mutex::new(ocr)));
}) {
Ok(_) => (),
Err(why) => {
error!("Failed to create Tesseract (numeric): {:?}", why);
}
}
}
}
thread::sleep(tokio::time::Duration::from_millis(500));