Robert Reif wrote:
> Fix memory leak in mixer code.
>
>
>
Revised to remove unnecessary test before HeapFree.
Index: dlls/dsound/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound.c,v
retrieving revision 1.24
diff -u -p -r1.24 dsound.c
--- dlls/dsound/dsound.c 7 Dec 2004 14:23:46 -0000 1.24
+++ dlls/dsound/dsound.c 22 Jan 2005 20:52:27 -0000
@@ -301,6 +301,7 @@ static ULONG WINAPI IDirectSoundImpl_Rel
if (This->driver)
IDsDriver_Release(This->driver);
+ HeapFree(GetProcessHeap(),0,This->tmp_buffer);
RtlDeleteResource(&This->buffer_list_lock);
This->mixlock.DebugInfo->Spare[1] = 0;
DeleteCriticalSection(&This->mixlock);
@@ -809,6 +810,8 @@ HRESULT WINAPI IDirectSoundImpl_Create(
pDS->primary = NULL;
pDS->speaker_config = DSSPEAKER_STEREO | (DSSPEAKER_GEOMETRY_NARROW << 16);
pDS->initialized = FALSE;
+ pDS->tmp_buffer = NULL;
+ pDS->tmp_buffer_len = 0;
/* 3D listener initial parameters */
pDS->listener = NULL;
Index: dlls/dsound/dsound_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound_private.h,v
retrieving revision 1.24
diff -u -p -r1.24 dsound_private.h
--- dlls/dsound/dsound_private.h 7 Sep 2004 19:32:21 -0000 1.24
+++ dlls/dsound/dsound_private.h 22 Jan 2005 20:52:27 -0000
@@ -95,6 +95,8 @@ struct IDirectSoundImpl
DSBUFFERDESC dsbd;
DWORD speaker_config;
BOOL initialized;
+ LPBYTE tmp_buffer;
+ DWORD tmp_buffer_len;
/* DirectSound3DListener fields */
IDirectSound3DListenerImpl* listener;
Index: dlls/dsound/mixer.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/mixer.c,v
retrieving revision 1.26
diff -u -p -r1.26 mixer.c
--- dlls/dsound/mixer.c 8 Sep 2004 01:37:25 -0000 1.26
+++ dlls/dsound/mixer.c 22 Jan 2005 20:52:27 -0000
@@ -368,20 +368,20 @@ static void DSOUND_MixerVol(IDirectSound
}
}
-static void *tmp_buffer;
-static size_t tmp_buffer_len = 0;
-
-static void *DSOUND_tmpbuffer(size_t len)
+static LPBYTE DSOUND_tmpbuffer(IDirectSoundImpl *dsound, DWORD len)
{
- if (len>tmp_buffer_len) {
- void *new_buffer = realloc(tmp_buffer, len);
- if (new_buffer) {
- tmp_buffer = new_buffer;
- tmp_buffer_len = len;
+ TRACE("(%p,%ld)\n",dsound,len);
+
+ if (len > dsound->tmp_buffer_len) {
+ if (dsound->tmp_buffer)
+ dsound->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsound->tmp_buffer, len);
+ else
+ dsound->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, len);
+
+ dsound->tmp_buffer_len = len;
}
- return new_buffer;
- }
- return tmp_buffer;
+
+ return dsound->tmp_buffer;
}
static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD fraglen)
@@ -407,9 +407,7 @@ static DWORD DSOUND_MixInBuffer(IDirectS
return 0;
}
- /* Been seeing segfaults in malloc() for some reason... */
- TRACE("allocating buffer (size = %d)\n", len);
- if ((buf = ibuf = (BYTE *) DSOUND_tmpbuffer(len)) == NULL)
+ if ((buf = ibuf = DSOUND_tmpbuffer(dsb->dsound, len)) == NULL)
return 0;
TRACE("MixInBuffer (%p) len = %d, dest = %ld\n", dsb, len, writepos);
@@ -518,8 +516,7 @@ static void DSOUND_PhaseCancel(IDirectSo
nBlockAlign = dsb->dsound->pwfx->nBlockAlign;
len = len / nBlockAlign * nBlockAlign; /* data alignment */
- TRACE("allocating buffer (size = %ld)\n", len);
- if ((buf = ibuf = (BYTE *) DSOUND_tmpbuffer(len)) == NULL)
+ if ((buf = ibuf = DSOUND_tmpbuffer(dsb->dsound, len)) == NULL)
return;
TRACE("PhaseCancel (%p) len = %ld, dest = %ld\n", dsb, len, writepos);