Switch to parking_lot::RwLock

This commit is contained in:
Eric Zhang 2021-06-01 14:38:10 -05:00
parent 8d3d9c6604
commit 56b2a23bf1

View file

@ -6,10 +6,8 @@ use std::time::Duration;
use futures::prelude::*;
use log::{error, info};
use tokio::{
sync::{Notify, RwLock},
time,
};
use parking_lot::RwLock;
use tokio::{sync::Notify, time};
use warp::{
filters::BoxedFilter,
ws::{Message, WebSocket, Ws},
@ -54,7 +52,7 @@ impl Rustpad {
let mut revision: usize = 0;
loop {
if self.num_messages().await > revision {
if self.num_messages() > revision {
match self.send_messages(revision, &mut socket).await {
Ok(new_revision) => revision = new_revision,
Err(e) => {
@ -87,8 +85,8 @@ impl Rustpad {
info!("disconnection, id = {}", id);
}
async fn num_messages(&self) -> usize {
let state = self.state.read().await;
fn num_messages(&self) -> usize {
let state = self.state.read();
state.messages.len()
}
@ -97,17 +95,21 @@ impl Rustpad {
revision: usize,
socket: &mut WebSocket,
) -> Result<usize, warp::Error> {
let state = self.state.read().await;
let len = state.messages.len();
if revision < len {
let messages = serde_json::to_string(&state.messages[revision..])
.expect("serde serialization failed for messages");
drop(state);
socket.send(Message::text(&messages)).await?;
Ok(len)
} else {
Ok(revision)
let messages = {
let state = self.state.read();
let len = state.messages.len();
if revision < len {
state.messages[revision..].to_owned()
} else {
Vec::new()
}
};
if !messages.is_empty() {
let serialized = serde_json::to_string(&messages)
.expect("serde serialization failed for messages vec");
socket.send(Message::text(&serialized)).await?;
}
Ok(revision + messages.len())
}
async fn handle_message(&self, id: u64, message: Message) {
@ -116,7 +118,7 @@ impl Rustpad {
Err(()) => return, // Ignore non-text messages
};
let mut state = self.state.write().await;
let mut state = self.state.write();
state.messages.push((id, text));
self.notify.notify_waiters();
}