@@ -1,5 +1,5 @@
1use crate::{
1use crate::{
2− transport::{Event, Payload, Request, Transport},
2+ transport::{Payload, Request, Transport},
@@ -9,19 +9,13 @@ use std::{
9 net::{IpAddr, Ipv4Addr, SocketAddr},
9 net::{IpAddr, Ipv4Addr, SocketAddr},
10 path::PathBuf,
10 path::PathBuf,
11 process::Stdio,
11 process::Stdio,
13− atomic::{AtomicU64, Ordering},
12+ sync::atomic::{AtomicU64, Ordering},
17use tokio::{
14use tokio::{
18 io::{AsyncBufRead, AsyncWrite, BufReader, BufWriter},
15 io::{AsyncBufRead, AsyncWrite, BufReader, BufWriter},
19 net::TcpStream,
16 net::TcpStream,
20 process::{Child, Command},
17 process::{Child, Command},
22− mpsc::{channel, Receiver, Sender, UnboundedReceiver, UnboundedSender},
18+ sync::mpsc::{channel, unbounded_channel, UnboundedReceiver, UnboundedSender},
@@ -32,8 +26,6 @@ pub struct Client {
32 server_tx: UnboundedSender<Request>,
26 server_tx: UnboundedSender<Request>,
33 request_counter: AtomicU64,
27 request_counter: AtomicU64,
34 capabilities: Option<DebuggerCapabilities>,
28 capabilities: Option<DebuggerCapabilities>,
35− awaited_events: Arc<Mutex<HashMap<String, Sender<Event>>>>,
38 pub breakpoints: HashMap<PathBuf, Vec<SourceBreakpoint>>,
30 pub breakpoints: HashMap<PathBuf, Vec<SourceBreakpoint>>,
39 // TODO: multiple threads support
31 // TODO: multiple threads support
@@ -46,8 +38,9 @@ impl Client {
46 tx: Box<dyn AsyncWrite + Unpin + Send>,
38 tx: Box<dyn AsyncWrite + Unpin + Send>,
47 id: usize,
39 id: usize,
48 process: Option<Child>,
40 process: Option<Child>,
49− ) -> Result<Self> {
41+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
50 let (server_rx, server_tx) = Transport::start(rx, tx, id);
42 let (server_rx, server_tx) = Transport::start(rx, tx, id);
43+ let (client_rx, client_tx) = unbounded_channel();
52 let client = Self {
45 let client = Self {
@@ -55,24 +48,30 @@ impl Client {
55 server_tx,
48 server_tx,
56 request_counter: AtomicU64::new(0),
49 request_counter: AtomicU64::new(0),
57 capabilities: None,
50 capabilities: None,
58− awaited_events: Arc::new(Mutex::new(HashMap::default())),
60 breakpoints: HashMap::new(),
52 breakpoints: HashMap::new(),
61 stack_pointer: None,
53 stack_pointer: None,
64− tokio::spawn(Self::recv(Arc::clone(&client.awaited_events), server_rx));
56+ tokio::spawn(Self::recv(server_rx, client_rx));
66− Ok(client)
58+ Ok((client, client_tx))
69− pub async fn tcp(addr: std::net::SocketAddr, id: usize) -> Result<Self> {
62+ addr: std::net::SocketAddr,
64+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
70 let stream = TcpStream::connect(addr).await?;
65 let stream = TcpStream::connect(addr).await?;
71 let (rx, tx) = stream.into_split();
66 let (rx, tx) = stream.into_split();
72 Self::streams(Box::new(BufReader::new(rx)), Box::new(tx), id, None)
67 Self::streams(Box::new(BufReader::new(rx)), Box::new(tx), id, None)
75− pub fn stdio(cmd: &str, args: Vec<&str>, id: usize) -> Result<Self> {
70+ pub fn stdio(
74+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
76 let process = Command::new(cmd)
75 let process = Command::new(cmd)
77 .args(args)
76 .args(args)
78 .stdin(Stdio::piped())
77 .stdin(Stdio::piped())
@@ -114,7 +113,7 @@ impl Client {
114 args: Vec<&str>,
113 args: Vec<&str>,
115 port_format: &str,
114 port_format: &str,
116 id: usize,
115 id: usize,
117− ) -> Result<Self> {
116+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
118 let port = Self::get_port().await.unwrap();
117 let port = Self::get_port().await.unwrap();
120 let process = Command::new(cmd)
119 let process = Command::new(cmd)
@@ -145,43 +144,22 @@ impl Client {
149− awaited_events: Arc<Mutex<HashMap<String, Sender<Event>>>>,
150− mut server_rx: UnboundedReceiver<Payload>,
147+ async fn recv(mut server_rx: UnboundedReceiver<Payload>, client_tx: UnboundedSender<Payload>) {
152 while let Some(msg) = server_rx.recv().await {
148 while let Some(msg) = server_rx.recv().await {
153 match msg {
149 match msg {
154 Payload::Event(ev) => {
150 Payload::Event(ev) => {
155− let name = ev.event.clone();
156− let hashmap = awaited_events.lock().await;
157− let tx = hashmap.get(&name);
160− Some(tx) => match tx.send(ev).await {
163− "Tried sending event into a closed channel (name={:?})",
168− info!("unhandled event {}", name);
169− // client_tx.send(Payload::Event(ev)).expect("Failed to send");
151+ client_tx.send(Payload::Event(ev)).expect("Failed to send");
173 Payload::Response(_) => unreachable!(),
153 Payload::Response(_) => unreachable!(),
174− Payload::Request(_) => todo!(),
154+ Payload::Request(req) => {
156+ .send(Payload::Request(req))
157+ .expect("Failed to send");
179− pub async fn listen_for_event(&self, name: String) -> Receiver<Event> {
180− let (rx, tx) = channel(1);
181− self.awaited_events.lock().await.insert(name.clone(), rx);
185 pub fn id(&self) -> usize {
163 pub fn id(&self) -> usize {
@@ -248,8 +226,6 @@ impl Client {
250 pub async fn launch(&mut self, args: serde_json::Value) -> Result<()> {
228 pub async fn launch(&mut self, args: serde_json::Value) -> Result<()> {
251− // TODO: buffer these until initialized arrives
253 let response = self.request::<requests::Launch>(args).await?;
229 let response = self.request::<requests::Launch>(args).await?;
254 log::error!("launch response {}", response);
230 log::error!("launch response {}", response);
@@ -257,8 +233,6 @@ impl Client {
259 pub async fn attach(&mut self, args: serde_json::Value) -> Result<()> {
235 pub async fn attach(&mut self, args: serde_json::Value) -> Result<()> {
260− // TODO: buffer these until initialized arrives
262 let response = self.request::<requests::Attach>(args).await?;
236 let response = self.request::<requests::Attach>(args).await?;
263 log::error!("attach response {}", response);
237 log::error!("attach response {}", response);