summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKunal Mohan <kunalmohan99@gmail.com>2021-04-15 14:57:09 +0530
committerKunal Mohan <kunalmohan99@gmail.com>2021-04-15 14:57:09 +0530
commit543d26bc3d9a536ed021f2f44dd324661bc88789 (patch)
tree2bb26fb63f9ae7bbdbabf8c34325c4bb0059beba
parent6d40a2adb9c27e644df9c47d0ba4982d182f7f09 (diff)
Remove ErrorContext from IpcSender and nit fixes
-rw-r--r--src/client/mod.rs4
-rw-r--r--src/common/os_input_output.rs56
-rw-r--r--src/server/mod.rs9
-rw-r--r--src/tests/fakes.rs4
4 files changed, 19 insertions, 54 deletions
diff --git a/src/client/mod.rs b/src/client/mod.rs
index 6ba6df737..7dc38f5e1 100644
--- a/src/client/mod.rs
+++ b/src/client/mod.rs
@@ -107,7 +107,8 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs) {
let os_input = os_input.clone();
move || {
loop {
- let (instruction, _err_ctx) = os_input.client_recv();
+ let (instruction, mut err_ctx) = os_input.client_recv();
+ err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction)));
if let ClientInstruction::Exit = instruction {
break;
}
@@ -129,7 +130,6 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs) {
err_ctx.add_call(ContextType::Client(ClientContext::from(
&client_instruction,
)));
- os_input.update_senders(err_ctx);
match client_instruction {
ClientInstruction::Exit => break,
ClientInstruction::Error(backtrace) => {
diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs
index 3d7b8918c..b830bd707 100644
--- a/src/common/os_input_output.rs
+++ b/src/common/os_input_output.rs
@@ -18,7 +18,7 @@ use std::process::{Child, Command};
use std::sync::{Arc, Mutex};
use crate::client::ClientInstruction;
-use crate::errors::ErrorContext;
+use crate::errors::{get_current_ctx, ErrorContext};
use crate::panes::PositionAndSize;
use crate::server::ServerInstruction;
use crate::utils::consts::ZELLIJ_IPC_PIPE;
@@ -164,7 +164,6 @@ fn spawn_terminal(file_to_open: Option<PathBuf>, orig_termios: termios::Termios)
/// Sends messages on an [ipmpsc](ipmpsc) channel, along with an [`ErrorContext`].
#[derive(Clone)]
struct IpcSenderWithContext<T: Serialize> {
- err_ctx: ErrorContext,
sender: IpcSender,
_phantom: PhantomData<T>,
}
@@ -173,25 +172,16 @@ impl<T: Serialize> IpcSenderWithContext<T> {
/// Returns a sender to the given [SharedRingBuffer](ipmpsc::SharedRingBuffer).
fn new(buffer: SharedRingBuffer) -> Self {
Self {
- err_ctx: ErrorContext::new(),
sender: IpcSender::new(buffer),
_phantom: PhantomData,
}
}
- /// Updates this [`IpcSenderWithContext`]'s [`ErrorContext`]. This is the way one adds
- /// a call to the error context.
- ///
- /// Updating [`ErrorContext`]s works in this way so that these contexts are only ever
- /// allocated on the stack (which is thread-specific), and not on the heap.
- fn update(&mut self, ctx: ErrorContext) {
- self.err_ctx = ctx;
- }
-
/// Sends an event, along with the current [`ErrorContext`], on this
/// [`IpcSenderWithContext`]'s channel.
fn send(&self, msg: T) -> ipmpsc::Result<()> {
- self.sender.send(&(msg, self.err_ctx))
+ let err_ctx = get_current_ctx();
+ self.sender.send(&(msg, err_ctx))
}
}
@@ -199,7 +189,7 @@ impl<T: Serialize> IpcSenderWithContext<T> {
pub struct ServerOsInputOutput {
orig_termios: Arc<Mutex<termios::Termios>>,
server_sender: IpcSenderWithContext<ServerInstruction>,
- server_receiver: Arc<Mutex<IpcReceiver>>,
+ server_receiver: Arc<IpcReceiver>, // Should this be Arc<Mutex<_>> ?
client_sender: Option<IpcSenderWithContext<ClientInstruction>>,
}
@@ -228,11 +218,9 @@ pub trait ServerOsApi: Send + Sync {
/// Receives a message on server-side IPC channel
fn server_recv(&self) -> (ServerInstruction, ErrorContext);
/// Sends a message to client
- fn send_to_client(&mut self, msg: ClientInstruction);
+ fn send_to_client(&self, msg: ClientInstruction);
/// Adds a sender to client
fn add_client_sender(&mut self, buffer_path: String);
- /// Update ErrorContext of senders
- fn update_senders(&mut self, new_ctx: ErrorContext);
}
impl ServerOsApi for ServerOsInputOutput {
@@ -270,21 +258,15 @@ impl ServerOsApi for ServerOsInputOutput {
self.server_sender.send(ServerInstruction::Exit).unwrap();
}
fn server_recv(&self) -> (ServerInstruction, ErrorContext) {
- self.server_receiver.lock().unwrap().recv().unwrap()
+ self.server_receiver.recv().unwrap()
}
- fn send_to_client(&mut self, msg: ClientInstruction) {
- self.client_sender.as_mut().unwrap().send(msg).unwrap();
+ fn send_to_client(&self, msg: ClientInstruction) {
+ self.client_sender.as_ref().unwrap().send(msg).unwrap();
}
fn add_client_sender(&mut self, buffer_path: String) {
let buffer = SharedRingBuffer::open(buffer_path.as_str()).unwrap();
self.client_sender = Some(IpcSenderWithContext::new(buffer));
}
- fn update_senders(&mut self, new_ctx: ErrorContext) {
- self.server_sender.update(new_ctx);
- if let Some(ref mut s) = self.client_sender {
- s.update(new_ctx);
- }
- }
}
impl Clone for Box<dyn ServerOsApi> {
@@ -298,7 +280,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput {
let orig_termios = Arc::new(Mutex::new(current_termios));
let server_buffer = SharedRingBuffer::create(ZELLIJ_IPC_PIPE, IPC_BUFFER_SIZE).unwrap();
let server_sender = IpcSenderWithContext::new(server_buffer.clone());
- let server_receiver = Arc::new(Mutex::new(IpcReceiver::new(server_buffer.clone())));
+ let server_receiver = Arc::new(IpcReceiver::new(server_buffer));
ServerOsInputOutput {
orig_termios,
server_sender,
@@ -311,8 +293,7 @@ pub fn get_server_os_input() -> ServerOsInputOutput {
pub struct ClientOsInputOutput {
orig_termios: Arc<Mutex<termios::Termios>>,
server_sender: IpcSenderWithContext<ServerInstruction>,
- // This is used by router thread only hence lock resolves immediately.
- client_receiver: Option<Arc<Mutex<IpcReceiver>>>,
+ client_receiver: Option<Arc<IpcReceiver>>, // Should this be Option<Arc<Mutex<_>>> ?
}
/// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that
@@ -334,8 +315,6 @@ pub trait ClientOsApi: Send + Sync {
fn box_clone(&self) -> Box<dyn ClientOsApi>;
/// Sends a message to the server.
fn send_to_server(&self, msg: ServerInstruction);
- /// Update ErrorContext of senders
- fn update_senders(&mut self, new_ctx: ErrorContext);
/// Receives a message on client-side IPC channel
// This should be called from the client-side router thread only.
fn client_recv(&self) -> (ClientInstruction, ErrorContext);
@@ -374,28 +353,17 @@ impl ClientOsApi for ClientOsInputOutput {
fn send_to_server(&self, msg: ServerInstruction) {
self.server_sender.send(msg).unwrap();
}
- fn update_senders(&mut self, new_ctx: ErrorContext) {
- self.server_sender.update(new_ctx);
- }
fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) {
let (client_buffer_path, client_buffer) =
SharedRingBuffer::create_temp(IPC_BUFFER_SIZE).unwrap();
- self.client_receiver = Some(Arc::new(Mutex::new(IpcReceiver::new(
- client_buffer.clone(),
- ))));
+ self.client_receiver = Some(Arc::new(IpcReceiver::new(client_buffer)));
self.send_to_server(ServerInstruction::NewClient(
client_buffer_path,
full_screen_ws,
));
}
fn client_recv(&self) -> (ClientInstruction, ErrorContext) {
- self.client_receiver
- .as_ref()
- .unwrap()
- .lock()
- .unwrap()
- .recv()
- .unwrap()
+ self.client_receiver.as_ref().unwrap().recv().unwrap()
}
fn receive_sigwinch(&self, cb: Box<dyn Fn()>) {
let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap();
diff --git a/src/server/mod.rs b/src/server/mod.rs
index d86408366..af89ab679 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -207,7 +207,8 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread
let os_input = os_input.clone();
let send_server_instructions = send_server_instructions.clone();
move || loop {
- let (instruction, _err_ctx) = os_input.server_recv();
+ let (instruction, mut err_ctx) = os_input.server_recv();
+ err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction)));
match instruction {
ServerInstruction::Exit => break,
_ => {
@@ -227,13 +228,11 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, opts: CliArgs) -> thread
move || loop {
let (instruction, mut err_ctx) = receive_server_instructions.recv().unwrap();
err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction)));
- os_input.update_senders(err_ctx);
match instruction {
ServerInstruction::OpenFile(file_name) => {
- let path = PathBuf::from(file_name);
clients[client.as_ref().unwrap()]
.send_pty_instructions
- .send(PtyInstruction::SpawnTerminal(Some(path)))
+ .send(PtyInstruction::SpawnTerminal(Some(file_name)))
.unwrap();
}
ServerInstruction::SplitHorizontally => {
@@ -421,7 +420,7 @@ fn init_client(
let os_input = os_input.clone();
let send_plugin_instructions = send_plugin_instructions.clone();
let send_pty_instructions = send_pty_instructions.clone();
- let send_server_instructions = send_server_instructions.clone();
+ let send_server_instructions = send_server_instructions;
let max_panes = opts.max_panes;
move || {
diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs
index 271edde0c..7b4589c34 100644
--- a/src/tests/fakes.rs
+++ b/src/tests/fakes.rs
@@ -196,7 +196,6 @@ impl ClientOsApi for FakeInputOutput {
fn send_to_server(&self, msg: ServerInstruction) {
self.server_sender.send(msg).unwrap();
}
- fn update_senders(&mut self, new_ctx: ErrorContext) {}
fn connect_to_server(&mut self, full_screen_ws: PositionAndSize) {
ClientOsApi::send_to_server(
self,
@@ -284,9 +283,8 @@ impl ServerOsApi for FakeInputOutput {
fn server_recv(&self) -> (ServerInstruction, ErrorContext) {
self.server_receiver.lock().unwrap().recv().unwrap()
}
- fn send_to_client(&mut self, msg: ClientInstruction) {
+ fn send_to_client(&self, msg: ClientInstruction) {
self.client_sender.send(msg).unwrap();
}
fn add_client_sender(&mut self, _buffer_path: String) {}
- fn update_senders(&mut self, new_ctx: ErrorContext) {}
}