1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef MOJO_SYSTEM_RAW_SHARED_BUFFER_H_ 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MOJO_SYSTEM_RAW_SHARED_BUFFER_H_ 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <stddef.h> 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/macros.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/ref_counted.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/embedder/scoped_platform_handle.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/system/system_impl_export.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace mojo { 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace system { 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass RawSharedBufferMapping; 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// |RawSharedBuffer| is a thread-safe, ref-counted wrapper around OS-specific 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// shared memory. It has the following features: 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// - A |RawSharedBuffer| simply represents a piece of shared memory that *may* 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// be mapped and *may* be shared to another process. 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// - A single |RawSharedBuffer| may be mapped multiple times. The lifetime of 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// the mapping (owned by |RawSharedBufferMapping|) is separate from the 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// lifetime of the |RawSharedBuffer|. 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// - Sizes/offsets (of the shared memory and mappings) are arbitrary, and not 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// restricted by page size. However, more memory may actually be mapped than 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// requested. 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// It currently does NOT support the following: 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// - Sharing read-only. (This will probably eventually be supported.) 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(vtl): Rectify this with |base::SharedMemory|. 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MOJO_SYSTEM_IMPL_EXPORT RawSharedBuffer 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : public base::RefCountedThreadSafe<RawSharedBuffer> { 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Creates a shared buffer of size |num_bytes| bytes (initially zero-filled). 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |num_bytes| must be nonzero. Returns null on failure. 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static RawSharedBuffer* Create(size_t num_bytes); 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static RawSharedBuffer* CreateFromPlatformHandle( 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t num_bytes, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder::ScopedPlatformHandle platform_handle); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Maps (some) of the shared buffer into memory; [|offset|, |offset + length|] 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // must be contained in [0, |num_bytes|], and |length| must be at least 1. 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns null on failure. 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_ptr<RawSharedBufferMapping> Map(size_t offset, size_t length); 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Checks if |offset| and |length| are valid arguments. 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool IsValidMap(size_t offset, size_t length); 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Like |Map()|, but doesn't check its arguments (which should have been 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // preflighted using |IsValidMap()|). 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_ptr<RawSharedBufferMapping> MapNoCheck(size_t offset, size_t length); 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Duplicates the underlying platform handle and passes it to the caller. 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder::ScopedPlatformHandle DuplicatePlatformHandle(); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Passes the underlying platform handle to the caller. This should only be 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // called if there's a unique reference to this object (owned by the caller). 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // After calling this, this object should no longer be used, but should only 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // be disposed of. 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder::ScopedPlatformHandle PassPlatformHandle(); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t num_bytes() const { return num_bytes_; } 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch friend class base::RefCountedThreadSafe<RawSharedBuffer>; 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch explicit RawSharedBuffer(size_t num_bytes); 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ~RawSharedBuffer(); 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Implemented in raw_shared_buffer_{posix,win}.cc: 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This is called by |Create()| before this object is given to anyone. 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool Init(); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This is like |Init()|, but for |CreateFromPlatformHandle()|. (Note: It 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should verify that |platform_handle| is an appropriate handle for the 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // claimed |num_bytes_|.) 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool InitFromPlatformHandle(embedder::ScopedPlatformHandle platform_handle); 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The platform-dependent part of |Map()|; doesn't check arguments. 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<RawSharedBufferMapping> MapImpl(size_t offset, size_t length); 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const size_t num_bytes_; 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This is set in |Init()|/|InitFromPlatformHandle()| and never modified 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // (except by |PassPlatformHandle()|; see the comments above its declaration), 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // hence does not need to be protected by a lock. 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch embedder::ScopedPlatformHandle handle_; 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(RawSharedBuffer); 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// A mapping of a |RawSharedBuffer| (compararable to a "file view" in Windows); 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// see above. Created by |RawSharedBuffer::Map()|. Automatically unmaps memory 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// on destruction. 102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// 103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Mappings are NOT thread-safe. 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// 105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Note: This is an entirely separate class (instead of 106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// |RawSharedBuffer::Mapping|) so that it can be forward-declared. 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass MOJO_SYSTEM_IMPL_EXPORT RawSharedBufferMapping { 108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ~RawSharedBufferMapping() { Unmap(); } 110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void* base() const { return base_; } 112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch size_t length() const { return length_; } 113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch friend class RawSharedBuffer; 116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RawSharedBufferMapping(void* base, 118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch size_t length, 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void* real_base, 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch size_t real_length) 121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : base_(base), length_(length), 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch real_base_(real_base), real_length_(real_length) {} 123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void Unmap(); 124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void* const base_; 126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const size_t length_; 127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void* const real_base_; 129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const size_t real_length_; 130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DISALLOW_COPY_AND_ASSIGN(RawSharedBufferMapping); 132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace system 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace mojo 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // MOJO_SYSTEM_RAW_SHARED_BUFFER_H_ 138