From eeef6883d49c8ad7ac2397ff5b27e76d12655911 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 4 Jul 2024 16:37:03 -0300 Subject: [PATCH 1/9] always lock; disable_lock option --- src/ProgressMeter.jl | 18 ++++-------------- test/test_threads.jl | 4 ---- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/ProgressMeter.jl b/src/ProgressMeter.jl index 1ca4ec5..dcbc1be 100644 --- a/src/ProgressMeter.jl +++ b/src/ProgressMeter.jl @@ -81,7 +81,7 @@ Base.@kwdef mutable struct ProgressCore numprintedvalues::Int = 0 # num values printed below progress in last iteration prev_update_count::Int = 1 # counter at last update printed::Bool = false # true if we have issued at least one status update - threads_used::Vector{Int} = Int[] # threads that have used this progress meter + disable_lock::Bool = false # set to false for non-threaded tight loops tinit::Float64 = time() # time meter was initialized tlast::Float64 = time() # time of last update tsecond::Float64 = time() # ignore the first loop given usually uncharacteristically slow @@ -441,22 +441,13 @@ end predicted_updates_per_dt_have_passed(p::AbstractProgress) = p.counter - p.prev_update_count >= p.check_iterations -function is_threading(p::AbstractProgress) - Threads.nthreads() == 1 && return false - length(p.threads_used) > 1 && return true - if !in(Threads.threadid(), p.threads_used) - push!(p.threads_used, Threads.threadid()) - end - return length(p.threads_used) > 1 -end - function lock_if_threading(f::Function, p::AbstractProgress) - if is_threading(p) + if p.disable_lock + f() + else lock(p.lock) do f() end - else - f() end end @@ -817,7 +808,6 @@ function showprogressthreads(args...) length($(esc(iters))); $(showprogress_process_args(progressargs)...), ) - append!($(esc(p)).threads_used, 1:Threads.nthreads()) $(esc(expr)) finish!($(esc(p))) end diff --git a/test/test_threads.jl b/test/test_threads.jl index 72a549e..390ec17 100644 --- a/test/test_threads.jl +++ b/test/test_threads.jl @@ -7,7 +7,6 @@ threadsUsed = fill(false, threads) vals = ones(n*threads) p = Progress(n*threads) - p.threads_used = 1:threads # short-circuit the function `is_threading` because it is racy (#232) Threads.@threads for i = 1:(n*threads) threadsUsed[Threads.threadid()] = true vals[i] = 0 @@ -21,7 +20,6 @@ println("Testing ProgressUnknown() with Threads.@threads across $threads threads") trigger = 100.0 prog = ProgressUnknown(desc="Attempts at exceeding trigger:") - prog.threads_used = 1:threads vals = Float64[] threadsUsed = fill(false, threads) lk = ReentrantLock() @@ -48,7 +46,6 @@ println("Testing ProgressThresh() with Threads.@threads across $threads threads") thresh = 1.0 prog = ProgressThresh(thresh; desc="Minimizing:") - prog.threads_used = 1:threads vals = fill(300.0, 1) threadsUsed = fill(false, threads) Threads.@threads for _ in 1:100000 @@ -76,7 +73,6 @@ # threadsUsed = fill(false, threads) vals = ones(n*threads) p = Progress(n*threads) - p.threads_used = 1:threads for t in 1:threads tasks[t] = Threads.@spawn for i in 1:n From e01e6f5b1d1b2eb128f9482d1d5fb299b71bff53 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 4 Jul 2024 16:42:15 -0300 Subject: [PATCH 2/9] remove trailing space --- src/ProgressMeter.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProgressMeter.jl b/src/ProgressMeter.jl index dcbc1be..954e64e 100644 --- a/src/ProgressMeter.jl +++ b/src/ProgressMeter.jl @@ -81,7 +81,7 @@ Base.@kwdef mutable struct ProgressCore numprintedvalues::Int = 0 # num values printed below progress in last iteration prev_update_count::Int = 1 # counter at last update printed::Bool = false # true if we have issued at least one status update - disable_lock::Bool = false # set to false for non-threaded tight loops + disable_lock::Bool = false # set to false for non-threaded tight loops tinit::Float64 = time() # time meter was initialized tlast::Float64 = time() # time of last update tsecond::Float64 = time() # ignore the first loop given usually uncharacteristically slow From dff26b38f5af79038eca3ce6f8f8f81fa6a13d06 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 4 Jul 2024 19:45:47 -0300 Subject: [PATCH 3/9] add test for new option --- test/core.jl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/core.jl b/test/core.jl index bd05d0e..99a5db8 100644 --- a/test/core.jl +++ b/test/core.jl @@ -80,3 +80,23 @@ prog.n = UInt128(20) # in Progress @test prog.n == 20 prog.offset = Int8(5) # in ProgressCore @test prog.offset == 5 + +# Test disable_lock option, initialization and +# execution. +function simple_sum(n; disable_lock = false) + p = Progress(n; disable_lock) + s = 0.0 + for i in 1:n + s += sin(i) + next!(p) + end + return s +end +p = Progress(10) +@test p.disable_lock == false +p = Progress(10; disable_lock = true) +@test p.disable_lock == true +@test simple_sum(10) ≈ simple_sum(10; disable_lock = true) + + + From 5117ed06c60b2f03d51235e739e0ba36f698e068 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 4 Jul 2024 19:50:27 -0300 Subject: [PATCH 4/9] rename disable_lock to safe_lock --- src/ProgressMeter.jl | 8 ++++---- test/core.jl | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/ProgressMeter.jl b/src/ProgressMeter.jl index 954e64e..f527412 100644 --- a/src/ProgressMeter.jl +++ b/src/ProgressMeter.jl @@ -81,7 +81,7 @@ Base.@kwdef mutable struct ProgressCore numprintedvalues::Int = 0 # num values printed below progress in last iteration prev_update_count::Int = 1 # counter at last update printed::Bool = false # true if we have issued at least one status update - disable_lock::Bool = false # set to false for non-threaded tight loops + safe_lock::Bool = true # set to false for non-threaded tight loops tinit::Float64 = time() # time meter was initialized tlast::Float64 = time() # time of last update tsecond::Float64 = time() # ignore the first loop given usually uncharacteristically slow @@ -442,12 +442,12 @@ end predicted_updates_per_dt_have_passed(p::AbstractProgress) = p.counter - p.prev_update_count >= p.check_iterations function lock_if_threading(f::Function, p::AbstractProgress) - if p.disable_lock - f() - else + if p.safe_lock lock(p.lock) do f() end + else + f() end end diff --git a/test/core.jl b/test/core.jl index 99a5db8..333aebf 100644 --- a/test/core.jl +++ b/test/core.jl @@ -81,22 +81,21 @@ prog.n = UInt128(20) # in Progress prog.offset = Int8(5) # in ProgressCore @test prog.offset == 5 -# Test disable_lock option, initialization and -# execution. -function simple_sum(n; disable_lock = false) - p = Progress(n; disable_lock) +# Test safe_lock option, initialization and execution. +function simple_sum(n; safe_lock = true) + p = Progress(n; safe_lock) s = 0.0 for i in 1:n - s += sin(i) + s += sin(i)^2 next!(p) end return s end p = Progress(10) -@test p.disable_lock == false -p = Progress(10; disable_lock = true) -@test p.disable_lock == true -@test simple_sum(10) ≈ simple_sum(10; disable_lock = true) +@test p.safe_lock == true +p = Progress(10; safe_lock = false) +@test p.safe_lock == false +@test simple_sum(10) ≈ simple_sum(10; safe_lock = false) From d1d9f9c4aa7db2f5c441d1a9650db6e916e7dc75 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Mon, 8 Jul 2024 10:04:08 -0300 Subject: [PATCH 5/9] safe_lock is nthreads() > 1 by default --- src/ProgressMeter.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProgressMeter.jl b/src/ProgressMeter.jl index f527412..43d308b 100644 --- a/src/ProgressMeter.jl +++ b/src/ProgressMeter.jl @@ -81,7 +81,7 @@ Base.@kwdef mutable struct ProgressCore numprintedvalues::Int = 0 # num values printed below progress in last iteration prev_update_count::Int = 1 # counter at last update printed::Bool = false # true if we have issued at least one status update - safe_lock::Bool = true # set to false for non-threaded tight loops + safe_lock::Bool = Threads.nthreads() > 1 # set to false for non-threaded tight loops tinit::Float64 = time() # time meter was initialized tlast::Float64 = time() # time of last update tsecond::Float64 = time() # ignore the first loop given usually uncharacteristically slow From 9000f8d0996034a884730fbcf5c3d38e9ea95ff3 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 11 Jul 2024 08:03:41 -0300 Subject: [PATCH 6/9] declare p local to avoid warning in test --- test/test.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test.jl b/test/test.jl index d37ce5b..ecee801 100644 --- a/test/test.jl +++ b/test/test.jl @@ -386,6 +386,7 @@ finish!(prog) println("Testing fractional bars") for front in (['▏','▎','▍','▌','▋','▊', '▉'], ['▁' ,'▂' ,'▃' ,'▄' ,'▅' ,'▆', '▇'], ['░', '▒', '▓',]) + local p p = Progress(100, dt=0.01, barglyphs=BarGlyphs('|','█',front,' ','|'), barlen=10) for i in 1:100 next!(p) From d99ca29617576c2e0a7c99b2e96b1fe38add8fee Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 11 Jul 2024 08:08:48 -0300 Subject: [PATCH 7/9] fix test for initialization of safe_lock --- test/core.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/core.jl b/test/core.jl index 333aebf..7add0a8 100644 --- a/test/core.jl +++ b/test/core.jl @@ -92,10 +92,7 @@ function simple_sum(n; safe_lock = true) return s end p = Progress(10) -@test p.safe_lock == true +@test p.safe_lock == Threads.nthreads() > 1 p = Progress(10; safe_lock = false) @test p.safe_lock == false -@test simple_sum(10) ≈ simple_sum(10; safe_lock = false) - - - +@test simple_sum(10; safe_lock = false) ≈ simple_sum(10; safe_lock = false) From 3015fe6c1278bd55cbd3fbbfb66c2cf3bd326db6 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 11 Jul 2024 08:10:26 -0300 Subject: [PATCH 8/9] fix test for initialization of safe_lock (2) --- test/core.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core.jl b/test/core.jl index 7add0a8..6214348 100644 --- a/test/core.jl +++ b/test/core.jl @@ -92,7 +92,7 @@ function simple_sum(n; safe_lock = true) return s end p = Progress(10) -@test p.safe_lock == Threads.nthreads() > 1 +@test p.safe_lock == (Threads.nthreads() > 1) p = Progress(10; safe_lock = false) @test p.safe_lock == false @test simple_sum(10; safe_lock = false) ≈ simple_sum(10; safe_lock = false) From 6cf497ce2eae97cbf7298b381d294043d6307ac8 Mon Sep 17 00:00:00 2001 From: Leandro Martinez Date: Thu, 11 Jul 2024 11:14:27 -0300 Subject: [PATCH 9/9] fix test --- test/core.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core.jl b/test/core.jl index 6214348..5c2858e 100644 --- a/test/core.jl +++ b/test/core.jl @@ -95,4 +95,4 @@ p = Progress(10) @test p.safe_lock == (Threads.nthreads() > 1) p = Progress(10; safe_lock = false) @test p.safe_lock == false -@test simple_sum(10; safe_lock = false) ≈ simple_sum(10; safe_lock = false) +@test simple_sum(10; safe_lock = true) ≈ simple_sum(10; safe_lock = false)