Skip to content

Commit b5391a1

Browse files
committed
Upstream debugger changes from python-ui branch
1 parent bd8e9a0 commit b5391a1

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

debugger/src/debugger.rs

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::{
44
};
55

66
use anyhow::Context;
7-
use spmc::Receiver;
87
use transport::{
98
requests::{self, Disconnect, Initialize, PathFormat},
109
Client,
@@ -18,30 +17,44 @@ use crate::{
1817

1918
pub struct Debugger {
2019
internals: Arc<Mutex<DebuggerInternals>>,
20+
rx: spmc::Receiver<Event>,
2121
}
2222

2323
impl Debugger {
24-
#[tracing::instrument(skip(client, events, publisher))]
24+
#[tracing::instrument(skip(client, events))]
2525
pub fn new(
2626
client: Client,
27-
events: Receiver<transport::events::Event>,
28-
mut publisher: spmc::Sender<Event>,
27+
events: spmc::Receiver<transport::events::Event>,
2928
) -> anyhow::Result<Self> {
3029
tracing::debug!("creating new client");
3130

32-
let _ = publisher.send(Event::Uninitialised);
31+
let (mut tx, rx) = spmc::channel();
32+
let _ = tx.send(Event::Uninitialised);
3333

34-
let internals = Arc::new(Mutex::new(DebuggerInternals::new(client, publisher)));
34+
let internals_rx = rx.clone();
35+
let internals = Arc::new(Mutex::new(DebuggerInternals::new(client, tx)));
3536

3637
// background thread reading transport events, and handling the event with our internal state
3738
let background_internals = Arc::clone(&internals);
39+
let background_events = events.clone();
3840
thread::spawn(move || loop {
39-
let event = events.recv().unwrap();
41+
let event = background_events.recv().unwrap();
4042
background_internals.lock().unwrap().on_event(event);
4143
});
42-
Ok(Self { internals })
44+
Ok(Self {
45+
internals,
46+
rx: internals_rx,
47+
})
4348
}
4449

50+
pub fn events(&self) -> spmc::Receiver<Event> {
51+
self.rx.clone()
52+
}
53+
54+
// fn emit(&self, event: Event) {
55+
// self.internals.lock().unwrap().emit(event)
56+
// }
57+
4558
pub fn initialise(&self, launch_arguments: state::LaunchArguments) -> anyhow::Result<()> {
4659
// initialise
4760
let req = requests::RequestBody::Initialize(Initialize {
@@ -110,6 +123,27 @@ impl Debugger {
110123
fn execute(&self, body: requests::RequestBody) -> anyhow::Result<()> {
111124
self.internals.lock().unwrap().client.execute(body)
112125
}
126+
127+
pub fn wait_for_event<F>(&self, pred: F) -> Event
128+
where
129+
F: Fn(&Event) -> bool,
130+
{
131+
let mut n = 0;
132+
loop {
133+
let evt = self.rx.recv().unwrap();
134+
if n >= 100 {
135+
panic!("did not receive event");
136+
}
137+
138+
if pred(&evt) {
139+
tracing::debug!(event = ?evt, "received expected event");
140+
return evt;
141+
} else {
142+
tracing::trace!(event = ?evt, "non-matching event");
143+
}
144+
n += 1;
145+
}
146+
}
113147
}
114148

115149
impl Drop for Debugger {

debugger/src/internals.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ pub struct FileSource {
1919
}
2020

2121
pub(crate) struct DebuggerInternals {
22-
pub(crate) _state: DebuggerState,
2322
pub(crate) client: Client,
2423
pub(crate) publisher: spmc::Sender<Event>,
2524

@@ -36,6 +35,10 @@ impl DebuggerInternals {
3635
Self::with_breakpoints(client, publisher, HashMap::new())
3736
}
3837

38+
pub(crate) fn emit(&mut self, event: Event) {
39+
let _ = self.publisher.send(event);
40+
}
41+
3942
pub(crate) fn with_breakpoints(
4043
client: Client,
4144
publisher: spmc::Sender<Event>,
@@ -45,7 +48,6 @@ impl DebuggerInternals {
4548
let current_breakpoint_id = *breakpoints.keys().max().unwrap_or(&0);
4649

4750
Self {
48-
_state: DebuggerState::Running,
4951
client,
5052
publisher,
5153
current_thread_id: None,
@@ -203,6 +205,6 @@ impl DebuggerInternals {
203205

204206
pub(crate) fn set_state(&mut self, new_state: DebuggerState) {
205207
let event = Event::from(&new_state);
206-
let _ = self.publisher.send(event);
208+
self.emit(event);
207209
}
208210
}

debugger/tests/debugger.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ fn test_debugger() -> anyhow::Result<()> {
2626
TcpStream::connect(format!("127.0.0.1:{port}")).context("connecting to server")?;
2727
let client = transport::Client::new(stream, tx).context("creating transport client")?;
2828

29-
let (dtx, drx) = spmc::channel();
30-
31-
let debugger = Debugger::new(client, rx, dtx).context("creating debugger")?;
29+
let debugger = Debugger::new(client, rx).context("creating debugger")?;
30+
let drx = debugger.events();
3231

3332
let file_path = std::env::current_dir()
3433
.unwrap()

0 commit comments

Comments
 (0)