Skip to content

Commit 1ba0008

Browse files
committed
Restart threads on DAP evaluation
This makes sure DAP evaluation request also doesn't hang. See #947 for the original console implementation.
1 parent 24fc36c commit 1ba0008

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

lib/debug/server_dap.rb

+2
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ def process_protocol_request req
625625
expr = req.dig('arguments', 'expression')
626626

627627
if find_waiting_tc(tid)
628+
restart_all_threads
628629
request_tc [:dap, :evaluate, req, fid, expr, context]
629630
else
630631
fail_response req
@@ -701,6 +702,7 @@ def process_protocol_result args
701702
register_vars result[:variables], tid
702703
@ui.respond req, result
703704
when :evaluate
705+
stop_all_threads
704706
message = result.delete :message
705707
if message
706708
@ui.respond req, success: false, message: message

test/protocol/eval_test.rb

+23
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,27 @@ def test_eval_evaluates_arithmetic_expressions
5757
end
5858
end
5959
end
60+
61+
class EvaluateThreadTest < ProtocolTestCase
62+
PROGRAM = <<~RUBY
63+
1| th0 = Thread.new{sleep}
64+
2| m = Mutex.new; q = Queue.new
65+
3| th1 = Thread.new do
66+
4| m.lock; q << true
67+
5| sleep 1
68+
6| m.unlock
69+
7| end
70+
8| q.pop # wait for locking
71+
9| p :ok
72+
RUBY
73+
74+
def test_eval_with_threads
75+
run_protocol_scenario PROGRAM, cdp: false do
76+
req_add_breakpoint 9
77+
req_continue
78+
assert_repl_result({value: 'false', type: 'FalseClass'}, 'm.lock.nil?', frame_idx: 0)
79+
req_continue
80+
end
81+
end
82+
end
6083
end

0 commit comments

Comments
 (0)