Quellcode durchsuchen

Switch to `parking_lot::RwLock`

Eric Zhang vor 4 Jahren
Ursprung
Commit
56b2a23bf1
1 geänderte Dateien mit 20 neuen und 18 gelöschten Zeilen
  1. 20 18
      rustpad-server/src/server.rs

+ 20 - 18
rustpad-server/src/server.rs

@@ -6,10 +6,8 @@ use std::time::Duration;
 
 
 use futures::prelude::*;
 use futures::prelude::*;
 use log::{error, info};
 use log::{error, info};
-use tokio::{
-    sync::{Notify, RwLock},
-    time,
-};
+use parking_lot::RwLock;
+use tokio::{sync::Notify, time};
 use warp::{
 use warp::{
     filters::BoxedFilter,
     filters::BoxedFilter,
     ws::{Message, WebSocket, Ws},
     ws::{Message, WebSocket, Ws},
@@ -54,7 +52,7 @@ impl Rustpad {
         let mut revision: usize = 0;
         let mut revision: usize = 0;
 
 
         loop {
         loop {
-            if self.num_messages().await > revision {
+            if self.num_messages() > revision {
                 match self.send_messages(revision, &mut socket).await {
                 match self.send_messages(revision, &mut socket).await {
                     Ok(new_revision) => revision = new_revision,
                     Ok(new_revision) => revision = new_revision,
                     Err(e) => {
                     Err(e) => {
@@ -87,8 +85,8 @@ impl Rustpad {
         info!("disconnection, id = {}", id);
         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()
         state.messages.len()
     }
     }
 
 
@@ -97,17 +95,21 @@ impl Rustpad {
         revision: usize,
         revision: usize,
         socket: &mut WebSocket,
         socket: &mut WebSocket,
     ) -> Result<usize, warp::Error> {
     ) -> 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) {
     async fn handle_message(&self, id: u64, message: Message) {
@@ -116,7 +118,7 @@ impl Rustpad {
             Err(()) => return, // Ignore non-text messages
             Err(()) => return, // Ignore non-text messages
         };
         };
 
 
-        let mut state = self.state.write().await;
+        let mut state = self.state.write();
         state.messages.push((id, text));
         state.messages.push((id, text));
         self.notify.notify_waiters();
         self.notify.notify_waiters();
     }
     }