Alistair Leslie-Hughes : xactengine3_7: Remove entry after FAudio Destroyed call.
Alexandre Julliard
julliard at winehq.org
Mon Jul 25 16:18:24 CDT 2022
Module: wine
Branch: master
Commit: 5f6425f0efa74a44bdeb65f065a9db3a19e9628c
URL: https://gitlab.winehq.org/wine/wine/-/commit/5f6425f0efa74a44bdeb65f065a9db3a19e9628c
Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Fri Jul 22 12:34:27 2022 +1000
xactengine3_7: Remove entry after FAudio Destroyed call.
FACTWaveBank_Destroy will invoke the callback which we
attempt to lookup the wavebank.
The callback must have a pointer, help states it isn't valid but still
points to the wavebank that was destroyed.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/xactengine3_7/tests/xact3.c | 6 ++--
dlls/xactengine3_7/xact_dll.c | 70 ++++++++++++++++++++++------------------
2 files changed, 42 insertions(+), 34 deletions(-)
diff --git a/dlls/xactengine3_7/tests/xact3.c b/dlls/xactengine3_7/tests/xact3.c
index 5daa18ca81b..6b66af59ff0 100644
--- a/dlls/xactengine3_7/tests/xact3.c
+++ b/dlls/xactengine3_7/tests/xact3.c
@@ -172,9 +172,11 @@ static void WINAPI notification_cb(const XACT_NOTIFICATION *notification)
data->received = TRUE;
ok(notification->type == data->type,
"Unexpected notification type %u\n", notification->type);
- todo_wine_if(notification->type == XACTNOTIFICATIONTYPE_WAVEBANKDESTROYED)
- ok(notification->waveBank.pWaveBank == data->wave_bank, "Unexpected wave bank %p instead of %p\n",
+ if(notification->type == XACTNOTIFICATIONTYPE_WAVEBANKDESTROYED)
+ {
+ ok(notification->waveBank.pWaveBank == data->wave_bank, "Unexpected wave bank %p instead of %p\n",
notification->waveBank.pWaveBank, data->wave_bank);
+ }
ok(thread_id == data->thread_id, "Unexpected thread id %#lx instead of %#lx\n", thread_id, data->thread_id);
}
diff --git a/dlls/xactengine3_7/xact_dll.c b/dlls/xactengine3_7/xact_dll.c
index f7be480656d..ee559dd4b07 100644
--- a/dlls/xactengine3_7/xact_dll.c
+++ b/dlls/xactengine3_7/xact_dll.c
@@ -60,6 +60,21 @@ struct wrapper_lookup
void *xact;
};
+typedef struct _XACT3EngineImpl {
+ IXACT3Engine IXACT3Engine_iface;
+
+ FACTAudioEngine *fact_engine;
+
+ XACT_READFILE_CALLBACK pReadFile;
+ XACT_GETOVERLAPPEDRESULT_CALLBACK pGetOverlappedResult;
+ XACT_NOTIFICATION_CALLBACK notification_callback;
+
+ void *wb_prepared_context;
+ void *wb_destroyed_context;
+ struct wine_rb_tree wb_wrapper_lookup;
+ CRITICAL_SECTION wb_wrapper_lookup_cs;
+} XACT3EngineImpl;
+
static int wrapper_lookup_compare(const void *key, const struct wine_rb_entry *entry)
{
struct wrapper_lookup *lookup = WINE_RB_ENTRY_VALUE(entry, struct wrapper_lookup, entry);
@@ -74,20 +89,30 @@ static void wrapper_lookup_destroy(struct wine_rb_entry *entry, void *context)
HeapFree(GetProcessHeap(), 0, lookup);
}
-typedef struct _XACT3EngineImpl {
- IXACT3Engine IXACT3Engine_iface;
+static void wrapper_remove_entry(XACT3EngineImpl *engine, void *key)
+{
+ struct wrapper_lookup *lookup;
+ struct wine_rb_entry *entry;
- FACTAudioEngine *fact_engine;
+ EnterCriticalSection(&engine->wb_wrapper_lookup_cs);
- XACT_READFILE_CALLBACK pReadFile;
- XACT_GETOVERLAPPEDRESULT_CALLBACK pGetOverlappedResult;
- XACT_NOTIFICATION_CALLBACK notification_callback;
+ entry = wine_rb_get(&engine->wb_wrapper_lookup, key);
+ if (!entry)
+ {
+ LeaveCriticalSection(&engine->wb_wrapper_lookup_cs);
- void *wb_prepared_context;
- void *wb_destroyed_context;
- struct wine_rb_tree wb_wrapper_lookup;
- CRITICAL_SECTION wb_wrapper_lookup_cs;
-} XACT3EngineImpl;
+ WARN("cannot find key in wrapper lookup\n");
+ }
+ else
+ {
+ wine_rb_remove(&engine->wb_wrapper_lookup, entry);
+
+ LeaveCriticalSection(&engine->wb_wrapper_lookup_cs);
+
+ lookup = WINE_RB_ENTRY_VALUE(entry, struct wrapper_lookup, entry);
+ HeapFree(GetProcessHeap(), 0, lookup);
+ }
+}
typedef struct _XACT3CueImpl {
IXACT3Cue IXACT3Cue_iface;
@@ -591,33 +616,14 @@ static inline XACT3WaveBankImpl *impl_from_IXACT3WaveBank(IXACT3WaveBank *iface)
static HRESULT WINAPI IXACT3WaveBankImpl_Destroy(IXACT3WaveBank *iface)
{
XACT3WaveBankImpl *This = impl_from_IXACT3WaveBank(iface);
- struct wrapper_lookup *lookup;
- struct wine_rb_entry *entry;
HRESULT hr;
TRACE("(%p)\n", This);
- EnterCriticalSection(&This->engine->wb_wrapper_lookup_cs);
-
- entry = wine_rb_get(&This->engine->wb_wrapper_lookup, This->fact_wavebank);
-
- if (!entry)
- {
- LeaveCriticalSection(&This->engine->wb_wrapper_lookup_cs);
-
- WARN("cannot find wave bank in wrapper lookup\n");
- }
- else
- {
- wine_rb_remove(&This->engine->wb_wrapper_lookup, entry);
+ hr = FACTWaveBank_Destroy(This->fact_wavebank);
- LeaveCriticalSection(&This->engine->wb_wrapper_lookup_cs);
+ wrapper_remove_entry(This->engine, This->fact_wavebank);
- lookup = WINE_RB_ENTRY_VALUE(entry, struct wrapper_lookup, entry);
- HeapFree(GetProcessHeap(), 0, lookup);
- }
-
- hr = FACTWaveBank_Destroy(This->fact_wavebank);
HeapFree(GetProcessHeap(), 0, This);
return hr;
}
More information about the wine-cvs
mailing list