| 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_fifo() { return in_fifo_; } |
| 34 virtual FIFOChar* out_fifoc() { return &out_fifo_; } | 45 virtual FIFOInterface* out_fifo() { 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_fifo() { return parent_emitter_->out_fifo(); } |
| 59 virtual FIFOChar* out_fifoc() { return parent_emitter_->in_fifoc(); } | 70 virtual FIFOInterface* out_fifo() { return parent_emitter_->in_fifo(); } |
| 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_) { |
| 70 child_emitter_created_ = true; | 81 child_emitter_created_ = true; |
| 71 child_emitter_ = new UnixChildEventEmitter(this); | 82 child_emitter_ = new UnixChildEventEmitter(this); |
| 72 } | 83 } |
| 73 return sdk_util::ScopedRef<UnixChildEventEmitter>(child_emitter_); | 84 return sdk_util::ScopedRef<UnixChildEventEmitter>(child_emitter_); |
| 74 } | 85 } |
| 75 | 86 |
| 76 uint32_t UnixEventEmitter::ReadIn_Locked(char* data, uint32_t len) { | 87 uint32_t UnixEventEmitter::ReadIn_Locked(char* data, uint32_t len) { |
| 77 AUTO_LOCK(GetFifoLock()); | 88 AUTO_LOCK(GetFifoLock()); |
| 78 uint32_t count = in_fifoc()->Read(data, len); | 89 uint32_t count = in_fifo()->Read(data, len); |
| 79 ScopedUnixEventEmitter peer = GetPeerEmitter(); | 90 ScopedUnixEventEmitter peer = GetPeerEmitter(); |
| 80 if (peer) { | 91 if (peer) { |
| 81 peer->UpdateStatus_Locked(); | 92 peer->UpdateStatus_Locked(); |
| 82 } | 93 } |
| 83 UpdateStatus_Locked(); | 94 UpdateStatus_Locked(); |
| 84 return count; | 95 return count; |
| 85 } | 96 } |
| 86 | 97 |
| 87 uint32_t UnixEventEmitter::WriteOut_Locked(const char* data, uint32_t len) { | 98 uint32_t UnixEventEmitter::WriteOut_Locked(const char* data, uint32_t len) { |
| 88 AUTO_LOCK(GetFifoLock()); | 99 AUTO_LOCK(GetFifoLock()); |
| 89 uint32_t count = out_fifoc()->Write(data, len); | 100 uint32_t count = out_fifo()->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 |