[retro-gtk] Add RetroMemfd



commit 24eea501d98dc3c3a97753e4760beab63ae6ad49
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Tue Jan 14 02:20:04 2020 +0500

    Add RetroMemfd
    
    Copy a function for creating a memfd from sysprof, originally written by
    Christian Hergert.

 shared/meson.build           |  1 +
 shared/retro-memfd-private.h | 11 +++++
 shared/retro-memfd.c         | 98 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 110 insertions(+)
---
diff --git a/shared/meson.build b/shared/meson.build
index bb52b13..b8be7c7 100644
--- a/shared/meson.build
+++ b/shared/meson.build
@@ -2,6 +2,7 @@ shared_sources = files([
   'retro-controller-codes.c',
   'retro-controller-type.c',
   'retro-input.c',
+  'retro-memfd.c',
   'retro-memory-type.c',
   'retro-pixel-format.c',
   'retro-rumble-effect.c',
diff --git a/shared/retro-memfd-private.h b/shared/retro-memfd-private.h
new file mode 100644
index 0000000..1c7646b
--- /dev/null
+++ b/shared/retro-memfd-private.h
@@ -0,0 +1,11 @@
+// This file is part of retro-gtk. License: GPL-3.0+.
+
+#pragma once
+
+#include <glib-2.0/glib.h>
+
+G_BEGIN_DECLS
+
+gint retro_memfd_create (const gchar *name);
+
+G_END_DECLS
diff --git a/shared/retro-memfd.c b/shared/retro-memfd.c
new file mode 100644
index 0000000..6d27c88
--- /dev/null
+++ b/shared/retro-memfd.c
@@ -0,0 +1,98 @@
+/* sysprof-platform.c
+ *
+ * Copyright 2016-2019 Christian Hergert <chergert redhat com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Subject to the terms and conditions of this license, each copyright holder
+ * and contributor hereby grants to those receiving rights under this license
+ * a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+ * irrevocable (except for failure to satisfy the conditions of this license)
+ * patent license to make, have made, use, offer to sell, sell, import, and
+ * otherwise transfer this software, where such license applies only to those
+ * patent claims, already acquired or hereafter acquired, licensable by such
+ * copyright holder or contributor that are necessarily infringed by:
+ *
+ * (a) their Contribution(s) (the licensed copyrights of copyright holders
+ *     and non-copyrightable additions of contributors, in source or binary
+ *     form) alone; or
+ *
+ * (b) combination of their Contribution(s) with the work of authorship to
+ *     which such Contribution(s) was added by such copyright holder or
+ *     contributor, if, at the time the Contribution is added, such addition
+ *     causes such combination to be necessarily infringed. The patent license
+ *     shall not apply to any other combinations which include the
+ *     Contribution.
+ *
+ * Except as expressly stated above, no rights or licenses from any copyright
+ * holder or contributor is granted under this license, whether expressly, by
+ * implication, estoppel or otherwise.
+ *
+ * DISCLAIMER
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause-Patent
+ */
+
+#include "retro-memfd-private.h"
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+/**
+ * retro_memfd_create:
+ * @name: (nullable): A descriptive name for the memfd or %NULL
+ *
+ * Creates a new memfd using the memfd_create syscall if available.
+ * Otherwise, a tmpfile is used. Currently, no attempt is made to
+ * ensure the tmpfile is on a tmpfs backed mount.
+ *
+ * Returns: An fd if successful; otherwise -1 and errno is set.
+ */
+gint
+retro_memfd_create (const gchar *name)
+{
+#ifdef __NR_memfd_create
+  return syscall (__NR_memfd_create, name, 0);
+#else
+  g_autofree gchar *name_used = NULL;
+  gint fd;
+
+  /*
+   * TODO: It would be nice to ensure tmpfs
+   *
+   * It is not strictly required that the preferred temporary directory
+   * will be mounted as tmpfs. We should look through the mounts and ensure
+   * that the tmpfile we open is on tmpfs so that we get anonymous backed
+   * pages after unlinking.
+   */
+  fd = g_file_open_tmp (NULL, &name_used, NULL);
+
+  if (name_used != NULL)
+    g_unlink (name_used);
+
+  return fd;
+#endif
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]