1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Note: This header should be compilable as C. 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_ 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_ 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <stddef.h> 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "mojo/public/c/system/core.h" 13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The embedder needs to bind the basic Mojo Core functions of a DSO to those of 15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the embedder when loading a DSO that is dependent on mojo_system. 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The typical usage would look like: 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// base::ScopedNativeLibrary app_library( 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// base::LoadNativeLibrary(app_path_, &error)); 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// typedef MojoResult (*MojoSetSystemThunksFn)(MojoSystemThunks*); 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSetSystemThunksFn mojo_set_system_thunks_fn = 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer( 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// "MojoSetSystemThunks")); 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSystemThunks system_thunks = MojoMakeSystemThunks(); 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// size_t expected_size = mojo_set_system_thunks_fn(&system_thunks); 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// if (expected_size > sizeof(MojoSystemThunks)) { 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// LOG(ERROR) 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// << "Invalid DSO. Expected MojoSystemThunks size: " 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// << expected_size; 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// break; 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// } 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Structure used to bind the basic Mojo Core functions of a DSO to those of 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the embedder. 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This is the ABI between the embedder and the DSO. It can only have new 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// functions added to the end. No other changes are supported. 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#pragma pack(push, 8) 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstruct MojoSystemThunks { 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch size_t size; // Should be set to sizeof(MojoSystemThunks). 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoTimeTicks (*GetTimeTicksNow)(); 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*Close)(MojoHandle handle); 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*Wait)(MojoHandle handle, 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MojoHandleSignals signals, 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoDeadline deadline); 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*WaitMany)(const MojoHandle* handles, 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const MojoHandleSignals* signals, 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t num_handles, 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoDeadline deadline); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MojoResult (*CreateMessagePipe)( 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const struct MojoCreateMessagePipeOptions* options, 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MojoHandle* message_pipe_handle0, 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MojoHandle* message_pipe_handle1); 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*WriteMessage)(MojoHandle message_pipe_handle, 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const void* bytes, 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t num_bytes, 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const MojoHandle* handles, 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t num_handles, 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWriteMessageFlags flags); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*ReadMessage)(MojoHandle message_pipe_handle, 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void* bytes, 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* num_bytes, 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle* handles, 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* num_handles, 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoReadMessageFlags flags); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options, 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle* data_pipe_producer_handle, 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle* data_pipe_consumer_handle); 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle, 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const void* elements, 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* num_elements, 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWriteDataFlags flags); 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle, 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void** buffer, 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* buffer_num_elements, 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWriteDataFlags flags); 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle, 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t num_elements_written); 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle, 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void* elements, 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* num_elements, 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoReadDataFlags flags); 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle, 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const void** buffer, 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t* buffer_num_elements, 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoReadDataFlags flags); 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle, 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t num_elements_read); 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*CreateSharedBuffer)( 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const struct MojoCreateSharedBufferOptions* options, 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint64_t num_bytes, 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle* shared_buffer_handle); 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*DuplicateBufferHandle)( 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle buffer_handle, 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const struct MojoDuplicateBufferHandleOptions* options, 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoHandle* new_buffer_handle); 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*MapBuffer)(MojoHandle buffer_handle, 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint64_t offset, 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint64_t num_bytes, 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void** buffer, 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoMapBufferFlags flags); 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoResult (*UnmapBuffer)(void* buffer); 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#pragma pack(pop) 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef __cplusplus 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Intended to be called from the embedder. Returns a |MojoCore| initialized 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// to contain pointers to each of the embedder's MojoCore functions. 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochinline MojoSystemThunks MojoMakeSystemThunks() { 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoSystemThunks system_thunks = { 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch sizeof(MojoSystemThunks), 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoGetTimeTicksNow, 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoClose, 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWait, 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWaitMany, 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoCreateMessagePipe, 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWriteMessage, 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoReadMessage, 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoCreateDataPipe, 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoWriteData, 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoBeginWriteData, 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoEndWriteData, 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoReadData, 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoBeginReadData, 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoEndReadData, 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoCreateSharedBuffer, 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoDuplicateBufferHandle, 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoMapBuffer, 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MojoUnmapBuffer 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return system_thunks; 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use this type for the function found by dynamically discovering it in 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// a DSO linked with mojo_system. For example: 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSetSystemThunksFn mojo_set_system_thunks_fn = 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer( 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// "MojoSetSystemThunks")); 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The expected size of |system_thunks} is returned. 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The contents of |system_thunks| are copied. 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef size_t (*MojoSetSystemThunksFn)( 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const struct MojoSystemThunks* system_thunks); 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif // MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_ 146