jsonrpc: don't use a Mutex to share the DaemonControl between threads

This commit is contained in:
Antoine Poinsot 2022-08-11 13:12:26 +02:00
parent e6fcdd5b09
commit 069bca546a
No known key found for this signature in database
GPG Key ID: E13FC145CD3F4304
2 changed files with 5 additions and 6 deletions

View File

@ -81,7 +81,7 @@ fn read_command(
// Handle all messages from this connection.
fn connection_handler(
control: sync::Arc<sync::Mutex<DaemonControl>>,
control: DaemonControl,
mut stream: net::UnixStream,
shutdown: sync::Arc<atomic::AtomicBool>,
) -> Result<(), io::Error> {
@ -105,8 +105,8 @@ fn connection_handler(
}
log::trace!("JSONRPC request: {:?}", serde_json::to_string(&req));
let response = api::handle_request(&control.lock().unwrap(), req)
.unwrap_or_else(|e| Response::error(req_id, e));
let response =
api::handle_request(&control, req).unwrap_or_else(|e| Response::error(req_id, e));
log::trace!("JSONRPC response: {:?}", serde_json::to_string(&response));
if let Err(e) = serde_json::to_writer(&stream, &response) {
log::error!("Error writing response: '{}'", e);
@ -121,7 +121,7 @@ fn connection_handler(
/// The main event loop. Wait for connections, and treat requests sent through them.
pub fn rpcserver_loop(
listener: net::UnixListener,
daemon_control: sync::Arc<sync::Mutex<DaemonControl>>,
daemon_control: DaemonControl,
) -> Result<(), io::Error> {
// Keep it simple. We don't need great performances so just treat each connection in
// its thread, with a given maximum number of connections.

View File

@ -209,6 +209,7 @@ fn setup_bitcoind(
Ok(bitcoind.with_retry_limit(None))
}
#[derive(Clone)]
pub struct DaemonControl {
config: Config,
bitcoin: sync::Arc<sync::Mutex<dyn BitcoinInterface>>,
@ -346,8 +347,6 @@ impl DaemonHandle {
let listener = rpcserver_setup(&rpc_socket)?;
log::info!("JSONRPC server started.");
// FIXME: don't use a Mutex...
let control = sync::Arc::from(sync::Mutex::from(control));
rpcserver_loop(listener, control)?;
log::info!("JSONRPC server stopped.");