[PATCH 2/5] winegstreamer: Copy buffer outside of mutex in wg_parser_push_data.
Rémi Bernon
wine at gitlab.winehq.org
Tue Jun 14 02:27:00 CDT 2022
From: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winegstreamer/wg_parser.c | 41 ++++++++++++++--------------------
1 file changed, 17 insertions(+), 24 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index ca95f187aea..865b6d3643a 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -155,33 +155,26 @@ static NTSTATUS wg_parser_push_data(void *args)
struct wg_parser *parser = params->parser;
const void *data = params->data;
uint32_t size = params->size;
-
- pthread_mutex_lock(&parser->mutex);
-
- if (data)
- {
- if (size)
- {
- GstMapInfo map_info;
-
- /* Note that we don't allocate the buffer until we have a size.
- * midiparse passes a NULL buffer and a size of UINT_MAX, in an
- * apparent attempt to read the whole input stream at once. */
- parser->read_request.buffer = gst_buffer_new_and_alloc(size);
- gst_buffer_map(parser->read_request.buffer, &map_info, GST_MAP_WRITE);
- memcpy(map_info.data, data, size);
- gst_buffer_unmap(parser->read_request.buffer, &map_info);
- parser->read_request.ret = GST_FLOW_OK;
- }
- else
- {
- parser->read_request.ret = GST_FLOW_EOS;
- }
- }
+ GstBuffer *buffer = NULL;
+ GstFlowReturn result;
+
+ if (!data)
+ result = GST_FLOW_ERROR;
+ else if (!size)
+ result = GST_FLOW_EOS;
+ else if (!(buffer = gst_buffer_new_and_alloc(size)))
+ result = GST_FLOW_ERROR;
else
{
- parser->read_request.ret = GST_FLOW_ERROR;
+ gst_buffer_fill(buffer, 0, data, size);
+ GST_INFO("Copied %u bytes from data %p to buffer %p", size, data, buffer);
+ result = GST_FLOW_OK;
}
+
+ pthread_mutex_lock(&parser->mutex);
+
+ parser->read_request.ret = result;
+ parser->read_request.buffer = buffer;
parser->read_request.done = true;
parser->read_request.size = 0;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/242
More information about the wine-devel
mailing list