Skip to content

Commit

Permalink
Wait for renderloop task to stop before restoring close_after_renderl…
Browse files Browse the repository at this point in the history
…oop value

Without this, one can observe that the singleton window is fully
closed and reopened by applying the following patch:
```diff
diff --git a/GLMakie/src/screen.jl b/GLMakie/src/screen.jl
index ff8b69fdc..e18b8ba6b 100644
--- a/GLMakie/src/screen.jl
+++ b/GLMakie/src/screen.jl
@@ -839,6 +839,7 @@ function pause_renderloop!(screen::Screen)
 end

 function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_after_renderloop)
+    yield()
     # don't double close when stopping renderloop
     c = screen.close_after_renderloop
     screen.close_after_renderloop = close_after_renderloop
@@ -974,7 +975,7 @@ function renderloop(screen)
     end
     if screen.close_after_renderloop
         try
-            @debug("Closing screen after quiting renderloop!")
+            @info("Closing screen after quiting renderloop!")
             close(screen)
         catch e
             @warn "error closing screen" exception=(e, Base.catch_backtrace())
```
which aims to force the renderloop's task to run via the call to
`yield()` so that the task is sleeping during the rest of the function
call. (The logging change just makes the particular action easier to
find than enabling debug-level logging.)

Opening a plot and replotting at the REPL, I observe both the window
quickly close and reappear and the log message being printed by the end
of the renderloop:
```julia-repl
julia> using GLMakie
Precompiling GLMakie
        Info Given GLMakie was explicitly requested, output will be shown live
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
  1 dependency successfully precompiled in 21 seconds. 303 already precompiled.
  1 dependency had output during precompilation:
┌ GLMakie
│  [Output was shown above]
└

julia> scatter([1, 6])

julia> scatter([1, 6])
[ Info: Closing screen after quiting renderloop!

```

With the changes in this commit, all of the log message disappear,
including from the precompile process.
  • Loading branch information
jmert committed May 23, 2024
1 parent 20f457b commit 8948efc
Showing 1 changed file with 1 addition and 2 deletions.
3 changes: 1 addition & 2 deletions GLMakie/src/screen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -843,8 +843,6 @@ function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_af
c = screen.close_after_renderloop
screen.close_after_renderloop = close_after_renderloop
screen.stop_renderloop = true
screen.close_after_renderloop = c

# stop_renderloop! may be called inside renderloop as part of close
# in which case we should not wait for the task to finish (deadlock)
if Base.current_task() != screen.rendertask
Expand All @@ -853,6 +851,7 @@ function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_af
screen.rendertask = nothing
end
# else, we can't do that much in the rendertask itself
screen.close_after_renderloop = c
return
end

Expand Down

0 comments on commit 8948efc

Please sign in to comment.