Jacek Caban : winepulse: Use NtAllocateVirtualMemory for tmp_buffer.

Alexandre Julliard julliard at winehq.org
Thu May 27 16:02:12 CDT 2021


Module: wine
Branch: master
Commit: 77813eb7586779df0fb3b700000a17e339fd5ce3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=77813eb7586779df0fb3b700000a17e339fd5ce3

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed May 26 16:18:53 2021 +0200

winepulse: Use NtAllocateVirtualMemory for tmp_buffer.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winepulse.drv/pulse.c | 35 +++++++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 4710728cd88..96b9b696125 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -61,7 +61,7 @@ struct pulse_stream
     INT32 locked;
     UINT32 bufsize_frames, real_bufsize_bytes, period_bytes;
     UINT32 started, peek_ofs, read_offs_bytes, lcl_offs_bytes, pa_offs_bytes;
-    UINT32 tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len, pa_held_bytes;
+    SIZE_T tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len, pa_held_bytes;
     BYTE *local_buffer, *tmp_buffer, *peek_buffer;
     void *locked_ptr;
     BOOL please_quit, just_started, just_underran;
@@ -909,7 +909,9 @@ static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE time
     pa_stream_unref(stream->stream);
     pulse_unlock();
 
-    RtlFreeHeap(GetProcessHeap(), 0, stream->tmp_buffer);
+    if (stream->tmp_buffer)
+        NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
+                            &stream->tmp_buffer_bytes, MEM_RELEASE);
     free(stream->peek_buffer);
     RtlFreeHeap(GetProcessHeap(), 0, stream->local_buffer);
     free(stream);
@@ -1077,8 +1079,7 @@ static void pulse_write(struct pulse_stream *stream)
     }
 
     buf = stream->local_buffer + stream->pa_offs_bytes;
-    TRACE("held: %u, avail: %u\n",
-            stream->pa_held_bytes, bytes);
+    TRACE("held: %lu, avail: %u\n", stream->pa_held_bytes, bytes);
     bytes = min(stream->pa_held_bytes, bytes);
 
     if (stream->pa_offs_bytes + bytes > stream->real_bufsize_bytes)
@@ -1453,14 +1454,24 @@ static HRESULT WINAPI pulse_reset(struct pulse_stream *stream)
     return S_OK;
 }
 
-static void alloc_tmp_buffer(struct pulse_stream *stream, UINT32 bytes)
+static BOOL alloc_tmp_buffer(struct pulse_stream *stream, SIZE_T bytes)
 {
     if (stream->tmp_buffer_bytes >= bytes)
-        return;
+        return TRUE;
+
+    if (stream->tmp_buffer)
+    {
+        NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
+                            &stream->tmp_buffer_bytes, MEM_RELEASE);
+        stream->tmp_buffer = NULL;
+        stream->tmp_buffer_bytes = 0;
+    }
+    if (NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
+                                0, &bytes, MEM_COMMIT, PAGE_READWRITE))
+        return FALSE;
 
-    RtlFreeHeap(GetProcessHeap(), 0, stream->tmp_buffer);
-    stream->tmp_buffer = RtlAllocateHeap(GetProcessHeap(), 0, bytes);
     stream->tmp_buffer_bytes = bytes;
+    return TRUE;
 }
 
 static UINT32 pulse_render_padding(struct pulse_stream *stream)
@@ -1515,7 +1526,11 @@ static HRESULT WINAPI pulse_get_render_buffer(struct pulse_stream *stream, UINT3
     wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes;
     if (wri_offs_bytes + bytes > stream->real_bufsize_bytes)
     {
-        alloc_tmp_buffer(stream, bytes);
+        if (!alloc_tmp_buffer(stream, bytes))
+        {
+            pulse_unlock();
+            return E_OUTOFMEMORY;
+        }
         *data = stream->tmp_buffer;
         stream->locked = -bytes;
     }
@@ -1590,7 +1605,7 @@ static HRESULT WINAPI pulse_release_render_buffer(struct pulse_stream *stream, U
     stream->clock_written += written_bytes;
     stream->locked = 0;
 
-    TRACE("Released %u, held %zu\n", written_frames, stream->held_bytes / pa_frame_size(&stream->ss));
+    TRACE("Released %u, held %lu\n", written_frames, stream->held_bytes / pa_frame_size(&stream->ss));
 
     pulse_unlock();
     return S_OK;




More information about the wine-cvs mailing list