mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
fdmemory: Allow for change of protection mode
After a memory has been unmapped, protection mode can now be changed when mapping it again. See https://bugzilla.gnome.org/show_bug.cgi?id=789952. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/895>
This commit is contained in:
parent
eb216e3865
commit
e2a1aa44df
2 changed files with 49 additions and 1 deletions
|
@ -97,6 +97,12 @@ gst_fd_mem_map (GstMemory * gmem, gsize maxsize, GstMapFlags flags)
|
||||||
if ((mem->mmapping_flags & prot) == prot) {
|
if ((mem->mmapping_flags & prot) == prot) {
|
||||||
ret = mem->data;
|
ret = mem->data;
|
||||||
mem->mmap_count++;
|
mem->mmap_count++;
|
||||||
|
} else if ((mem->flags & GST_FD_MEMORY_FLAG_KEEP_MAPPED)
|
||||||
|
&& mem->mmap_count == 0
|
||||||
|
&& mprotect (mem->data, gmem->maxsize, prot) == 0) {
|
||||||
|
ret = mem->data;
|
||||||
|
mem->mmapping_flags = prot;
|
||||||
|
mem->mmap_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -154,8 +160,12 @@ gst_fd_mem_unmap (GstMemory * gmem)
|
||||||
if (gmem->parent)
|
if (gmem->parent)
|
||||||
return gst_fd_mem_unmap (gmem->parent);
|
return gst_fd_mem_unmap (gmem->parent);
|
||||||
|
|
||||||
if (mem->flags & GST_FD_MEMORY_FLAG_KEEP_MAPPED)
|
if (mem->flags & GST_FD_MEMORY_FLAG_KEEP_MAPPED) {
|
||||||
|
g_mutex_lock (&mem->lock);
|
||||||
|
mem->mmap_count--;
|
||||||
|
g_mutex_unlock (&mem->lock);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
g_mutex_lock (&mem->lock);
|
g_mutex_lock (&mem->lock);
|
||||||
if (mem->data && !(--mem->mmap_count)) {
|
if (mem->data && !(--mem->mmap_count)) {
|
||||||
|
|
|
@ -25,8 +25,13 @@
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <gst/check/gstcheck.h>
|
#include <gst/check/gstcheck.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <gst/allocators/gstdmabuf.h>
|
#include <gst/allocators/gstdmabuf.h>
|
||||||
|
#include <gst/allocators/gstfdmemory.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#define FILE_SIZE 4096
|
#define FILE_SIZE 4096
|
||||||
|
|
||||||
|
@ -60,6 +65,38 @@ GST_START_TEST (test_dmabuf)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_fdmem)
|
||||||
|
{
|
||||||
|
GstAllocator *alloc;
|
||||||
|
GstMemory *mem;
|
||||||
|
GstMapInfo info;
|
||||||
|
int fd;
|
||||||
|
const char *data = "0123456789";
|
||||||
|
|
||||||
|
fd = open ("test.txt", O_RDWR | O_CREAT);
|
||||||
|
g_assert (write (fd, data, 10) == 10);
|
||||||
|
|
||||||
|
alloc = gst_fd_allocator_new ();
|
||||||
|
g_assert (alloc);
|
||||||
|
mem = gst_fd_allocator_alloc (alloc, fd, 10, GST_FD_MEMORY_FLAG_KEEP_MAPPED);
|
||||||
|
|
||||||
|
g_assert (gst_memory_map (mem, &info, GST_MAP_READ));
|
||||||
|
g_assert (info.data[5] == '5');
|
||||||
|
gst_memory_unmap (mem, &info);
|
||||||
|
g_assert (gst_memory_map (mem, &info, GST_MAP_WRITE));
|
||||||
|
info.data[5] = 'X';
|
||||||
|
gst_memory_unmap (mem, &info);
|
||||||
|
g_assert (gst_memory_map (mem, &info, GST_MAP_READ));
|
||||||
|
g_assert (info.data[5] == 'X');
|
||||||
|
gst_memory_unmap (mem, &info);
|
||||||
|
|
||||||
|
gst_memory_unref (mem);
|
||||||
|
g_assert (remove ("test.txt") == 0);
|
||||||
|
gst_object_unref (alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
static Suite *
|
static Suite *
|
||||||
allocators_suite (void)
|
allocators_suite (void)
|
||||||
{
|
{
|
||||||
|
@ -68,6 +105,7 @@ allocators_suite (void)
|
||||||
|
|
||||||
suite_add_tcase (s, tc_chain);
|
suite_add_tcase (s, tc_chain);
|
||||||
tcase_add_test (tc_chain, test_dmabuf);
|
tcase_add_test (tc_chain, test_dmabuf);
|
||||||
|
tcase_add_test (tc_chain, test_fdmem);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue