Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash while pushing canvas in exceptional circumstances #34

Closed
Rratic opened this issue Jun 28, 2023 · 3 comments
Closed

Crash while pushing canvas in exceptional circumstances #34

Rratic opened this issue Jun 28, 2023 · 3 comments

Comments

@Rratic
Copy link

Rratic commented Jun 28, 2023

script:

using Gtk4
global window::GtkWindow
global topbox::GtkBox
global canvas::GtkCanvas

function init_window_gtk()
    global window = GtkWindow("Test")
    global topbox = GtkBox(:v)
    push!(window, topbox)
    init_menu_gtk()
end

function init_menu_gtk()
    global topbox
    but_create = GtkButton("load")
    signal_connect(but_create, "clicked") do _
        init_canvas_gtk()
    end
    push!(topbox, but_create)
end

function init_canvas_gtk()
    global window
    global topbox
    global canvas = GtkCanvas(100, 100)
    empty!(topbox)
    @guarded draw(canvas) do widget
        ctx = getgc(widget)
        rectangle(ctx, 0, 0, 100, 100)
        set_source_rgb(ctx, 0, 0, 1)
        fill(ctx)
    end
    push!(topbox, canvas)
end

run:

julia> init_window_gtk()
Gtk4.GtkBoxLeaf(accessible-role=GTK_ACCESSIBLE_ROLE_GROUP, orientation=GTK_ORIENTATION_VERTICAL, name="", parent, root, width-request=-1, height-request=-1, visible=true, sensitive=true, can-focus=true, has-focus=false, can-target=true, focus-on-click=true, focusable=false, has-default=false, receives-default=false, cursor, has-tooltip=false, tooltip-markup=nothing, tooltip-text=nothing, opacity=1.000000, overflow=GTK_OVERFLOW_VISIBLE, halign=GTK_ALIGN_FILL, valign=GTK_ALIGN_FILL, margin-start=0, margin-end=0, margin-top=0, margin-bottom=0, hexpand=false, vexpand=false, hexpand-set=false, vexpand-set=false, scale-factor=1, css-name="box", css-classes, layout-manager, spacing=0, homogeneous=false, baseline-position=GTK_BASELINE_POSITION_CENTER)

julia> ┌ Warning: Executing #3:
└ @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:116
ERROR: AssertionError: xor(prev, current_task() !== g_stack)
Stacktrace:
  [1] g_siginterruptible(f::Gtk4.GLib.var"#126#128"{Ptr{Gtk4.GLib.GValue}, UInt32, Ptr{Gtk4.GLib.GValue}, Vector{Any}, Gtk4.var"#on_realize#340"{GtkCanvas}}, cb::Any)
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:212
  [2] GClosureMarshal(closuref::Ptr{Nothing}, return_value::Ptr{Gtk4.GLib.GValue}, n_param_values::UInt32, param_values::Ptr{Gtk4.GLib.GValue}, invocation_hint::Ptr{Nothing}, marshal_data::Ptr{Nothing})
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:51
  [3] append
    @ C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\gen\gtk4_methods:1166 [inlined]
  [4] push!
    @ C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\layout.jl:31 [inlined]
  [5] init_canvas_gtk()
    @ Main .\REPL[7]:12
  [6] (::var"#3#4")(#unused#::Gtk4.GtkButtonLeaf)
    @ Main .\REPL[6]:5
  [7] (::Gtk4.GLib.var"#126#128"{Ptr{Gtk4.GLib.GValue}, UInt32, Ptr{Gtk4.GLib.GValue}, Vector{Any}, var"#3#4"})()
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:57
  [8] g_siginterruptible(f::Gtk4.GLib.var"#126#128"{Ptr{Gtk4.GLib.GValue}, UInt32, Ptr{Gtk4.GLib.GValue}, Vector{Any}, var"#3#4"}, cb::Any)
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:219
  [9] GClosureMarshal(closuref::Ptr{Nothing}, return_value::Ptr{Gtk4.GLib.GValue}, n_param_values::UInt32, param_values::Ptr{Gtk4.GLib.GValue}, invocation_hint::Ptr{Nothing}, marshal_data::Ptr{Nothing})
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:51
 [10] (::Gtk4.GLib.var"#226#227")()
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\loop.jl:83
 [11] g_sigatom(f::Any)
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:186
 [12] glib_main()
    @ Gtk4.GLib C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\loop.jl:80

vscode gives extra message:

Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.
Exception: EXCEPTION_ACCESS_VIOLATION at 0x67f1de89 -- signal_emit_unlocked_R at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
in expression starting at none:0
signal_emit_unlocked_R at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit_valist at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_object_dispatch_properties_changed at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_object_notify at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
gdk_surface_set_is_mapped at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gdk_event_translate at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
_gdk_win32_surface_procedure at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
CallWindowProcW at C:\WINDOWS\System32\USER32.dll (unknown line)
CallWindowProcW at C:\WINDOWS\System32\USER32.dll (unknown line)
glPushClientAttrib at C:\WINDOWS\SYSTEM32\OPENGL32.DLL (unknown line)
CallWindowProcW at C:\WINDOWS\System32\USER32.dll (unknown line)
DispatchMessageW at C:\WINDOWS\System32\USER32.dll (unknown line)
LookupIconIdFromDirectoryEx at C:\WINDOWS\System32\USER32.dll (unknown line)
KiUserCallbackDispatcher at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
NtUserShowWindow at C:\WINDOWS\System32\win32u.dll (unknown line)
gdk_surface_hide at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gtk_window_unmap at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
_g_closure_invoke_va at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit_valist at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
gtk_widget_unmap at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gtk_window_destroy at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gtk_main_do_event at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
surface_event at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
_gdk_marshal_BOOLEAN__POINTERv at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gdk_surface_event_marshallerv at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
_g_closure_invoke_va at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit_valist at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
g_signal_emit at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libgobject-2.0-0.dll (unknown line)
gdk_surface_handle_event at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
gdk_event_dispatch at C:\Users\anonymous\.julia\artifacts\e302132ce205461195ddd4d85b49070d593c8828\bin\libgtk-4-1.dll (unknown line)
g_main_context_dispatch at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libglib-2.0-0.dll (unknown line)
g_main_context_iterate.isra.23 at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libglib-2.0-0.dll (unknown line)
g_main_context_iteration at C:\Users\anonymous\.julia\artifacts\4f67e82ee394e74ca63b7dc589dcc9218c12b20a\bin\libglib-2.0-0.dll (unknown line)
#226 at C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\loop.jl:83
unknown function (ip: 000001cb7b275ee3)
g_sigatom at C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\signals.jl:186
unknown function (ip: 000001cb7b275dd6)
glib_main at C:\Users\anonymous\.julia\packages\Gtk4\NeSVF\src\GLib\loop.jl:80
unknown function (ip: 000001cb7b2751c3)
jl_apply at C:/workdir/src\julia.h:1879 [inlined]
start_task at C:/workdir/src\task.c:1092
Allocations: 10449099 (Pool: 10440476; Big: 8623); GC: 15

environment:

julia> versioninfo()
Julia Version 1.9.1
Commit 147bdf428c (2023-06-07 08:27 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: 8 × Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.6 (ORCJIT, skylake)
  Threads: 1 on 8 virtual cores

(@v1.9) pkg> st Gtk4
Status `C:\Users\anonymous\.julia\environments\v1.9\Project.toml`
  [9db2cae5] Gtk4 v0.4.1
@jwahlstrand
Copy link
Member

Confirmed on Linux. The code works if I use

@idle_add init_canvas_gtk()

in the "clicked" callback instead of just init_canvas_gtk().

@Rratic
Copy link
Author

Rratic commented Jun 29, 2023

This works.

So shall I use @idle_add in every signal_connect in case of crash? If not, when shall I use it?

@tknopp
Copy link
Member

tknopp commented Aug 18, 2023

So shall I use @idle_add in every signal_connect in case of crash?

yes. When you are in a callback, always call @idle_add in case you are modifying the UI. In your case the empty!(topbox) call is modifying the UI.

@jwahlstrand: I am closing this one. If you see this as a bug, please re-open.

@tknopp tknopp closed this as completed Aug 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants