[retro-gtk] Add RetroMemfd
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk] Add RetroMemfd
- Date: Sun, 16 Feb 2020 17:04:37 +0000 (UTC)
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]