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")

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.

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.

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