When WirePlumber exits, it crashes with SIGABRT. The backtrace shows:
7 g_closure_invalidate
10 g_object_unref
15 g_value_unset
16 _wplua_gvalue_userdata___gc
26 close_state (lua_close)
27 wp_plugin_deactivate
33 wp_registry_clear
34 wp_core_dispose
Root cause: lua_State is referenced by both the main plugin and each
WpLuaScript object. During registry cleanup, scripts call lua_close again
on an already-destroyed state, causing use-after-free.
Fix:
- Add a prepare_shutdown vfunc in WpPlugin. Call it from wp_core_dispose
*before* clearing the registry.
- Lua plugin implements prepare_shutdown to close its lua_State early,
allowing all __gc finalizers to run while GObjects are still alive.
- Then clear the lua_State pointer from every WpLuaScript object via
wp_lua_script_clear_lua_state().
- Guard WpLuaScript finalize to skip if pointer is already NULL.
This allows scripts to declare when they have finished their loading,
so we can now also know when wireplumber is done loading and ready to
handle clients
Related to !313