fdmemory: add flag to avoid close of the fd
authorWim Taymans <wtaymans@redhat.com>
Fri, 19 Aug 2016 07:27:01 +0000 (09:27 +0200)
committerWim Taymans <wtaymans@redhat.com>
Fri, 19 Aug 2016 07:27:01 +0000 (09:27 +0200)
Add GST_FD_MEMORY_FLAG_DONT_CLOSE to avoid closing the fd when the
memory is freed. When you can guarantee the lifetime of the fd is
longer than the memory, this can save a dup() call.

gst-libs/gst/allocators/gstfdmemory.c
gst-libs/gst/allocators/gstfdmemory.h

index 312a3d4..a15859a 100644 (file)
@@ -65,7 +65,8 @@ gst_fd_mem_free (GstAllocator * allocator, GstMemory * gmem)
 
     munmap ((void *) mem->data, gmem->maxsize);
   }
-  if (mem->fd >= 0 && gmem->parent == NULL)
+  if (mem->fd >= 0 && gmem->parent == NULL
+      && !(mem->flags & GST_FD_MEMORY_FLAG_DONT_CLOSE))
     close (mem->fd);
   g_mutex_clear (&mem->lock);
   g_slice_free (GstFdMemory, mem);
@@ -245,7 +246,8 @@ gst_fd_allocator_new (void)
  * Return a %GstMemory that wraps a generic file descriptor.
  *
  * Returns: (transfer full): a GstMemory based on @allocator.
- * When the buffer will be released the allocator will close the @fd.
+ * When the buffer will be released the allocator will close the @fd unless
+ * the %GST_FD_MEMORY_FLAG_DONT_CLOSE flag is specified.
  * The memory is only mmapped on gst_buffer_mmap() request.
  *
  * Since: 1.6
index 75efae2..40c90d0 100644 (file)
@@ -45,6 +45,8 @@ typedef struct _GstFdAllocatorClass GstFdAllocatorClass;
  *        keep it mapped until the memory is destroyed.
  * @GST_FD_MEMORY_FLAG_MAP_PRIVATE: do a private mapping instead of
  *        the default shared mapping.
+ * @GST_FD_MEMORY_FLAG_DONT_CLOSE: don't close the file descriptor when
+ *        the memory is freed. Since: 1.10.
  *
  * Various flags to control the operation of the fd backed memory.
  *
@@ -54,6 +56,7 @@ typedef enum {
   GST_FD_MEMORY_FLAG_NONE = 0,
   GST_FD_MEMORY_FLAG_KEEP_MAPPED = (1 << 0),
   GST_FD_MEMORY_FLAG_MAP_PRIVATE = (1 << 1),
+  GST_FD_MEMORY_FLAG_DONT_CLOSE  = (1 << 2),
 } GstFdMemoryFlags;
 
 /**