metacall / core

MetaCall: The ultimate polyglot programming experience.
https://metacall.io
Apache License 2.0
1.55k stars 160 forks source link

Thread deadlock in the NodeJS loader #499

Closed devraymondsh closed 4 months ago

devraymondsh commented 4 months ago

🐛 Bug Report

Thread deadlock in the NodeJS loader

Run the test to replicate the issue:

ctest -VV -R metacall-node-multithread-deadlock-test

Output:

UpdateCTestConfiguration  from :/home/raymond/projects/core/build/DartConfiguration.tcl
Parse Config file:/home/raymond/projects/core/build/DartConfiguration.tcl
UpdateCTestConfiguration  from :/home/raymond/projects/core/build/DartConfiguration.tcl
Parse Config file:/home/raymond/projects/core/build/DartConfiguration.tcl
Test project /home/raymond/projects/core/build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 27
    Start 27: metacall-node-multithread-deadlock-test

27: Test command: /home/raymond/projects/core/build/metacall-node-multithread-deadlock-testd
27: Working Directory: /home/raymond/projects/core/build/source/tests/metacall_node_multithread_deadlock_test
27: Environment variables:
27:  LOADER_LIBRARY_PATH=/home/raymond/projects/core/build
27:  LOADER_SCRIPT_PATH=/home/raymond/projects/core/build/scripts
27:  CONFIGURATION_PATH=/home/raymond/projects/core/build/configurations/global.json
27:  SERIAL_LIBRARY_PATH=/home/raymond/projects/core/build
27:  DETOUR_LIBRARY_PATH=/home/raymond/projects/core/build
27:  PORT_LIBRARY_PATH=/home/raymond/projects/core/build
27: Test timeout computed to be: 1500
27: [==========] Running 1 test from 1 test suite.
27: [----------] Global test environment set-up.
27: [----------] 1 test from metacall_node_multithread_deadlock_test
27: [ RUN      ] metacall_node_multithread_deadlock_test.DefaultConstructor
27: Debug: MetaCall default logger to stdout initialized
27: Debug: Initializing MetaCall
27: Debug: Global configuration loaded from /home/raymond/projects/core/build/configurations/global.json
27: Debug: Loading plugin: rapid_json_seriald
27: Debug: Loading plugin symbol: dynlink_symbol_rapid_json_serial_impl_interface_singleton
27: Debug: Set MetaCall log level to Debug
27: Debug: Loader script path: /home/raymond/projects/core/build/scripts/
27: Debug: Loading plugin: ext_loaderd
27: Debug: Loading plugin symbol: dynlink_symbol_ext_loader_impl_interface_singleton
27: Debug: Loading plugin: /home/raymond/projects/core/build/plugins/backtrace_plugin/metacall.json
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
27: metacall-node-multithread-deadlock-testd: /home/raymond/projects/core/source/metacall/source/metacall_value.c:317: metacall_value_to_future: Assertion `value_type_id(v) == TYPE_FUTURE' failed.
27: metacall-node-multithread-deadlock-testd: /home/raymond/projects/core/source/metacall/source/metacall_value.c:317: metacall_value_to_future: Assertion `value_type_id(v) == TYPE_FUTURE' failed.
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:53: Failure
27: Expected: ((void *)__null) != ((void *)future), actual: NULL vs NULL
27:
27: /home/raymond/projects/core/source/tests/metacall_node_multithread_deadlock_test/source/metacall_node_multithread_deadlock_test.cpp:55: Failure
27: Expected equality of these values:
27:   (enum metacall_value_id)metacall_value_id(future)
27:     Which is: 20
27:   (enum metacall_value_id)METACALL_FUTURE
27:     Which is: 12
27:
1/1 Test #27: metacall-node-multithread-deadlock-test ...Subprocess aborted***Exception:   0.19 sec

0% tests passed, 1 tests failed out of 1

Label Time Summary:
metacall-node-multithread-deadlock-test    =   0.19 sec*proc (1 test)

Total Test time (real) =   0.19 sec

The following tests FAILED:
     27 - metacall-node-multithread-deadlock-test (Subprocess aborted)
Errors while running CTest
Output from these tests are in: /home/raymond/projects/core/build/Testing/Temporary/LastTest.log
Use "--rerun-failed --output-on-failure" to re-run the failed cases verbosely.
viferga commented 4 months ago

This is partially solved, it needs to be properly refactored and extended to all the loader implementation.. but the workaround is done: https://github.com/metacall/core/pull/502