summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-27 21:28:15 +0000
committerdmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-27 21:28:15 +0000
commit8665d9b2badd79d646fca241529ca82c02f55948 (patch)
treeef7362a777e695e2117d28900b5f71cef1ef08f6
parent9bfcb6f4cf4f12f601b81fab7ba7b8ea2ccd2ac9 (diff)
downloadchromium_src-8665d9b2badd79d646fca241529ca82c02f55948.zip
chromium_src-8665d9b2badd79d646fca241529ca82c02f55948.tar.gz
chromium_src-8665d9b2badd79d646fca241529ca82c02f55948.tar.bz2
PPAPI: Introduce ability to Map a FileIO (Dev)
BUG=83774 R=bbudge@chromium.org, binji@chromium.org, kmixter@google.com, teravest@chromium.org, yzshen@chromium.org Review URL: https://codereview.chromium.org/23732002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@225777 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--native_client_sdk/src/libraries/ppapi/library.dsc1
-rw-r--r--ppapi/api/dev/ppb_file_io_dev.idl118
-rw-r--r--ppapi/api/pp_stdint.idl3
-rw-r--r--ppapi/c/dev/ppb_file_io_dev.h138
-rw-r--r--ppapi/generators/idl_ast.py3
-rwxr-xr-xppapi/generators/idl_c_proto.py8
-rw-r--r--ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c34
7 files changed, 304 insertions, 1 deletions
diff --git a/native_client_sdk/src/libraries/ppapi/library.dsc b/native_client_sdk/src/libraries/ppapi/library.dsc
index 620f61f..506e517 100644
--- a/native_client_sdk/src/libraries/ppapi/library.dsc
+++ b/native_client_sdk/src/libraries/ppapi/library.dsc
@@ -93,6 +93,7 @@
'ppb_cursor_control_dev.h',
'ppb_device_ref_dev.h',
'ppb_file_chooser_dev.h',
+ 'ppb_file_io_dev.h',
'ppb_find_dev.h',
'ppb_font_dev.h',
'ppb_gles_chromium_texture_mapping_dev.h',
diff --git a/ppapi/api/dev/ppb_file_io_dev.idl b/ppapi/api/dev/ppb_file_io_dev.idl
new file mode 100644
index 0000000..f46a4a8
--- /dev/null
+++ b/ppapi/api/dev/ppb_file_io_dev.idl
@@ -0,0 +1,118 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+/**
+ * This file defines methods for use with a PPB_FileIO resource that may become
+ * stable in the future. For now, they can be used only in plugins with DEV
+ * permissions.
+ */
+
+[generate_thunk]
+
+label Chrome {
+ M31 = 0.1
+};
+
+/**
+ * The PP_FileMapProtection values indicate the permissions requested for the
+ * file mapping. These should be used in a uint32_t bitfield.
+ */
+[assert_size(4)]
+ enum PP_FileMapProtection {
+ /** Requests read access to the mapped address. */
+ PP_FILEMAPPROTECTION_READ = 1u << 0,
+
+ /** Requests write access to the mapped address. */
+ PP_FILEMAPPROTECTION_WRITE = 1u << 1
+};
+
+/**
+ * The PP_FileMapFlags contain flag values for use with Map().
+ */
+[assert_size(4)]
+ enum PP_FileMapFlags {
+ /**
+ * Requests a shared mapping. If this flag is set, changes written to the
+ * memory region will be reflected in the underlying file and will thus
+ * eventually be visible to other processes which have opened the file. The
+ * file may not actually be updated until Unmap() is called. This is only
+ * valid if the PPB_FileIO resource was opened with write permission.
+ */
+ PP_FILEMAPFLAG_SHARED = 1u << 0,
+
+ /**
+ * Requests a copy-on-write mapping. If this flag is set, changes are not
+ * written to the underlying file, but only in the memory of the process
+ * (copy-on-write).
+ */
+ PP_FILEMAPFLAG_PRIVATE = 1u << 1,
+
+ /**
+ * Forces Map() to map the file contents at the provided |address|. If Map()
+ * can not comply, Map() will fail.
+ */
+ PP_FILEMAPFLAG_FIXED = 1u << 2
+};
+
+/**
+ * PPB_FileIO_Dev contains functions that are usable with PPB_FileIO resources
+ * but aren't yet considered stable yet and thus are not supported for general
+ * NaCl or PNaCl apps yet. Features here are being tested and refined for
+ * possible future inclusion in (stable) PPB_FileIO.
+ */
+interface PPB_FileIO_Dev {
+ /**
+ * Map() maps the contents from an offset of the file into memory.
+ *
+ * @param[in] file_io A PP_Resource corresponding to a file.
+ * @param[in] length The number of bytes to map.
+ * @param[in] map_protection A bitfield containing values from
+ * PP_FileMapProtection, indicating what memory operations should be permitted
+ * on the mapped region.
+ * @param[in] map_flags A bitfield containing values from
+ * PP_FileMapFlags, providing options for the behavior of Map. If the region
+ * is to be writeable, then exactly one of PP_FILEMAPFLAG_SHARED or
+ * PP_FILEMAPFLAG_PRIVATE must be set.
+ * @param[in] offset The offset into the file. Must be a multiple of the
+ * Map page size as returned by GetMapPageSize.
+ * @param[inout] address The value of |*address|, if non-NULL, will be used as
+ * a hint to determine where in memory the file should be mapped. If the value
+ * is NULL, the host operating system will choose |address|. Upon
+ * Map() completing, |*address| will contain the actual memory location at
+ * which the file was mapped. If the plugin provides a non-NULL |*address|, it
+ * must be a multiple of the map page size as returned by GetMapPageSize().
+ * @param[in] callback A PP_CompletionCallback to be called upon
+ * completion of Map().
+ *
+ * @return An int32_t containing an error code from <code>pp_errors.h</code>.
+ */
+ int32_t Map([in] PP_Resource file_io,
+ [in] int64_t length,
+ [in] uint32_t map_protection,
+ [in] uint32_t map_flags,
+ [in] int64_t offset,
+ [inout] mem_ptr_t address,
+ [in] PP_CompletionCallback callback);
+
+ /**
+ * Unmap() deletes the mapping of the specified address address to a
+ * file io. The specified address must have been retrieved with
+ * Map().
+ * @param[in] file_io A PP_Resource corresponding to a file.
+ * @param[in] address The starting address of the address in memory to
+ * be unmapped.
+ * @param[in] length The length of the region to unmap.
+ */
+ void Unmap(PP_Resource file_io, mem_t address, int64_t length);
+
+ /**
+ * GetMapPageSize() returns the size of pages that Map() uses. Returns 0 on
+ * failure.
+ */
+ [on_failure=0]
+ int64_t GetMapPageSize(PP_Resource file_io);
+};
+
diff --git a/ppapi/api/pp_stdint.idl b/ppapi/api/pp_stdint.idl
index 0a6d6b6..9f54d63 100644
--- a/ppapi/api/pp_stdint.idl
+++ b/ppapi/api/pp_stdint.idl
@@ -40,6 +40,9 @@ describe {
/** Pointer to memory (void *). */
mem_t;
+ /** Pointer to pointer to memory (void **). */
+ mem_ptr_t;
+
/** Pointer to null terminated string (char *). */
str_t;
diff --git a/ppapi/c/dev/ppb_file_io_dev.h b/ppapi/c/dev/ppb_file_io_dev.h
new file mode 100644
index 0000000..a60d3a6
--- /dev/null
+++ b/ppapi/c/dev/ppb_file_io_dev.h
@@ -0,0 +1,138 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* From dev/ppb_file_io_dev.idl modified Thu Sep 19 10:07:03 2013. */
+
+#ifndef PPAPI_C_DEV_PPB_FILE_IO_DEV_H_
+#define PPAPI_C_DEV_PPB_FILE_IO_DEV_H_
+
+#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_macros.h"
+#include "ppapi/c/pp_resource.h"
+#include "ppapi/c/pp_stdint.h"
+
+#define PPB_FILEIO_DEV_INTERFACE_0_1 "PPB_FileIO(Dev);0.1"
+#define PPB_FILEIO_DEV_INTERFACE PPB_FILEIO_DEV_INTERFACE_0_1
+
+/**
+ * @file
+ * This file defines methods for use with a PPB_FileIO resource that may become
+ * stable in the future. For now, they can be used only in plugins with DEV
+ * permissions.
+ */
+
+
+/**
+ * @addtogroup Enums
+ * @{
+ */
+/**
+ * The PP_FileMapProtection values indicate the permissions requested for the
+ * file mapping. These should be used in a uint32_t bitfield.
+ */
+typedef enum {
+ /** Requests read access to the mapped address. */
+ PP_FILEMAPPROTECTION_READ = 1u << 0,
+ /** Requests write access to the mapped address. */
+ PP_FILEMAPPROTECTION_WRITE = 1u << 1
+} PP_FileMapProtection;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_FileMapProtection, 4);
+
+/**
+ * The PP_FileMapFlags contain flag values for use with Map().
+ */
+typedef enum {
+ /**
+ * Requests a shared mapping. If this flag is set, changes written to the
+ * memory region will be reflected in the underlying file and will thus
+ * eventually be visible to other processes which have opened the file. The
+ * file may not actually be updated until Unmap() is called. This is only
+ * valid if the PPB_FileIO resource was opened with write permission.
+ */
+ PP_FILEMAPFLAG_SHARED = 1u << 0,
+ /**
+ * Requests a copy-on-write mapping. If this flag is set, changes are not
+ * written to the underlying file, but only in the memory of the process
+ * (copy-on-write).
+ */
+ PP_FILEMAPFLAG_PRIVATE = 1u << 1,
+ /**
+ * Forces Map() to map the file contents at the provided |address|. If Map()
+ * can not comply, Map() will fail.
+ */
+ PP_FILEMAPFLAG_FIXED = 1u << 2
+} PP_FileMapFlags;
+PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_FileMapFlags, 4);
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Interfaces
+ * @{
+ */
+/**
+ * PPB_FileIO_Dev contains functions that are usable with PPB_FileIO resources
+ * but aren't yet considered stable yet and thus are not supported for general
+ * NaCl or PNaCl apps yet. Features here are being tested and refined for
+ * possible future inclusion in (stable) PPB_FileIO.
+ */
+struct PPB_FileIO_Dev_0_1 {
+ /**
+ * Map() maps the contents from an offset of the file into memory.
+ *
+ * @param[in] file_io A PP_Resource corresponding to a file.
+ * @param[in] length The number of bytes to map.
+ * @param[in] map_protection A bitfield containing values from
+ * PP_FileMapProtection, indicating what memory operations should be permitted
+ * on the mapped region.
+ * @param[in] map_flags A bitfield containing values from
+ * PP_FileMapFlags, providing options for the behavior of Map. If the region
+ * is to be writeable, then exactly one of PP_FILEMAPFLAG_SHARED or
+ * PP_FILEMAPFLAG_PRIVATE must be set.
+ * @param[in] offset The offset into the file. Must be a multiple of the
+ * Map page size as returned by GetMapPageSize.
+ * @param[inout] address The value of |*address|, if non-NULL, will be used as
+ * a hint to determine where in memory the file should be mapped. If the value
+ * is NULL, the host operating system will choose |address|. Upon
+ * Map() completing, |*address| will contain the actual memory location at
+ * which the file was mapped. If the plugin provides a non-NULL |*address|, it
+ * must be a multiple of the map page size as returned by GetMapPageSize().
+ * @param[in] callback A PP_CompletionCallback to be called upon
+ * completion of Map().
+ *
+ * @return An int32_t containing an error code from <code>pp_errors.h</code>.
+ */
+ int32_t (*Map)(PP_Resource file_io,
+ int64_t length,
+ uint32_t map_protection,
+ uint32_t map_flags,
+ int64_t offset,
+ void** address,
+ struct PP_CompletionCallback callback);
+ /**
+ * Unmap() deletes the mapping of the specified address address to a
+ * file io. The specified address must have been retrieved with
+ * Map().
+ * @param[in] file_io A PP_Resource corresponding to a file.
+ * @param[in] address The starting address of the address in memory to
+ * be unmapped.
+ * @param[in] length The length of the region to unmap.
+ */
+ void (*Unmap)(PP_Resource file_io, void* address, int64_t length);
+ /**
+ * GetMapPageSize() returns the size of pages that Map() uses. Returns 0 on
+ * failure.
+ */
+ int64_t (*GetMapPageSize)(PP_Resource file_io);
+};
+
+typedef struct PPB_FileIO_Dev_0_1 PPB_FileIO_Dev;
+/**
+ * @}
+ */
+
+#endif /* PPAPI_C_DEV_PPB_FILE_IO_DEV_H_ */
+
diff --git a/ppapi/generators/idl_ast.py b/ppapi/generators/idl_ast.py
index 2765892..3c2b32d 100644
--- a/ppapi/generators/idl_ast.py
+++ b/ppapi/generators/idl_ast.py
@@ -15,7 +15,8 @@ from idl_release import IDLReleaseList, IDLReleaseMap
#
BuiltIn = set(['int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t',
'uint16_t', 'uint32_t', 'uint64_t', 'double_t', 'float_t',
- 'handle_t', 'interface_t', 'char', 'mem_t', 'str_t', 'void'])
+ 'handle_t', 'interface_t', 'char', 'mem_t', 'mem_ptr_t',
+ 'str_t', 'void'])
#
diff --git a/ppapi/generators/idl_c_proto.py b/ppapi/generators/idl_c_proto.py
index 0e0797a..7e49c02 100755
--- a/ppapi/generators/idl_c_proto.py
+++ b/ppapi/generators/idl_c_proto.py
@@ -125,6 +125,13 @@ class CGen(object):
'return': '%s',
'store': '%s'
},
+ 'mem_ptr_t': {
+ 'in': 'const %s',
+ 'inout': '%s',
+ 'out': '%s',
+ 'return': '%s',
+ 'store': '%s'
+ },
'str_t': {
'in': 'const %s',
'inout': '%s',
@@ -161,6 +168,7 @@ class CGen(object):
'double_t': 'double',
'handle_t': 'int',
'mem_t': 'void*',
+ 'mem_ptr_t': 'void**',
'str_t': 'char*',
'cstr_t': 'const char*',
'interface_t' : 'const void*'
diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
index 747d753..d4b8b1c 100644
--- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
+++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
@@ -13,6 +13,7 @@
#include "ppapi/c/dev/ppb_cursor_control_dev.h"
#include "ppapi/c/dev/ppb_device_ref_dev.h"
#include "ppapi/c/dev/ppb_file_chooser_dev.h"
+#include "ppapi/c/dev/ppb_file_io_dev.h"
#include "ppapi/c/dev/ppb_find_dev.h"
#include "ppapi/c/dev/ppb_font_dev.h"
#include "ppapi/c/dev/ppb_graphics_2d_dev.h"
@@ -179,6 +180,7 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_AudioInput_Dev_0_4;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_DeviceRef_Dev_0_1;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileChooser_Dev_0_5;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileChooser_Dev_0_6;
+static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Font_Dev_0_6;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_IMEInputEvent_Dev_0_1;
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_IMEInputEvent_Dev_0_2;
@@ -1831,6 +1833,25 @@ static int32_t Pnacl_M19_PPB_FileChooser_Dev_Show(PP_Resource chooser, struct PP
/* End wrapper methods for PPB_FileChooser_Dev_0_6 */
+/* Begin wrapper methods for PPB_FileIO_Dev_0_1 */
+
+static int32_t Pnacl_M31_PPB_FileIO_Dev_Map(PP_Resource file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void** address, struct PP_CompletionCallback* callback) {
+ const struct PPB_FileIO_Dev_0_1 *iface = Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1.real_iface;
+ return iface->Map(file_io, length, map_protection, map_flags, offset, address, *callback);
+}
+
+static void Pnacl_M31_PPB_FileIO_Dev_Unmap(PP_Resource file_io, void* address, int64_t length) {
+ const struct PPB_FileIO_Dev_0_1 *iface = Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1.real_iface;
+ iface->Unmap(file_io, address, length);
+}
+
+static int64_t Pnacl_M31_PPB_FileIO_Dev_GetMapPageSize(PP_Resource file_io) {
+ const struct PPB_FileIO_Dev_0_1 *iface = Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1.real_iface;
+ return iface->GetMapPageSize(file_io);
+}
+
+/* End wrapper methods for PPB_FileIO_Dev_0_1 */
+
/* Not generating wrapper methods for PPB_Find_Dev_0_3 */
/* Begin wrapper methods for PPB_Font_Dev_0_6 */
@@ -4556,6 +4577,12 @@ struct PPB_FileChooser_Dev_0_6 Pnacl_Wrappers_PPB_FileChooser_Dev_0_6 = {
.Show = (int32_t (*)(PP_Resource chooser, struct PP_ArrayOutput output, struct PP_CompletionCallback callback))&Pnacl_M19_PPB_FileChooser_Dev_Show
};
+struct PPB_FileIO_Dev_0_1 Pnacl_Wrappers_PPB_FileIO_Dev_0_1 = {
+ .Map = (int32_t (*)(PP_Resource file_io, int64_t length, uint32_t map_protection, uint32_t map_flags, int64_t offset, void** address, struct PP_CompletionCallback callback))&Pnacl_M31_PPB_FileIO_Dev_Map,
+ .Unmap = (void (*)(PP_Resource file_io, void* address, int64_t length))&Pnacl_M31_PPB_FileIO_Dev_Unmap,
+ .GetMapPageSize = (int64_t (*)(PP_Resource file_io))&Pnacl_M31_PPB_FileIO_Dev_GetMapPageSize
+};
+
/* Not generating wrapper interface for PPB_Find_Dev_0_3 */
struct PPB_Font_Dev_0_6 Pnacl_Wrappers_PPB_Font_Dev_0_6 = {
@@ -5445,6 +5472,12 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileChooser_Dev_0_6 = {
.real_iface = NULL
};
+static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1 = {
+ .iface_macro = PPB_FILEIO_DEV_INTERFACE_0_1,
+ .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_FileIO_Dev_0_1,
+ .real_iface = NULL
+};
+
static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Font_Dev_0_6 = {
.iface_macro = PPB_FONT_DEV_INTERFACE_0_6,
.wrapped_iface = (void *) &Pnacl_Wrappers_PPB_Font_Dev_0_6,
@@ -5825,6 +5858,7 @@ static struct __PnaclWrapperInfo *s_ppb_wrappers[] = {
&Pnacl_WrapperInfo_PPB_DeviceRef_Dev_0_1,
&Pnacl_WrapperInfo_PPB_FileChooser_Dev_0_5,
&Pnacl_WrapperInfo_PPB_FileChooser_Dev_0_6,
+ &Pnacl_WrapperInfo_PPB_FileIO_Dev_0_1,
&Pnacl_WrapperInfo_PPB_Font_Dev_0_6,
&Pnacl_WrapperInfo_PPB_IMEInputEvent_Dev_0_1,
&Pnacl_WrapperInfo_PPB_IMEInputEvent_Dev_0_2,