From 6a4099861e1ed4d2b4703248db0a2df321f277b1 Mon Sep 17 00:00:00 2001 From: Chris Speciale Date: Fri, 25 Oct 2024 11:08:15 -0400 Subject: [PATCH] OpenALBindings: Avoid deadlock when `Sys.exit()` is called This change eliminates the cleanup attempt of the current OpenAL context and associated system resources. A change in OpenAL 1.20.0 made it unlikely that we will be able to clean up things in this way moving forward. We should steer users toward using `lime.system.System.exit()` or petition a change in the haxe stdlib to allow us to hook into Sys.exit(). I am not 100% satisfied with this, so perhaps we will find another solution. In the end, I think the benefit of updating OpenAL supersedes any inconvenience here. Closes https://github.com/openfl/lime/issues/1803 --- project/src/media/openal/OpenALBindings.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/project/src/media/openal/OpenALBindings.cpp b/project/src/media/openal/OpenALBindings.cpp index cd67d72cc..fe549149d 100644 --- a/project/src/media/openal/OpenALBindings.cpp +++ b/project/src/media/openal/OpenALBindings.cpp @@ -142,7 +142,12 @@ namespace lime { } - + /*This has been removed after updating to openal 1.20.0+ since the cleanup functions involved + * lead to deadlocking. See https://github.com/openfl/lime/issues/1803 for more info. + * Developers should use lime.system.System.exit() instead of Sys.exit() to clean up any system + * resources + */ + /* void lime_al_atexit () { ALCcontext* alcContext = alcGetCurrentContext (); @@ -163,7 +168,7 @@ namespace lime { } } - + */ void lime_al_auxf (value aux, int param, float value) { @@ -3412,7 +3417,8 @@ namespace lime { value lime_alc_open_device (HxString devicename) { ALCdevice* alcDevice = alcOpenDevice (devicename.__s); - atexit (lime_al_atexit); + //TODO: Can we work out our own cleanup for openal? + //atexit (lime_al_atexit); value ptr = CFFIPointer (alcDevice, gc_alc_object); alcObjects[alcDevice] = ptr; @@ -3424,7 +3430,8 @@ namespace lime { HL_PRIM HL_CFFIPointer* HL_NAME(hl_alc_open_device) (hl_vstring* devicename) { ALCdevice* alcDevice = alcOpenDevice (devicename ? (char*)hl_to_utf8 ((const uchar*)devicename->bytes) : 0); - atexit (lime_al_atexit); + //TODO: Can we work out our own cleanup for openal? + //atexit (lime_al_atexit); HL_CFFIPointer* ptr = HLCFFIPointer (alcDevice, (hl_finalizer)hl_gc_alc_object); alcObjects[alcDevice] = ptr;