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