perf(borders): reduce mutex usage in hot path

This commit is contained in:
LGUG2Z
2024-06-09 06:53:04 -07:00
parent 9a58c1ee42
commit 41732e2f5f
6 changed files with 17 additions and 30 deletions
+4 -13
View File
@@ -4,7 +4,6 @@ use crate::border_manager::BORDER_WIDTH;
use crate::border_manager::FOCUSED; use crate::border_manager::FOCUSED;
use crate::border_manager::FOCUS_STATE; use crate::border_manager::FOCUS_STATE;
use crate::border_manager::MONOCLE; use crate::border_manager::MONOCLE;
use crate::border_manager::RECT_STATE;
use crate::border_manager::STACK; use crate::border_manager::STACK;
use crate::border_manager::STYLE; use crate::border_manager::STYLE;
use crate::border_manager::UNFOCUSED; use crate::border_manager::UNFOCUSED;
@@ -127,15 +126,9 @@ impl Border {
rect.add_margin(BORDER_WIDTH.load(Ordering::SeqCst)); rect.add_margin(BORDER_WIDTH.load(Ordering::SeqCst));
rect.add_padding(-BORDER_OFFSET.load(Ordering::SeqCst)); rect.add_padding(-BORDER_OFFSET.load(Ordering::SeqCst));
// Store the border rect so that it can be used by the callback
{
let mut rects = RECT_STATE.lock();
rects.insert(self.hwnd, rect);
}
// Update the position of the border if required // Update the position of the border if required
if !WindowsApi::window_rect(self.hwnd())?.eq(&rect) { if !WindowsApi::window_rect(self.hwnd())?.eq(&rect) {
WindowsApi::set_border_pos(self.hwnd(), &rect, HWND((*Z_ORDER.lock()).into()))?; WindowsApi::set_border_pos(self.hwnd(), &rect, HWND((Z_ORDER.load()).into()))?;
} }
// Invalidate the rect to trigger the callback to update colours etc. // Invalidate the rect to trigger the callback to update colours etc.
@@ -157,10 +150,8 @@ impl Border {
unsafe { unsafe {
match message { match message {
WM_PAINT => { WM_PAINT => {
let rects = RECT_STATE.lock(); // With the rect that we set in Self::update
if let Ok(rect) = WindowsApi::window_rect(window) {
// With the rect that we stored in Self::update
if let Some(rect) = rects.get(&window.0).copied() {
// Grab the focus kind for this border // Grab the focus kind for this border
let focus_kind = { let focus_kind = {
FOCUS_STATE FOCUS_STATE
@@ -195,7 +186,7 @@ impl Border {
// the window was made with DWMWCP_ROUNDSMALL then this is the // the window was made with DWMWCP_ROUNDSMALL then this is the
// wrong size. In the future we should read the DWM properties // wrong size. In the future we should read the DWM properties
// of windows and attempt to match appropriately. // of windows and attempt to match appropriately.
match *STYLE.lock() { match STYLE.load() {
BorderStyle::System => { BorderStyle::System => {
if *WINDOWS_11 { if *WINDOWS_11 {
RoundRect(hdc, 0, 0, rect.right, rect.bottom, 20, 20); RoundRect(hdc, 0, 0, rect.right, rect.bottom, 20, 20);
+7 -9
View File
@@ -4,6 +4,7 @@ mod border;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
use crossbeam_utils::atomic::AtomicCell;
use crossbeam_utils::atomic::AtomicConsume; use crossbeam_utils::atomic::AtomicConsume;
use komorebi_core::BorderStyle; use komorebi_core::BorderStyle;
use lazy_static::lazy_static; use lazy_static::lazy_static;
@@ -22,7 +23,6 @@ use windows::Win32::Foundation::HWND;
use crate::workspace_reconciliator::ALT_TAB_HWND; use crate::workspace_reconciliator::ALT_TAB_HWND;
use crate::Colour; use crate::Colour;
use crate::Rect;
use crate::Rgb; use crate::Rgb;
use crate::WindowManager; use crate::WindowManager;
use crate::WindowsApi; use crate::WindowsApi;
@@ -36,8 +36,8 @@ pub static BORDER_OFFSET: AtomicI32 = AtomicI32::new(-1);
pub static BORDER_ENABLED: AtomicBool = AtomicBool::new(true); pub static BORDER_ENABLED: AtomicBool = AtomicBool::new(true);
lazy_static! { lazy_static! {
pub static ref Z_ORDER: Arc<Mutex<ZOrder>> = Arc::new(Mutex::new(ZOrder::Bottom)); pub static ref Z_ORDER: AtomicCell<ZOrder> = AtomicCell::new(ZOrder::Bottom);
pub static ref STYLE: Arc<Mutex<BorderStyle>> = Arc::new(Mutex::new(BorderStyle::System)); pub static ref STYLE: AtomicCell<BorderStyle> = AtomicCell::new(BorderStyle::System);
pub static ref FOCUSED: AtomicU32 = pub static ref FOCUSED: AtomicU32 =
AtomicU32::new(u32::from(Colour::Rgb(Rgb::new(66, 165, 245)))); AtomicU32::new(u32::from(Colour::Rgb(Rgb::new(66, 165, 245))));
pub static ref UNFOCUSED: AtomicU32 = pub static ref UNFOCUSED: AtomicU32 =
@@ -50,7 +50,6 @@ lazy_static! {
lazy_static! { lazy_static! {
static ref BORDERS_MONITORS: Mutex<HashMap<String, usize>> = Mutex::new(HashMap::new()); static ref BORDERS_MONITORS: Mutex<HashMap<String, usize>> = Mutex::new(HashMap::new());
static ref BORDER_STATE: Mutex<HashMap<String, Border>> = Mutex::new(HashMap::new()); static ref BORDER_STATE: Mutex<HashMap<String, Border>> = Mutex::new(HashMap::new());
static ref RECT_STATE: Mutex<HashMap<isize, Rect>> = Mutex::new(HashMap::new());
static ref FOCUS_STATE: Mutex<HashMap<isize, WindowKind>> = Mutex::new(HashMap::new()); static ref FOCUS_STATE: Mutex<HashMap<isize, WindowKind>> = Mutex::new(HashMap::new());
} }
@@ -82,7 +81,6 @@ pub fn destroy_all_borders() -> color_eyre::Result<()> {
} }
borders.clear(); borders.clear();
RECT_STATE.lock().clear();
BORDERS_MONITORS.lock().clear(); BORDERS_MONITORS.lock().clear();
FOCUS_STATE.lock().clear(); FOCUS_STATE.lock().clear();
@@ -132,7 +130,7 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
let is_paused = state.is_paused; let is_paused = state.is_paused;
let focused_monitor_idx = state.focused_monitor_idx(); let focused_monitor_idx = state.focused_monitor_idx();
let monitors = state.monitors.elements().clone(); let monitors = state.monitors.elements().clone();
let pending_move_op = state.pending_move_op.clone(); let pending_move_op = state.pending_move_op;
drop(state); drop(state);
// If borders are disabled // If borders are disabled
@@ -266,8 +264,8 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
for (idx, c) in ws.containers().iter().enumerate() { for (idx, c) in ws.containers().iter().enumerate() {
// Update border when moving or resizing with mouse // Update border when moving or resizing with mouse
if pending_move_op.is_some() && idx == ws.focused_container_idx() { if pending_move_op.is_some() && idx == ws.focused_container_idx() {
let restore_z_order = *Z_ORDER.lock(); let restore_z_order = Z_ORDER.load();
*Z_ORDER.lock() = ZOrder::TopMost; Z_ORDER.store(ZOrder::TopMost);
let mut rect = WindowsApi::window_rect( let mut rect = WindowsApi::window_rect(
c.focused_window().copied().unwrap_or_default().hwnd(), c.focused_window().copied().unwrap_or_default().hwnd(),
@@ -295,7 +293,7 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
} }
} }
*Z_ORDER.lock() = restore_z_order; Z_ORDER.store(restore_z_order);
continue 'monitors; continue 'monitors;
} }
+1 -2
View File
@@ -1256,8 +1256,7 @@ impl WindowManager {
} }
}, },
SocketMessage::BorderStyle(style) => { SocketMessage::BorderStyle(style) => {
let mut border_style = STYLE.lock(); STYLE.store(style);
*border_style = style;
} }
SocketMessage::BorderWidth(width) => { SocketMessage::BorderWidth(width) => {
border_manager::BORDER_WIDTH.store(width, Ordering::SeqCst); border_manager::BORDER_WIDTH.store(width, Ordering::SeqCst);
+1 -1
View File
@@ -198,7 +198,7 @@ impl Stackbar {
bottom: height, bottom: height,
}; };
match *STYLE.lock() { match STYLE.load() {
BorderStyle::System => { BorderStyle::System => {
if *WINDOWS_11 { if *WINDOWS_11 {
RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, 20, 20); RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, 20, 20);
+3 -4
View File
@@ -481,8 +481,8 @@ impl From<&WindowManager> for StaticConfig {
transparency_alpha: Option::from( transparency_alpha: Option::from(
transparency_manager::TRANSPARENCY_ALPHA.load(Ordering::SeqCst), transparency_manager::TRANSPARENCY_ALPHA.load(Ordering::SeqCst),
), ),
border_style: Option::from(*STYLE.lock()), border_style: Option::from(STYLE.load()),
border_z_order: Option::from(*Z_ORDER.lock()), border_z_order: Option::from(Z_ORDER.load()),
default_workspace_padding: Option::from( default_workspace_padding: Option::from(
DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst), DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst),
), ),
@@ -556,8 +556,7 @@ impl StaticConfig {
} }
} }
let border_style = self.border_style.unwrap_or_default(); STYLE.store(self.border_style.unwrap_or_default());
*STYLE.lock() = border_style;
transparency_manager::TRANSPARENCY_ENABLED transparency_manager::TRANSPARENCY_ENABLED
.store(self.transparency.unwrap_or(false), Ordering::SeqCst); .store(self.transparency.unwrap_or(false), Ordering::SeqCst);
+1 -1
View File
@@ -164,7 +164,7 @@ impl Default for GlobalState {
border_manager::UNFOCUSED.load(Ordering::SeqCst), border_manager::UNFOCUSED.load(Ordering::SeqCst),
))), ))),
}, },
border_style: *STYLE.lock(), border_style: STYLE.load(),
border_offset: border_manager::BORDER_OFFSET.load(Ordering::SeqCst), border_offset: border_manager::BORDER_OFFSET.load(Ordering::SeqCst),
border_width: border_manager::BORDER_WIDTH.load(Ordering::SeqCst), border_width: border_manager::BORDER_WIDTH.load(Ordering::SeqCst),
stackbar_mode: STACKBAR_MODE.load(), stackbar_mode: STACKBAR_MODE.load(),