From 7264c3294b3c460da459774058c9b9fa77edac12 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Aug 2018 22:07:09 +0300 Subject: finer concurrency --- src/lib.rs | 1 + src/yellow/red.rs | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index a7705ab66..94d843db3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,6 +24,7 @@ extern crate itertools; extern crate text_unit; extern crate unicode_xid; extern crate drop_bomb; +extern crate parking_lot; pub mod algo; pub mod ast; diff --git a/src/yellow/red.rs b/src/yellow/red.rs index c3d6c5f4f..e124fc76e 100644 --- a/src/yellow/red.rs +++ b/src/yellow/red.rs @@ -1,4 +1,5 @@ -use std::{ptr, sync::RwLock}; +use std::ptr; +use parking_lot::RwLock; use {yellow::GreenNode, TextUnit}; #[derive(Debug)] @@ -66,20 +67,20 @@ impl RedNode { if idx >= self.n_children() { return None; } - match &self.children.read().unwrap()[idx] { + match &self.children.read()[idx] { Some(child) => return Some(child.into()), None => (), } - let mut children = self.children.write().unwrap(); + let green_children = self.green.children(); + let start_offset = self.start_offset() + + green_children[..idx] + .iter() + .map(|x| x.text_len()) + .sum::(); + let child = + RedNode::new_child(green_children[idx].clone(), self.into(), start_offset, idx); + let mut children = self.children.write(); if children[idx].is_none() { - let green_children = self.green.children(); - let start_offset = self.start_offset() - + green_children[..idx] - .iter() - .map(|x| x.text_len()) - .sum::(); - let child = - RedNode::new_child(green_children[idx].clone(), self.into(), start_offset, idx); children[idx] = Some(child) } Some(children[idx].as_ref().unwrap().into()) -- cgit v1.2.3