diff options
author | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-27 21:28:15 +0000 |
---|---|---|
committer | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-27 21:28:15 +0000 |
commit | 8665d9b2badd79d646fca241529ca82c02f55948 (patch) | |
tree | ef7362a777e695e2117d28900b5f71cef1ef08f6 | |
parent | 9bfcb6f4cf4f12f601b81fab7ba7b8ea2ccd2ac9 (diff) | |
download | chromium_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.dsc | 1 | ||||
-rw-r--r-- | ppapi/api/dev/ppb_file_io_dev.idl | 118 | ||||
-rw-r--r-- | ppapi/api/pp_stdint.idl | 3 | ||||
-rw-r--r-- | ppapi/c/dev/ppb_file_io_dev.h | 138 | ||||
-rw-r--r-- | ppapi/generators/idl_ast.py | 3 | ||||
-rwxr-xr-x | ppapi/generators/idl_c_proto.py | 8 | ||||
-rw-r--r-- | ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c | 34 |
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, |