lib/threads.rb in threads-0.3.0 vs lib/threads.rb in threads-0.4.0
- old
+ new
@@ -1,10 +1,10 @@
# frozen_string_literal: true
# (The MIT License)
#
-# Copyright (c) 2018 Yegor Bugayenko
+# Copyright (c) 2018-2023 Yegor Bugayenko
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the 'Software'), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
@@ -25,25 +25,26 @@
require 'concurrent'
require 'backtrace'
# Threads.
# Author:: Yegor Bugayenko (yegor256@gmail.com)
-# Copyright:: Copyright (c) 2018 Yegor Bugayenko
+# Copyright:: Copyright (c) 2018-2023 Yegor Bugayenko
# License:: MIT
class Threads
- def initialize(total = Concurrent.processor_count * 8, log: STDOUT)
+ def initialize(total = Concurrent.processor_count * 8, log: $stdout)
raise "Total can't be nil" if total.nil?
raise "Total can't be negative or zero: #{total}" unless total.positive?
+
@total = total
raise "Log can't be nil" if log.nil?
+
@log = log
end
def assert(reps = @total)
- if reps < @total
- raise "Repetition counter #{reps} can't be smaller than #{@total}"
- end
+ raise "Repetition counter #{reps} can't be smaller than #{@total}" if reps < @total
+
done = Concurrent::AtomicFixnum.new
rep = Concurrent::AtomicFixnum.new
pool = Concurrent::FixedThreadPool.new(@total)
latch = Concurrent::CountDownLatch.new(1)
@total.times do |t|
@@ -51,10 +52,11 @@
Thread.current.name = "assert-thread-#{t}"
latch.wait(10)
loop do
r = rep.increment
break if r > reps
+
begin
yield(t, r - 1)
rescue StandardError => e
print(Backtrace.new(e))
raise e
@@ -65,9 +67,10 @@
end
latch.count_down
pool.shutdown
raise "Can't stop the pool" unless pool.wait_for_termination(30)
return if done.value == @total
+
raise "Only #{done.value} out of #{@total} threads completed successfully"
end
private