diff options
| author | Jokler <jokler.contact@gmail.com> | 2017-11-16 02:36:12 +0100 |
|---|---|---|
| committer | Jokler <jokler.contact@gmail.com> | 2017-11-16 02:36:12 +0100 |
| commit | e591ce43d3f9b85572f7ca179799fd6c3191f3ab (patch) | |
| tree | e3fafbfce1b8f3f3284c4dfb52285c14e60f1921 | |
| parent | 4c18f59ac4dfe1372374ecc63a5976ad58a5e272 (diff) | |
| download | frippy-e591ce43d3f9b85572f7ca179799fd6c3191f3ab.tar.gz frippy-e591ce43d3f9b85572f7ca179799fd6c3191f3ab.zip | |
Remove mutexes around plugins
Mutexes are supposed to only mark critical sections
so locking the entire plugin is too general.
Any plugins that need mutable data
should use mutexes internally instead.
| -rw-r--r-- | src/plugin.rs | 28 | ||||
| -rw-r--r-- | src/plugins/currency.rs | 4 | ||||
| -rw-r--r-- | src/plugins/emoji.rs | 4 | ||||
| -rw-r--r-- | src/plugins/help.rs | 4 |
4 files changed, 15 insertions, 25 deletions
diff --git a/src/plugin.rs b/src/plugin.rs index fb35668..d1f849a 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -1,15 +1,15 @@ use std::fmt; use std::collections::HashMap; use std::thread::spawn; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use irc::client::prelude::*; use irc::error::Error as IrcError; pub trait Plugin: PluginName + Send + Sync + fmt::Debug { fn is_allowed(&self, server: &IrcServer, message: &Message) -> bool; - fn execute(&mut self, server: &IrcServer, message: &Message) -> Result<(), IrcError>; - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError>; + fn execute(&self, server: &IrcServer, message: &Message) -> Result<(), IrcError>; + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError>; } pub trait PluginName: Send + Sync + fmt::Debug { @@ -65,19 +65,9 @@ impl PluginCommand { } } -// Lock the mutex and ignore if it is poisoned -macro_rules! lock_plugin { - ($e:expr) => { - match $e.lock() { - Ok(plugin) => plugin, - Err(poisoned) => poisoned.into_inner(), - } - } -} - #[derive(Clone, Debug)] pub struct ThreadedPlugins { - plugins: HashMap<String, Arc<Mutex<Plugin>>>, + plugins: HashMap<String, Arc<Plugin>>, } impl ThreadedPlugins { @@ -87,7 +77,7 @@ impl ThreadedPlugins { pub fn add<T: Plugin + 'static>(&mut self, plugin: T) { let name = plugin.name().to_lowercase(); - let safe_plugin = Arc::new(Mutex::new(plugin)); + let safe_plugin = Arc::new(plugin); self.plugins.insert(name, safe_plugin); } @@ -96,7 +86,7 @@ impl ThreadedPlugins { for (name, plugin) in self.plugins.clone() { // Send the message to the plugin if the plugin needs it - if lock_plugin!(plugin).is_allowed(server, &message) { + if plugin.is_allowed(server, &message) { debug!("Executing {} with {}", name, @@ -110,7 +100,7 @@ impl ThreadedPlugins { // Execute the plugin in another thread spawn(move || { - if let Err(e) = lock_plugin!(plugin).execute(&server, &message) { + if let Err(e) = plugin.execute(&server, &message) { error!("Error in {} - {}", name, e); }; }); @@ -140,7 +130,7 @@ impl ThreadedPlugins { let server = server.clone(); let plugin = Arc::clone(plugin); spawn(move || { - if let Err(e) = lock_plugin!(plugin).command(&server, command) { + if let Err(e) = plugin.command(&server, command) { error!("Error in {} command - {}", name, e); }; }); @@ -162,7 +152,7 @@ impl fmt::Display for ThreadedPlugins { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let plugin_names = self.plugins .iter() - .map(|(_, p)| lock_plugin!(p).name().to_string()) + .map(|(_, p)| p.name().to_string()) .collect::<Vec<String>>(); write!(f, "{}", plugin_names.join(", ")) } diff --git a/src/plugins/currency.rs b/src/plugins/currency.rs index 4ba2531..d6cf928 100644 --- a/src/plugins/currency.rs +++ b/src/plugins/currency.rs @@ -130,11 +130,11 @@ impl Plugin for Currency { false } - fn execute(&mut self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { + fn execute(&self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { panic!("Currency does not implement the execute function!") } - fn command(&mut self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> { if command.tokens.is_empty() { return self.invalid_command(server, &command); diff --git a/src/plugins/emoji.rs b/src/plugins/emoji.rs index 09d5c27..1bb714c 100644 --- a/src/plugins/emoji.rs +++ b/src/plugins/emoji.rs @@ -105,7 +105,7 @@ impl Plugin for Emoji { } } - fn execute(&mut self, server: &IrcServer, message: &Message) -> Result<(), IrcError> { + fn execute(&self, server: &IrcServer, message: &Message) -> Result<(), IrcError> { match message.command { Command::PRIVMSG(_, ref content) => { self.emoji(server, content, message.response_target().unwrap()) @@ -114,7 +114,7 @@ impl Plugin for Emoji { } } - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { server.send_notice(&command.source, "This Plugin does not implement any commands.") } diff --git a/src/plugins/help.rs b/src/plugins/help.rs index c4ddcd4..8f3fb4d 100644 --- a/src/plugins/help.rs +++ b/src/plugins/help.rs @@ -21,11 +21,11 @@ impl Plugin for Help { false } - fn execute(&mut self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { + fn execute(&self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { panic!("Help does not implement the execute function!") } - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { self.help(server, command) } } |
