From 0f13518aa4be5ea5a10127b959bb88e3a0df892e Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 25 Jul 2024 14:10:15 +0200 Subject: only multithread if overhead is small enough --- src/sheet/mod.rs | 60 ++++++++------------------------------------------------ 1 file changed, 8 insertions(+), 52 deletions(-) (limited to 'src/sheet/mod.rs') diff --git a/src/sheet/mod.rs b/src/sheet/mod.rs index 18ccee0..11f95c9 100644 --- a/src/sheet/mod.rs +++ b/src/sheet/mod.rs @@ -1,13 +1,11 @@ -use std::{ - sync::{Arc, Mutex, RwLock}, - thread::JoinHandle, -}; +use std::sync::Mutex; use cell::{Cell, CellRef}; use mlua::prelude::*; use register::{Register, SheetId}; pub mod cell; +pub mod eval; pub mod register; #[derive(Debug, Default)] @@ -43,7 +41,9 @@ impl Sheet { } pub fn get_ref(&self, row: usize, column: usize) -> Option { - CellRef::new(self.id, row, column) + self.get_cell(row, column).map(|cell| { + unsafe { CellRef::new(self.id, row, column, cell.clone()) } + }) } pub fn height(&self) -> usize { @@ -113,56 +113,12 @@ impl LuaUserData for SheetLuaRef { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_method_mut("cell", |lua, luaref, (row, column): (usize, usize)| { - if let Some(_) = Register::get(luaref.id) { - Ok(CellRef::new(luaref.id, row, column).into_lua(lua).unwrap()) + if let Some(rw) = Register::get(luaref.id) { + let sheet = rw.read().unwrap(); + Ok(sheet.get_ref(row, column).into_lua(lua).unwrap()) } else { Ok(LuaValue::Nil) } }) } } - -pub trait EvalFunction { - fn eval_function( - &self, - func: String, - range: Vec<(usize, usize)>, - ) -> JoinHandle>; -} - -impl EvalFunction for Arc> { - fn eval_function( - &self, - func_text: String, - range: Vec<(usize, usize)>, - ) -> JoinHandle> { - let this = Arc::clone(self); - std::thread::spawn(move || { - let read_sheet = this.read().unwrap(); - *read_sheet.progress.lock().unwrap() = 0; - let mut sheet = read_sheet.clone(); - - let lua = crate::lua::new_instance().unwrap(); - let result = lua - .load(func_text.clone()) - .set_name("Temp Script") - .eval::(); - - match result { - Ok(func) => { - for (i, (row, column)) in range.iter().enumerate() { - *read_sheet.progress.lock().unwrap() = (i * 100 / range.len()) as u8; - let cellref = read_sheet.get_ref(*row, *column); - match func.call::<_, Cell>(cellref) { - Ok(cell) => sheet.set_cell(*row, *column, cell), - Err(error) => return Err(error.to_string()), - } - } - } - Err(error) => return Err(error.to_string()), - } - - Ok(sheet) - }) - } -} -- cgit v1.2.3-70-g09d2