Core dumped when defining a Channel as constant

module M
const C = Channel(ch -> put!(ch, nothing), ctype=Nothing)
end

Precompiling this module leads to core dumped…

[16831] signal (6.-6): Aborted
in expression starting at REPL[1]:1
unknown function (ip: 0xffffb12709f0)
gsignal at /lib/aarch64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/aarch64-linux-gnu/libc.so.6 (unknown line)
get_item_for_reloc at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:1813 [inlined]
jl_read_reloclist at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:1889
jl_restore_system_image_from_stream_ at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:3015
jl_restore_package_image_from_stream at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:3439
jl_restore_incremental_from_buf at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:3486
ijl_restore_package_image_from_file at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/staticdata.c:3570
_include_from_serialized at ./loading.jl:1058
_require_search_from_serialized at ./loading.jl:1581
_require at ./loading.jl:1938
__require_prelocked at ./loading.jl:1812
jfptr___require_prelocked_80802.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_in_world at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/builtins.c:831
#invoke_in_world#3 at ./essentials.jl:926 [inlined]
invoke_in_world at ./essentials.jl:923 [inlined]
_require_prelocked at ./loading.jl:1803
macro expansion at ./loading.jl:1790 [inlined]
macro expansion at ./lock.jl:267 [inlined]
__require at ./loading.jl:1753
jfptr___require_80767.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_in_world at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/builtins.c:831
#invoke_in_world#3 at ./essentials.jl:926 [inlined]
invoke_in_world at ./essentials.jl:923 [inlined]
require at ./loading.jl:1746
jfptr_require_80764.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
call_require at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:481 [inlined]
eval_import_path at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:518
jl_toplevel_eval_flex at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:752
eval_body at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/interpreter.c:583
jl_interpret_toplevel_thunk at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
eval_user_input at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
repl_backend_loop at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
#start_repl_backend#46 at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
start_repl_backend at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:228
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
#run_repl#59 at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
run_repl at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
jfptr_run_repl_91768.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
#1013 at ./client.jl:432
jfptr_YY.1013_82734.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
run_main_repl at ./client.jl:416
exec_options at ./client.jl:333
_start at ./client.jl:552
jfptr__start_82760.3 at /usr/local/julia/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/default-aws-aarch64-ci-0-2/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at julia (unknown line)
unknown function (ip: 0xffffb121773f)
__libc_start_main at /lib/aarch64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x400a1b)
unknown function (ip: 0x400a1b)
Allocations: 5155805 (Pool: 5151131; Big: 4674); GC: 9
Aborted (core dumped)

I created this Channel in order to make sure, I really start only a single background thread task (1 corresponding to the 1 element in the channel and using take! for syncronization)

How can I create a central Channel object, or what alternatives do exist?
Any help is highly appreciated

I think you need to do this:

const C = Ref{Channel}()

function __init__()
    C[] = Channel(ch -> put!(ch, nothing), ctype=Nothing)
    atexit(()-> close(C[]))
end

Since you can’t precompile globals that contain a task.
Although it shouldn’t segfault, maybe its a regression on the julia version you use, I get ErrorException("Task cannot be serialized")

2 Likes

thank you for pointing to __init__ - if I remember right also this is precompiled as soon as you use the package as a dependency of another package. So it only helps when this is a “leaf”-package (not tested though, but I am in general super cautious with init because of this unobvious involvement in precompilation)

I am actually using julia 1.10.5

I think init is fine here…
If you still want to avoid it, just make a get_global_channel, which initializes the global on the first call.

1 Like

if I do the following instead

module M
const C = Channel{Nothing}()
put!(C, nothing)
end

the precompilation of the module seems to run forever infinitely…
Really weird stuff. (I tried this because I thought it would not create a Task object, and circumvent the use of __init__ )

Really weird stuff. (I tried this because I thought it would not create a Task object)

Not really, the channel is unbuffered and has no task fetching the items, so put! will hang.

1 Like

thank you so much!! of course…

so then this is probably my preferred solution

module M
const C = Channel{Nothing}(1)
put!(C, nothing)
end

as it does not require __init__

thank you for your help @sdanisch