OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "nacl_io/socket/unix_event_emitter.h" | 5 #include "nacl_io/socket/unix_event_emitter.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <sys/socket.h> |
8 | 9 |
9 #include "nacl_io/fifo_char.h" | 10 #include "nacl_io/fifo_char.h" |
| 11 #include "nacl_io/socket/fifo_packet.h" |
10 #include "sdk_util/scoped_ref.h" | 12 #include "sdk_util/scoped_ref.h" |
11 | 13 |
12 namespace nacl_io { | 14 namespace nacl_io { |
13 | 15 |
14 class UnixChildEventEmitter; | 16 class UnixChildEventEmitter; |
15 class UnixMasterEventEmitter; | 17 class UnixMasterEventEmitter; |
16 | 18 |
17 typedef sdk_util::ScopedRef<UnixMasterEventEmitter> | 19 typedef sdk_util::ScopedRef<UnixMasterEventEmitter> |
18 ScopedUnixMasterEventEmitter; | 20 ScopedUnixMasterEventEmitter; |
19 | 21 |
20 class UnixMasterEventEmitter : public UnixEventEmitter { | 22 class UnixMasterEventEmitter : public UnixEventEmitter { |
21 public: | 23 public: |
22 explicit UnixMasterEventEmitter(size_t size) | 24 explicit UnixMasterEventEmitter(size_t size, int type) |
23 : in_fifo_(size), | 25 : child_emitter_created_(false), child_emitter_(NULL) { |
24 out_fifo_(size), | 26 if (type == SOCK_STREAM) { |
25 child_emitter_created_(false), | 27 in_fifo_ = new FIFOChar(size); |
26 child_emitter_(NULL) { | 28 out_fifo_ = new FIFOChar(size); |
| 29 } else { |
| 30 in_fifo_ = new FIFOPacket(size); |
| 31 out_fifo_ = new FIFOPacket(size); |
| 32 } |
27 UpdateStatus_Locked(); | 33 UpdateStatus_Locked(); |
28 } | 34 } |
29 | 35 |
| 36 ~UnixMasterEventEmitter() { |
| 37 delete in_fifo_; |
| 38 delete out_fifo_; |
| 39 } |
| 40 |
30 virtual ScopedUnixEventEmitter GetPeerEmitter(); | 41 virtual ScopedUnixEventEmitter GetPeerEmitter(); |
31 | 42 |
32 protected: | 43 protected: |
33 virtual FIFOChar* in_fifoc() { return &in_fifo_; } | 44 virtual FIFOInterface* in_fifoc() { return in_fifo_; } |
34 virtual FIFOChar* out_fifoc() { return &out_fifo_; } | 45 virtual FIFOInterface* out_fifoc() { return out_fifo_; } |
35 virtual const sdk_util::SimpleLock& GetFifoLock() { return fifo_lock_; } | 46 virtual const sdk_util::SimpleLock& GetFifoLock() { return fifo_lock_; } |
36 | 47 |
37 private: | 48 private: |
38 FIFOChar in_fifo_; | 49 FIFOInterface* in_fifo_; |
39 FIFOChar out_fifo_; | 50 FIFOInterface* out_fifo_; |
40 sdk_util::SimpleLock fifo_lock_; | 51 sdk_util::SimpleLock fifo_lock_; |
41 bool child_emitter_created_; | 52 bool child_emitter_created_; |
42 UnixChildEventEmitter* child_emitter_; | 53 UnixChildEventEmitter* child_emitter_; |
43 | 54 |
44 friend class UnixChildEventEmitter; | 55 friend class UnixChildEventEmitter; |
45 }; | 56 }; |
46 | 57 |
47 class UnixChildEventEmitter : public UnixEventEmitter { | 58 class UnixChildEventEmitter : public UnixEventEmitter { |
48 public: | 59 public: |
49 explicit UnixChildEventEmitter(UnixMasterEventEmitter* parent) | 60 explicit UnixChildEventEmitter(UnixMasterEventEmitter* parent) |
50 : parent_emitter_(parent) { | 61 : parent_emitter_(parent) { |
51 UpdateStatus_Locked(); | 62 UpdateStatus_Locked(); |
52 } | 63 } |
53 virtual ScopedUnixEventEmitter GetPeerEmitter() { return parent_emitter_; } | 64 virtual ScopedUnixEventEmitter GetPeerEmitter() { return parent_emitter_; } |
54 | 65 |
55 protected: | 66 protected: |
56 virtual void Destroy() { parent_emitter_->child_emitter_ = NULL; } | 67 virtual void Destroy() { parent_emitter_->child_emitter_ = NULL; } |
57 | 68 |
58 virtual FIFOChar* in_fifoc() { return parent_emitter_->out_fifoc(); } | 69 virtual FIFOInterface* in_fifoc() { return parent_emitter_->out_fifoc(); } |
59 virtual FIFOChar* out_fifoc() { return parent_emitter_->in_fifoc(); } | 70 virtual FIFOInterface* out_fifoc() { return parent_emitter_->in_fifoc(); } |
60 virtual const sdk_util::SimpleLock& GetFifoLock() { | 71 virtual const sdk_util::SimpleLock& GetFifoLock() { |
61 return parent_emitter_->GetFifoLock(); | 72 return parent_emitter_->GetFifoLock(); |
62 } | 73 } |
63 | 74 |
64 private: | 75 private: |
65 ScopedUnixMasterEventEmitter parent_emitter_; | 76 ScopedUnixMasterEventEmitter parent_emitter_; |
66 }; | 77 }; |
67 | 78 |
68 ScopedUnixEventEmitter UnixMasterEventEmitter::GetPeerEmitter() { | 79 ScopedUnixEventEmitter UnixMasterEventEmitter::GetPeerEmitter() { |
69 if (!child_emitter_created_) { | 80 if (!child_emitter_created_) { |
(...skipping 18 matching lines...) Expand all Loading... |
88 AUTO_LOCK(GetFifoLock()); | 99 AUTO_LOCK(GetFifoLock()); |
89 uint32_t count = out_fifoc()->Write(data, len); | 100 uint32_t count = out_fifoc()->Write(data, len); |
90 ScopedUnixEventEmitter peer = GetPeerEmitter(); | 101 ScopedUnixEventEmitter peer = GetPeerEmitter(); |
91 if (peer) { | 102 if (peer) { |
92 peer->UpdateStatus_Locked(); | 103 peer->UpdateStatus_Locked(); |
93 } | 104 } |
94 UpdateStatus_Locked(); | 105 UpdateStatus_Locked(); |
95 return count; | 106 return count; |
96 } | 107 } |
97 | 108 |
98 ScopedUnixEventEmitter UnixEventEmitter::MakeUnixEventEmitter(size_t size) { | 109 ScopedUnixEventEmitter UnixEventEmitter::MakeUnixEventEmitter(size_t size, |
99 return ScopedUnixEventEmitter(new UnixMasterEventEmitter(size)); | 110 int type) { |
| 111 return ScopedUnixEventEmitter(new UnixMasterEventEmitter(size, type)); |
100 } | 112 } |
101 | 113 |
102 } // namespace nacl_io | 114 } // namespace nacl_io |
OLD | NEW |