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_DATA_PIPE_PRODUCER_DISPATCHER_H_
6#define MOJO_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
7
8#include "base/macros.h"
9#include "base/memory/ref_counted.h"
10#include "mojo/system/dispatcher.h"
11#include "mojo/system/system_impl_export.h"
12
13namespace mojo {
14namespace system {
15
16class DataPipe;
17
18// This is the |Dispatcher| implementation for the producer handle for data
19// pipes (created by the Mojo primitive |MojoCreateDataPipe()|). This class is
20// thread-safe.
21class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher : public Dispatcher {
22 public:
23  DataPipeProducerDispatcher();
24
25  // Must be called before any other methods.
26  void Init(scoped_refptr<DataPipe> data_pipe);
27
28  // |Dispatcher| public methods:
29  virtual Type GetType() const OVERRIDE;
30
31 private:
32  virtual ~DataPipeProducerDispatcher();
33
34  // |Dispatcher| protected methods:
35  virtual void CancelAllWaitersNoLock() OVERRIDE;
36  virtual void CloseImplNoLock() OVERRIDE;
37  virtual scoped_refptr<Dispatcher>
38      CreateEquivalentDispatcherAndCloseImplNoLock() OVERRIDE;
39  virtual MojoResult WriteDataImplNoLock(UserPointer<const void> elements,
40                                         UserPointer<uint32_t> num_bytes,
41                                         MojoWriteDataFlags flags) OVERRIDE;
42  virtual MojoResult BeginWriteDataImplNoLock(
43      UserPointer<void*> buffer,
44      UserPointer<uint32_t> buffer_num_bytes,
45      MojoWriteDataFlags flags) OVERRIDE;
46  virtual MojoResult EndWriteDataImplNoLock(
47      uint32_t num_bytes_written) OVERRIDE;
48  virtual HandleSignalsState GetHandleSignalsStateImplNoLock() const OVERRIDE;
49  virtual MojoResult AddWaiterImplNoLock(
50      Waiter* waiter,
51      MojoHandleSignals signals,
52      uint32_t context,
53      HandleSignalsState* signals_state) OVERRIDE;
54  virtual void RemoveWaiterImplNoLock(
55      Waiter* waiter,
56      HandleSignalsState* signals_state) OVERRIDE;
57  virtual bool IsBusyNoLock() const OVERRIDE;
58
59  // Protected by |lock()|:
60  scoped_refptr<DataPipe> data_pipe_;  // This will be null if closed.
61
62  DISALLOW_COPY_AND_ASSIGN(DataPipeProducerDispatcher);
63};
64
65}  // namespace system
66}  // namespace mojo
67
68#endif  // MOJO_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
69