1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MOJO_SYSTEM_LOCAL_DATA_PIPE_H_ 6 #define MOJO_SYSTEM_LOCAL_DATA_PIPE_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/aligned_memory.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "mojo/system/data_pipe.h" 13 #include "mojo/system/system_impl_export.h" 14 15 namespace mojo { 16 namespace system { 17 18 // |LocalDataPipe| is a subclass that "implements" |DataPipe| for data pipes 19 // whose producer and consumer are both local. This class is thread-safe (with 20 // protection provided by |DataPipe|'s |lock_|. 21 class MOJO_SYSTEM_IMPL_EXPORT LocalDataPipe : public DataPipe { 22 public: 23 LocalDataPipe(); 24 25 MojoResult Init(const MojoCreateDataPipeOptions* options); 26 27 private: 28 friend class base::RefCountedThreadSafe<LocalDataPipe>; 29 virtual ~LocalDataPipe(); 30 31 // |DataPipe| implementation: 32 virtual void ProducerCloseImplNoLock() OVERRIDE; 33 virtual MojoResult ProducerBeginWriteDataImplNoLock( 34 void** buffer, 35 uint32_t* buffer_num_elements, 36 MojoWriteDataFlags flags) OVERRIDE; 37 virtual MojoResult ProducerEndWriteDataImplNoLock( 38 uint32_t num_elements_written) OVERRIDE; 39 virtual MojoWaitFlags ProducerSatisfiedFlagsNoLock() OVERRIDE; 40 virtual MojoWaitFlags ProducerSatisfiableFlagsNoLock() OVERRIDE; 41 virtual void ConsumerCloseImplNoLock() OVERRIDE; 42 virtual MojoResult ConsumerDiscardDataNoLock(uint32_t* num_elements, 43 bool all_or_none) OVERRIDE; 44 virtual MojoResult ConsumerQueryDataNoLock(uint32_t* num_elements) OVERRIDE; 45 virtual MojoResult ConsumerBeginReadDataImplNoLock( 46 const void** buffer, 47 uint32_t* buffer_num_elements, 48 MojoReadDataFlags flags) OVERRIDE; 49 virtual MojoResult ConsumerEndReadDataImplNoLock( 50 uint32_t num_elements_read) OVERRIDE; 51 virtual MojoWaitFlags ConsumerSatisfiedFlagsNoLock() OVERRIDE; 52 virtual MojoWaitFlags ConsumerSatisfiableFlagsNoLock() OVERRIDE; 53 54 void EnsureBufferNoLock(); 55 56 // Get the maximum (single) write/read size right now (in number of elements); 57 // result fits in a |uint32_t|. 58 size_t GetMaxElementsToWriteNoLock(); 59 size_t GetMaxElementsToReadNoLock(); 60 61 // The members below are protected by |DataPipe|'s |lock_|: 62 bool producer_open_; 63 bool consumer_open_; 64 65 scoped_ptr_malloc<char, base::ScopedPtrAlignedFree> buffer_; 66 // Circular buffer. 67 size_t buffer_first_element_index_; 68 size_t buffer_current_num_elements_; 69 70 uint32_t two_phase_max_elements_written_; 71 uint32_t two_phase_max_elements_read_; 72 73 DISALLOW_COPY_AND_ASSIGN(LocalDataPipe); 74 }; 75 76 } // namespace system 77 } // namespace mojo 78 79 #endif // MOJO_SYSTEM_LOCAL_DATA_PIPE_H_ 80