lib/workers/task_group.rb in workers-0.6.0 vs lib/workers/task_group.rb in workers-0.6.1

- old
+ new

@@ -40,11 +40,17 @@ @internal_lock.synchronize do @tasks.each do |task| @pool.perform { task.run } end - @conditional.wait(@internal_lock) + loop do + @conditional.wait(@internal_lock) + # The wait can return even if nothing called @conditional.signal, + # so we need to check to see if the condition actually changed. + # See https://github.com/chadrem/workers/issues/7 + break if all_tasks_finished? + end end @tasks.all? { |t| t.succeeded? } end @@ -96,12 +102,16 @@ end def finished(task) @internal_lock.synchronize do @finished_count += 1 - @conditional.signal if @finished_count >= @tasks.count + @conditional.signal if all_tasks_finished? end nil + end + + def all_tasks_finished? + @finished_count >= @tasks.count end end end