Switch to parking_lot::RwLock
This commit is contained in:
parent
8d3d9c6604
commit
56b2a23bf1
1 changed files with 20 additions and 18 deletions
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue