diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-10 19:06:46 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-10 19:06:46 +0200 |
| commit | 63cfcbe7a7745b276de58ec92e0141b958c44feb (patch) | |
| tree | 990e33a83756e27187033579ee2f85d5c79169d5 /src/state | |
| parent | b747ca8af52129876b577a4f20f7105a05c6b002 (diff) | |
use unsafe blocks instead of mutexes
Diffstat (limited to 'src/state')
| -rw-r--r-- | src/state/bar.rs | 8 | ||||
| -rw-r--r-- | src/state/editor/bar.rs | 3 | ||||
| -rw-r--r-- | src/state/editor/mod.rs | 24 | ||||
| -rw-r--r-- | src/state/log.rs | 4 | ||||
| -rw-r--r-- | src/state/mod.rs | 18 | ||||
| -rw-r--r-- | src/state/view/bar.rs | 3 | ||||
| -rw-r--r-- | src/state/view/mod.rs | 37 |
7 files changed, 35 insertions, 62 deletions
diff --git a/src/state/bar.rs b/src/state/bar.rs index 2f8e6aa..ea69dfe 100644 --- a/src/state/bar.rs +++ b/src/state/bar.rs @@ -1,5 +1,5 @@ macro_rules! BarState { - ($name:ident, $type:ty, $cfg:expr, $cfg_mut:expr) => { + ($name:ident, $type:ty, $cfg:expr) => { use crate::lua::evalsto::EvalTo; use crate::widgets::statusbar::StatusBar; use mlua::{Lua, UserData}; @@ -36,19 +36,19 @@ macro_rules! BarState { fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("left", |_, _| Ok($cfg.left.clone())); fields.add_field_function_set("left", |_, _, style: EvalTo<String, $type>| { - $cfg_mut.left = style; + $cfg.left = style; Ok(()) }); fields.add_field_function_get("middle", |_, _| Ok($cfg.middle.clone())); fields.add_field_function_set("middle", |_, _, style: EvalTo<String, $type>| { - $cfg_mut.middle = style; + $cfg.middle = style; Ok(()) }); fields.add_field_function_get("right", |_, _| Ok($cfg.right.clone())); fields.add_field_function_set("right", |_, _, style: EvalTo<String, $type>| { - $cfg_mut.right = style; + $cfg.right = style; Ok(()) }); } diff --git a/src/state/editor/bar.rs b/src/state/editor/bar.rs index 752d021..f6163af 100644 --- a/src/state/editor/bar.rs +++ b/src/state/editor/bar.rs @@ -3,6 +3,5 @@ use crate::state::{bar::BarState, GlobalState}; BarState!( EditorBarState, (), - GlobalState::instance().editor.bar, - GlobalState::instance_mut().editor.bar + GlobalState::get().editor.bar ); diff --git a/src/state/editor/mod.rs b/src/state/editor/mod.rs index 3639226..3e9d9e0 100644 --- a/src/state/editor/mod.rs +++ b/src/state/editor/mod.rs @@ -19,13 +19,7 @@ pub struct EditorState { macro_rules! cfg { () => { - GlobalState::instance().editor - }; -} - -macro_rules! cfg_mut { - () => { - GlobalState::instance_mut().editor + GlobalState::get().editor }; } @@ -51,12 +45,11 @@ impl UserData for EditorState { fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("visible", |_, _| Ok(cfg!().visible)); fields.add_field_function_set("visible", |_, _, visible: bool| { - let mut state = GlobalState::instance_mut(); - state.editor.visible = visible; + cfg!().visible = visible; - if let Window::Editor = state.active_window { + if let Window::Editor = GlobalState::get().active_window { if !visible { - state.set_focus(Window::View); + GlobalState::get().set_focus(Window::View); } } @@ -65,17 +58,16 @@ impl UserData for EditorState { fields.add_field_function_get("content", |_, _| Ok(cfg!().buffer.as_string())); fields.add_field_function_set("content", |_, _, content: String| { - cfg_mut!().buffer.set_lines_from_string(content); + cfg!().buffer.set_lines_from_string(content); Ok(()) }); fields.add_field_function_get("cursor_shape", |_, _| Ok(cfg!().cursor_shape)); fields.add_field_function_set("cursor_shape", |_, _, shape: CursorShape| { - cfg_mut!().cursor_shape = shape; + cfg!().cursor_shape = shape; Ok(()) }); - fields.add_field_function_get("lines", |lua, _| { let table = lua.create_table()?; @@ -86,7 +78,7 @@ impl UserData for EditorState { Ok(table) }); fields.add_field_function_set("lines", |_, _, content: String| { - cfg_mut!().buffer.set_lines_from_string(content); + cfg!().buffer.set_lines_from_string(content); Ok(()) }); @@ -100,7 +92,7 @@ impl UserData for EditorState { }); methods.add_function("move_cursor", |_, m: CursorMove| { - cfg_mut!().buffer.move_cursor(m); + cfg!().buffer.move_cursor(m); Ok(()) }) } diff --git a/src/state/log.rs b/src/state/log.rs index f9b4665..6c0c924 100644 --- a/src/state/log.rs +++ b/src/state/log.rs @@ -14,7 +14,7 @@ impl LogState { macro_rules! cfg { () => { - GlobalState::instance().log + GlobalState::get().log }; } @@ -22,7 +22,7 @@ impl UserData for LogState { fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("visible", |_, _| Ok(cfg!().visible)); fields.add_field_function_set("visible", |_, _, visible: bool| { - let mut state = GlobalState::instance_mut(); + let state = GlobalState::get(); state.log.visible = visible; if let Window::Log = state.active_window { diff --git a/src/state/mod.rs b/src/state/mod.rs index 138b597..1b1430d 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -1,4 +1,4 @@ -use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +use std::ptr::addr_of_mut; use mlua::{UserData, UserDataFields}; @@ -19,7 +19,6 @@ pub struct GlobalState { pub exit: bool, } -static GLOBAL_STATE: RwLock<GlobalState> = RwLock::new(GlobalState::new()); const DUMMY_STATE: GlobalState = GlobalState::new(); impl GlobalState { @@ -33,12 +32,9 @@ impl GlobalState { } } - pub fn instance() -> RwLockReadGuard<'static, Self> { - GLOBAL_STATE.read().unwrap() - } - - pub fn instance_mut() -> RwLockWriteGuard<'static, Self> { - GLOBAL_STATE.write().unwrap() + pub fn get() -> &'static mut Self { + static mut GLOBAL_STATE: GlobalState = GlobalState::new(); + unsafe { &mut *addr_of_mut!(GLOBAL_STATE) } } pub fn set_focus(&mut self, win: window::Window) { @@ -58,17 +54,17 @@ impl UserData for GlobalState { fields.add_field_function_get("editor", |_, _| Ok(DUMMY_STATE.editor)); fields.add_field_function_get("log", |_, _| Ok(DUMMY_STATE.log)); fields.add_field_function_get("active_window", |_, _| { - Ok(GlobalState::instance().active_window) + Ok(GlobalState::get().active_window) }); fields.add_field_function_set("active_window", |_, _, win: window::Window| { - GlobalState::instance_mut().set_focus(win); + GlobalState::get().set_focus(win); Ok(()) }); } fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_function("quit", |_, _: ()| { - GlobalState::instance_mut().exit = true; + GlobalState::get().exit = true; Ok(()) }) } diff --git a/src/state/view/bar.rs b/src/state/view/bar.rs index 57898f5..f935de7 100644 --- a/src/state/view/bar.rs +++ b/src/state/view/bar.rs @@ -5,6 +5,5 @@ use super::mode::Mode; BarState!( SheetViewBarState, Mode, - GlobalState::instance().view.bar, - GlobalState::instance_mut().view.bar + GlobalState::get().view.bar ); diff --git a/src/state/view/mod.rs b/src/state/view/mod.rs index 961c4ca..41937a1 100644 --- a/src/state/view/mod.rs +++ b/src/state/view/mod.rs @@ -1,5 +1,3 @@ -use std::sync::{Arc, RwLock}; - use mlua::{IntoLua, UserData, Value}; use self::{bar::SheetViewBarState, mode::Mode}; @@ -37,24 +35,19 @@ impl SheetViewState { } } - pub fn set_active_sheet(&mut self, sheet: Option<SheetId>) { - if let Some(id) = sheet { - if let Some(lock) = Register::get(id) { - let sheet = lock.read().unwrap(); + pub fn set_active_sheet(&mut self, active: Option<SheetId>) { + if let Some(id) = active { + if let Some(sheet) = Register::get(id) { self.cursor.set_x_max(sheet.width() - 1); self.cursor.set_y_max(sheet.height() - 1); } } - self.active_sheet = sheet + self.active_sheet = active } - pub fn active_sheet(&self) -> Option<Arc<RwLock<Sheet>>> { - if let Some(id) = self.active_sheet { - Register::get(id) - } else { - None - } + pub fn active_sheet(&self) -> Option<&'static mut Sheet> { + Register::get(self.active_sheet?) } pub fn cancel_mode(&mut self) { @@ -121,13 +114,7 @@ impl SheetViewState { macro_rules! cfg { () => { - GlobalState::instance().view - }; -} - -macro_rules! cfg_mut { - () => { - GlobalState::instance_mut().view + GlobalState::get().view }; } @@ -143,9 +130,9 @@ impl UserData for SheetViewState { fields.add_field_function_set("active", |_, _, sheet: Option<SheetLuaRef>| { if let Some(r) = sheet { - cfg_mut!().active_sheet = Some(r.id()) + cfg!().active_sheet = Some(r.id()) } else { - cfg_mut!().active_sheet = None + cfg!().active_sheet = None } Ok(()) @@ -160,7 +147,7 @@ impl UserData for SheetViewState { fields.add_field_function_get("mode", |_, _| Ok(cfg!().mode)); fields.add_field_function_set("mode", |_, _, mode: Mode| { - let this = &mut cfg_mut!(); + let this = &mut cfg!(); match mode { Mode::Visual => match this.mode { Mode::Visual => {} @@ -177,12 +164,12 @@ impl UserData for SheetViewState { fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_function("move_cursor", |_, m: CursorMove| { - cfg_mut!().cursor.move_checked(m); + cfg!().cursor.move_checked(m); Ok(()) }); methods.add_function("cancel_mode", |_, _: ()| { - cfg_mut!().cancel_mode(); + cfg!().cancel_mode(); Ok(()) }) } |