• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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_SHARED_BUFFER_DISPATCHER_H_
6 #define MOJO_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
7 
8 #include "base/macros.h"
9 #include "mojo/embedder/platform_shared_buffer.h"
10 #include "mojo/system/memory.h"
11 #include "mojo/system/simple_dispatcher.h"
12 #include "mojo/system/system_impl_export.h"
13 
14 namespace mojo {
15 
16 namespace embedder {
17 class PlatformSupport;
18 }
19 
20 namespace system {
21 
22 // TODO(vtl): We derive from SimpleDispatcher, even though we don't currently
23 // have anything that's waitable. I want to add a "transferrable" wait flag
24 // (which would entail overriding |GetHandleSignalsStateImplNoLock()|, etc.).
25 class MOJO_SYSTEM_IMPL_EXPORT SharedBufferDispatcher : public SimpleDispatcher {
26  public:
27   // The default options to use for |MojoCreateSharedBuffer()|. (Real uses
28   // should obtain this via |ValidateCreateOptions()| with a null |in_options|;
29   // this is exposed directly for testing convenience.)
30   static const MojoCreateSharedBufferOptions kDefaultCreateOptions;
31 
32   // Validates and/or sets default options for |MojoCreateSharedBufferOptions|.
33   // If non-null, |in_options| must point to a struct of at least
34   // |in_options->struct_size| bytes. |out_options| must point to a (current)
35   // |MojoCreateSharedBufferOptions| and will be entirely overwritten on success
36   // (it may be partly overwritten on failure).
37   static MojoResult ValidateCreateOptions(
38       UserPointer<const MojoCreateSharedBufferOptions> in_options,
39       MojoCreateSharedBufferOptions* out_options);
40 
41   // Static factory method: |validated_options| must be validated (obviously).
42   // On failure, |*result| will be left as-is.
43   static MojoResult Create(
44       embedder::PlatformSupport* platform_support,
45       const MojoCreateSharedBufferOptions& validated_options,
46       uint64_t num_bytes,
47       scoped_refptr<SharedBufferDispatcher>* result);
48 
49   // |Dispatcher| public methods:
50   virtual Type GetType() const OVERRIDE;
51 
52   // The "opposite" of |SerializeAndClose()|. (Typically this is called by
53   // |Dispatcher::Deserialize()|.)
54   static scoped_refptr<SharedBufferDispatcher> Deserialize(
55       Channel* channel,
56       const void* source,
57       size_t size,
58       embedder::PlatformHandleVector* platform_handles);
59 
60  private:
61   explicit SharedBufferDispatcher(
62       scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer_);
63   virtual ~SharedBufferDispatcher();
64 
65   // Validates and/or sets default options for
66   // |MojoDuplicateBufferHandleOptions|. If non-null, |in_options| must point to
67   // a struct of at least |in_options->struct_size| bytes. |out_options| must
68   // point to a (current) |MojoDuplicateBufferHandleOptions| and will be
69   // entirely overwritten on success (it may be partly overwritten on failure).
70   static MojoResult ValidateDuplicateOptions(
71       UserPointer<const MojoDuplicateBufferHandleOptions> in_options,
72       MojoDuplicateBufferHandleOptions* out_options);
73 
74   // |Dispatcher| protected methods:
75   virtual void CloseImplNoLock() OVERRIDE;
76   virtual scoped_refptr<Dispatcher>
77       CreateEquivalentDispatcherAndCloseImplNoLock() OVERRIDE;
78   virtual MojoResult DuplicateBufferHandleImplNoLock(
79       UserPointer<const MojoDuplicateBufferHandleOptions> options,
80       scoped_refptr<Dispatcher>* new_dispatcher) OVERRIDE;
81   virtual MojoResult MapBufferImplNoLock(
82       uint64_t offset,
83       uint64_t num_bytes,
84       MojoMapBufferFlags flags,
85       scoped_ptr<embedder::PlatformSharedBufferMapping>* mapping) OVERRIDE;
86   virtual void StartSerializeImplNoLock(Channel* channel,
87                                         size_t* max_size,
88                                         size_t* max_platform_handles) OVERRIDE;
89   virtual bool EndSerializeAndCloseImplNoLock(
90       Channel* channel,
91       void* destination,
92       size_t* actual_size,
93       embedder::PlatformHandleVector* platform_handles) OVERRIDE;
94 
95   scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer_;
96 
97   DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcher);
98 };
99 
100 }  // namespace system
101 }  // namespace mojo
102 
103 #endif  // MOJO_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
104