aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErk- <[email protected]>2018-12-22 14:04:31 +0100
committerAlex M. M <[email protected]>2018-12-22 14:04:31 +0100
commita2baca08bfd558ed7981cfe8ddb2659f3b6e9fb9 (patch)
tree498124365df67b3e2c3e18b6bc1383c3bfa2d70c
parentFix `Emoji::url` to use .gif for animated emoji (#449) (diff)
downloadserenity-a2baca08bfd558ed7981cfe8ddb2659f3b6e9fb9.tar.xz
serenity-a2baca08bfd558ed7981cfe8ddb2659f3b6e9fb9.zip
Implement the proposed change to the sharemap (`Mutex` => `RwLock`) (#453)
-rw-r--r--examples/05_command_framework/src/main.rs8
-rw-r--r--examples/06_voice/src/main.rs16
-rw-r--r--examples/10_voice_receive/src/main.rs6
-rw-r--r--src/client/bridge/gateway/shard_manager.rs5
-rw-r--r--src/client/bridge/gateway/shard_queuer.rs3
-rw-r--r--src/client/bridge/gateway/shard_runner.rs5
-rw-r--r--src/client/context.rs8
-rw-r--r--src/client/dispatch.rs10
-rw-r--r--src/client/mod.rs13
9 files changed, 37 insertions, 37 deletions
diff --git a/examples/05_command_framework/src/main.rs b/examples/05_command_framework/src/main.rs
index 1a6ca6c..fb6990a 100644
--- a/examples/05_command_framework/src/main.rs
+++ b/examples/05_command_framework/src/main.rs
@@ -54,7 +54,7 @@ fn main() {
let mut client = Client::new(&token, Handler).expect("Err creating client");
{
- let mut data = client.data.lock();
+ let mut data = client.data.write();
data.insert::<CommandCounter>(HashMap::default());
data.insert::<ShardManagerContainer>(Arc::clone(&client.shard_manager));
}
@@ -106,7 +106,7 @@ fn main() {
// Increment the number of times this command has been run once. If
// the command's name does not exist in the counter, add a default
// value of 0.
- let mut data = ctx.data.lock();
+ let mut data = ctx.data.write();
let counter = data.get_mut::<CommandCounter>().expect("Expected CommandCounter in ShareMap.");
let entry = counter.entry(command_name.to_string()).or_insert(0);
*entry += 1;
@@ -246,7 +246,7 @@ fn main() {
command!(commands(ctx, msg, _args) {
let mut contents = "Commands used:\n".to_string();
- let data = ctx.data.lock();
+ let data = ctx.data.read();
let counter = data.get::<CommandCounter>().expect("Expected CommandCounter in ShareMap.");
for (k, v) in counter {
@@ -375,7 +375,7 @@ command!(about(_ctx, msg, _args) {
command!(latency(ctx, msg, _args) {
// The shard manager is an interface for mutating, stopping, restarting, and
// retrieving information about shards.
- let data = ctx.data.lock();
+ let data = ctx.data.read();
let shard_manager = match data.get::<ShardManagerContainer>() {
Some(v) => v,
diff --git a/examples/06_voice/src/main.rs b/examples/06_voice/src/main.rs
index d24e2a6..8dbc4d5 100644
--- a/examples/06_voice/src/main.rs
+++ b/examples/06_voice/src/main.rs
@@ -56,7 +56,7 @@ fn main() {
// voice manager into it. This allows the voice manager to be accessible by
// event handlers and framework commands.
{
- let mut data = client.data.lock();
+ let mut data = client.data.write();
data.insert::<VoiceManager>(Arc::clone(&client.voice_manager));
}
@@ -86,7 +86,7 @@ command!(deafen(ctx, msg) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().unwrap();
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().unwrap();
let mut manager = manager_lock.lock();
let handler = match manager.get_mut(guild_id) {
@@ -134,7 +134,7 @@ command!(join(ctx, msg) {
}
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
if manager.join(guild_id, connect_to).is_some() {
@@ -154,7 +154,7 @@ command!(leave(ctx, msg) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
let has_handler = manager.get(guild_id).is_some();
@@ -177,7 +177,7 @@ command!(mute(ctx, msg) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
let handler = match manager.get_mut(guild_id) {
@@ -227,7 +227,7 @@ command!(play(ctx, msg, args) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
if let Some(handler) = manager.get_mut(guild_id) {
@@ -260,7 +260,7 @@ command!(undeafen(ctx, msg) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
if let Some(handler) = manager.get_mut(guild_id) {
@@ -281,7 +281,7 @@ command!(unmute(ctx, msg) {
return Ok(());
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
if let Some(handler) = manager.get_mut(guild_id) {
diff --git a/examples/10_voice_receive/src/main.rs b/examples/10_voice_receive/src/main.rs
index 113b769..7b95cc8 100644
--- a/examples/10_voice_receive/src/main.rs
+++ b/examples/10_voice_receive/src/main.rs
@@ -73,7 +73,7 @@ fn main() {
// voice manager into it. This allows the voice manager to be accessible by
// event handlers and framework commands.
{
- let mut data = client.data.lock();
+ let mut data = client.data.write();
data.insert::<VoiceManager>(Arc::clone(&client.voice_manager));
}
@@ -107,7 +107,7 @@ command!(join(ctx, msg, args) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
if let Some(handler) = manager.join(guild_id, connect_to) {
@@ -128,7 +128,7 @@ command!(leave(ctx, msg) {
},
};
- let mut manager_lock = ctx.data.lock().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
+ let mut manager_lock = ctx.data.read().get::<VoiceManager>().cloned().expect("Expected VoiceManager in ShareMap.");
let mut manager = manager_lock.lock();
let has_handler = manager.get(guild_id).is_some();
diff --git a/src/client/bridge/gateway/shard_manager.rs b/src/client/bridge/gateway/shard_manager.rs
index 579b003..74817ef 100644
--- a/src/client/bridge/gateway/shard_manager.rs
+++ b/src/client/bridge/gateway/shard_manager.rs
@@ -2,6 +2,7 @@ use crate::gateway::InterMessage;
use crate::internal::prelude::*;
use crate::CacheAndHttp;
use parking_lot::Mutex;
+use parking_lot::RwLock;
use std::{
collections::{HashMap, VecDeque},
sync::{
@@ -76,7 +77,7 @@ use crate::client::bridge::voice::ClientVoiceManager;
/// let token = Arc::new(Mutex::new(token));
///
/// let gateway_url = Arc::new(Mutex::new(http::get_gateway()?.url));
-/// let data = Arc::new(Mutex::new(ShareMap::custom()));
+/// let data = Arc::new(RwLock::new(ShareMap::custom()));
/// let event_handler = Arc::new(Handler);
/// let framework = Arc::new(Mutex::new(None));
/// let threadpool = ThreadPool::with_name("my threadpool".to_owned(), 5);
@@ -357,7 +358,7 @@ impl Drop for ShardManager {
}
pub struct ShardManagerOptions<'a, H: EventHandler + Send + Sync + 'static> {
- pub data: &'a Arc<Mutex<ShareMap>>,
+ pub data: &'a Arc<RwLock<ShareMap>>,
pub event_handler: &'a Arc<H>,
#[cfg(feature = "framework")]
pub framework: &'a Arc<Mutex<Option<Box<Framework + Send>>>>,
diff --git a/src/client/bridge/gateway/shard_queuer.rs b/src/client/bridge/gateway/shard_queuer.rs
index 12df4c8..54e4478 100644
--- a/src/client/bridge/gateway/shard_queuer.rs
+++ b/src/client/bridge/gateway/shard_queuer.rs
@@ -2,6 +2,7 @@ use crate::gateway::Shard;
use crate::internal::prelude::*;
use crate::CacheAndHttp;
use parking_lot::Mutex;
+use parking_lot::RwLock;
use std::{
collections::{HashMap, VecDeque},
sync::{
@@ -45,7 +46,7 @@ pub struct ShardQueuer<H: EventHandler + Send + Sync + 'static> {
/// dispatching.
///
/// [`Client::data`]: ../../struct.Client.html#structfield.data
- pub data: Arc<Mutex<ShareMap>>,
+ pub data: Arc<RwLock<ShareMap>>,
/// A reference to an `EventHandler`, such as the one given to the
/// [`Client`].
///
diff --git a/src/client/bridge/gateway/shard_runner.rs b/src/client/bridge/gateway/shard_runner.rs
index fe71462..f052e9f 100644
--- a/src/client/bridge/gateway/shard_runner.rs
+++ b/src/client/bridge/gateway/shard_runner.rs
@@ -4,6 +4,7 @@ use crate::internal::ws_impl::{ReceiverExt, SenderExt};
use crate::model::event::{Event, GatewayEvent};
use crate::CacheAndHttp;
use parking_lot::Mutex;
+use parking_lot::RwLock;
use serde::Deserialize;
use std::{
borrow::Cow,
@@ -38,7 +39,7 @@ use super::super::voice::ClientVoiceManager;
///
/// [`Shard`]: ../../../gateway/struct.Shard.html
pub struct ShardRunner<H: EventHandler + Send + Sync + 'static> {
- data: Arc<Mutex<ShareMap>>,
+ data: Arc<RwLock<ShareMap>>,
event_handler: Arc<H>,
#[cfg(feature = "framework")]
framework: Arc<Mutex<Option<Box<Framework + Send>>>>,
@@ -489,7 +490,7 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
///
/// [`ShardRunner::new`]: struct.ShardRunner.html#method.new
pub struct ShardRunnerOptions<H: EventHandler + Send + Sync + 'static> {
- pub data: Arc<Mutex<ShareMap>>,
+ pub data: Arc<RwLock<ShareMap>>,
pub event_handler: Arc<H>,
#[cfg(feature = "framework")]
pub framework: Arc<Mutex<Option<Box<Framework + Send>>>>,
diff --git a/src/client/context.rs b/src/client/context.rs
index ff92f5e..b3e14dc 100644
--- a/src/client/context.rs
+++ b/src/client/context.rs
@@ -4,7 +4,7 @@ use crate::error::Result;
use crate::gateway::InterMessage;
use crate::http;
use crate::model::prelude::*;
-use parking_lot::Mutex;
+use parking_lot::RwLock;
use serde_json::Value;
use std::sync::{
Arc,
@@ -15,8 +15,6 @@ use crate::utils::VecMap;
use crate::utils::vecmap_to_json_map;
#[cfg(feature = "cache")]
pub use crate::cache::Cache;
-#[cfg(feature = "cache")]
-use parking_lot::RwLock;
/// The context is a general utility struct provided on event dispatches, which
/// helps with dealing with the current "context" of the event dispatch.
@@ -39,7 +37,7 @@ pub struct Context {
/// information.
///
/// [`Client::data`]: struct.Client.html#structfield.data
- pub data: Arc<Mutex<ShareMap>>,
+ pub data: Arc<RwLock<ShareMap>>,
/// The messenger to communicate with the shard runner.
pub shard: ShardMessenger,
/// The ID of the shard this context is related to.
@@ -51,7 +49,7 @@ pub struct Context {
impl Context {
/// Create a new Context to be passed to an event handler.
pub(crate) fn new(
- data: Arc<Mutex<ShareMap>>,
+ data: Arc<RwLock<ShareMap>>,
runner_tx: Sender<InterMessage>,
shard_id: u64,
cache: Arc<RwLock<Cache>>,
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs
index 0425f29..57160d4 100644
--- a/src/client/dispatch.rs
+++ b/src/client/dispatch.rs
@@ -49,7 +49,7 @@ macro_rules! update {
#[cfg(feature = "cache")]
fn context(
- data: &Arc<Mutex<ShareMap>>,
+ data: &Arc<RwLock<ShareMap>>,
runner_tx: &Sender<InterMessage>,
shard_id: u64,
cache: &Arc<RwLock<Cache>>,
@@ -59,7 +59,7 @@ fn context(
#[cfg(not(feature = "cache"))]
fn context(
- data: &Arc<Mutex<ShareMap>>,
+ data: &Arc<RwLock<ShareMap>>,
runner_tx: &Sender<InterMessage>,
shard_id: u64,
) -> Context {
@@ -76,7 +76,7 @@ pub(crate) enum DispatchEvent {
pub(crate) fn dispatch<H: EventHandler + Send + Sync + 'static>(
event: DispatchEvent,
framework: &Arc<Mutex<Option<Box<Framework + Send>>>>,
- data: &Arc<Mutex<ShareMap>>,
+ data: &Arc<RwLock<ShareMap>>,
event_handler: &Arc<H>,
runner_tx: &Sender<InterMessage>,
threadpool: &ThreadPool,
@@ -119,7 +119,7 @@ pub(crate) fn dispatch<H: EventHandler + Send + Sync + 'static>(
#[allow(clippy::unused_mut)]
pub(crate) fn dispatch<H: EventHandler + Send + Sync + 'static>(
event: DispatchEvent,
- data: &Arc<Mutex<ShareMap>>,
+ data: &Arc<RwLock<ShareMap>>,
event_handler: &Arc<H>,
runner_tx: &Sender<InterMessage>,
threadpool: &ThreadPool,
@@ -166,7 +166,7 @@ fn dispatch_message<H>(
#[allow(clippy::cyclomatic_complexity, unused_assignments, unused_mut)]
fn handle_event<H: EventHandler + Send + Sync + 'static>(
event: DispatchEvent,
- data: &Arc<Mutex<ShareMap>>,
+ data: &Arc<RwLock<ShareMap>>,
event_handler: &Arc<H>,
runner_tx: &Sender<InterMessage>,
threadpool: &ThreadPool,
diff --git a/src/client/mod.rs b/src/client/mod.rs
index bbedf89..164fea7 100644
--- a/src/client/mod.rs
+++ b/src/client/mod.rs
@@ -40,12 +40,11 @@ pub use crate::http as rest;
#[cfg(feature = "cache")]
pub use crate::cache::Cache;
-#[cfg(feature = "cache")]
-use parking_lot::RwLock;
use crate::http;
use crate::internal::prelude::*;
use parking_lot::Mutex;
+use parking_lot::RwLock;
use self::bridge::gateway::{ShardManager, ShardManagerMonitor, ShardManagerOptions};
use std::{sync::Arc, time::Duration};
use threadpool::ThreadPool;
@@ -141,7 +140,7 @@ pub struct Client {
/// macro_rules! reg {
/// ($ctx:ident $name:expr) => {
/// {
- /// let mut data = $ctx.data.lock();
+ /// let mut data = $ctx.data.write();
/// let counter = data.get_mut::<MessageEventCounter>().unwrap();
/// let entry = counter.entry($name).or_insert(0);
/// *entry += 1;
@@ -164,7 +163,7 @@ pub struct Client {
/// let mut client = Client::new(&env::var("DISCORD_TOKEN").unwrap(), Handler);
///
/// {
- /// let mut data = client.data.lock();
+ /// let mut data = client.data.write();
/// data.insert::<MessageEventCounter>(HashMap::default());
/// }
///
@@ -179,7 +178,7 @@ pub struct Client {
/// [`Event::MessageDeleteBulk`]: ../model/event/enum.Event.html#variant.MessageDeleteBulk
/// [`Event::MessageUpdate`]: ../model/event/enum.Event.html#variant.MessageUpdate
/// [example 05]: https://github.com/serenity-rs/serenity/tree/current/examples/05_command_framework
- pub data: Arc<Mutex<ShareMap>>,
+ pub data: Arc<RwLock<ShareMap>>,
/// A vector of all active shards that have received their [`Event::Ready`]
/// payload, and have dispatched to [`on_ready`] if an event handler was
/// configured.
@@ -348,7 +347,7 @@ impl Client {
let name = "serenity client".to_owned();
let threadpool = ThreadPool::with_name(name, 5);
let url = Arc::new(Mutex::new(http::get_gateway()?.url));
- let data = Arc::new(Mutex::new(ShareMap::custom()));
+ let data = Arc::new(RwLock::new(ShareMap::custom()));
let event_handler = Arc::new(handler);
#[cfg(feature = "framework")]
@@ -451,7 +450,7 @@ impl Client {
let name = "serenity client".to_owned();
let threadpool = ThreadPool::with_name(name, 5);
let url = Arc::new(Mutex::new(http::get_gateway()?.url));
- let data = Arc::new(Mutex::new(ShareMap::custom()));
+ let data = Arc::new(RwLock::new(ShareMap::custom()));
let event_handler = Arc::new(handler);
#[cfg(feature = "framework")]