From bf17a2320f65f935b8f35f1020bbaceea7b0da81 Mon Sep 17 00:00:00 2001 From: "Ben Sheldon [he/him]" Date: Mon, 11 Mar 2024 07:27:53 -0700 Subject: [PATCH] ThreadPoolExecutor `kill` will `wait_for_termination` in JRuby; ensure TimerSet timer thread shuts down cleanly --- .../concurrent/executor/java_executor_service.rb | 1 + lib/concurrent-ruby/concurrent/executor/timer_set.rb | 5 ++++- spec/concurrent/executor/timer_set_spec.rb | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb b/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb index b2bc69a6e..96991a78e 100644 --- a/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb +++ b/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb @@ -46,6 +46,7 @@ def shutdown def kill synchronize do @executor.shutdownNow + wait_for_termination nil end end diff --git a/lib/concurrent-ruby/concurrent/executor/timer_set.rb b/lib/concurrent-ruby/concurrent/executor/timer_set.rb index 759dce093..b936c7b2f 100644 --- a/lib/concurrent-ruby/concurrent/executor/timer_set.rb +++ b/lib/concurrent-ruby/concurrent/executor/timer_set.rb @@ -61,6 +61,7 @@ def post(delay, *args, &task) # not running. def kill shutdown + @timer_executor.kill end private :<< @@ -122,7 +123,9 @@ def remove_task(task) def ns_shutdown_execution ns_reset_if_forked @queue.clear - @timer_executor.kill + @condition.set + @condition.reset + @timer_executor.shutdown stopped_event.set end diff --git a/spec/concurrent/executor/timer_set_spec.rb b/spec/concurrent/executor/timer_set_spec.rb index a386553b4..f4169473d 100644 --- a/spec/concurrent/executor/timer_set_spec.rb +++ b/spec/concurrent/executor/timer_set_spec.rb @@ -244,7 +244,7 @@ module Concurrent expect(task.schedule_time).to eq expected end - it 'reschdules a pending and unpost task when given a valid time' do + it 'reschedules a pending and unpost task when given a valid time' do initial_delay = 10 rescheduled_delay = 20 task = subject.post(initial_delay){ nil }