| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "nacl_io/socket/unixsocket_event_emitter.h" |
| 6 |
| 7 #include <stdlib.h> |
| 8 |
| 9 #include "nacl_io/fifo_char.h" |
| 10 #include "sdk_util/scoped_ref.h" |
| 11 |
| 12 namespace nacl_io { |
| 13 |
| 14 class UnixChildEventEmitter; |
| 15 class UnixMasterEventEmitter; |
| 16 |
| 17 typedef sdk_util::ScopedRef<UnixMasterEventEmitter> |
| 18 ScopedUnixMasterEventEmitter; |
| 19 |
| 20 class UnixMasterEventEmitter : public UnixEventEmitter { |
| 21 public: |
| 22 explicit UnixMasterEventEmitter(size_t size) |
| 23 : in_fifo_(size), |
| 24 out_fifo_(size), |
| 25 child_emitter_created_(false), |
| 26 child_emitter_(NULL) { |
| 27 UpdateStatus_Locked(); |
| 28 } |
| 29 |
| 30 virtual ScopedUnixEventEmitter GetPeerEmitter(); |
| 31 |
| 32 protected: |
| 33 virtual FIFOChar* in_fifoc() { return &in_fifo_; } |
| 34 virtual FIFOChar* out_fifoc() { return &out_fifo_; } |
| 35 virtual const sdk_util::SimpleLock& GetFifoLock() { return fifo_lock_; } |
| 36 |
| 37 private: |
| 38 FIFOChar in_fifo_; |
| 39 FIFOChar out_fifo_; |
| 40 sdk_util::SimpleLock fifo_lock_; |
| 41 bool child_emitter_created_; |
| 42 UnixChildEventEmitter* child_emitter_; |
| 43 |
| 44 friend class UnixChildEventEmitter; |
| 45 }; |
| 46 |
| 47 class UnixChildEventEmitter : public UnixEventEmitter { |
| 48 public: |
| 49 explicit UnixChildEventEmitter(UnixMasterEventEmitter* parent) |
| 50 : parent_emitter_(parent) { |
| 51 UpdateStatus_Locked(); |
| 52 } |
| 53 virtual ScopedUnixEventEmitter GetPeerEmitter() { return parent_emitter_; } |
| 54 |
| 55 protected: |
| 56 virtual void Destroy() { parent_emitter_->child_emitter_ = NULL; } |
| 57 |
| 58 virtual FIFOChar* in_fifoc() { return parent_emitter_->out_fifoc(); } |
| 59 virtual FIFOChar* out_fifoc() { return parent_emitter_->in_fifoc(); } |
| 60 virtual const sdk_util::SimpleLock& GetFifoLock() { |
| 61 return parent_emitter_->GetFifoLock(); |
| 62 } |
| 63 |
| 64 private: |
| 65 ScopedUnixMasterEventEmitter parent_emitter_; |
| 66 }; |
| 67 |
| 68 ScopedUnixEventEmitter UnixMasterEventEmitter::GetPeerEmitter() { |
| 69 if (!child_emitter_created_) { |
| 70 child_emitter_created_ = true; |
| 71 child_emitter_ = new UnixChildEventEmitter(this); |
| 72 } |
| 73 return sdk_util::ScopedRef<UnixChildEventEmitter>(child_emitter_); |
| 74 } |
| 75 |
| 76 uint32_t UnixEventEmitter::ReadIn_Locked(char* data, uint32_t len) { |
| 77 AUTO_LOCK(GetFifoLock()); |
| 78 uint32_t count = in_fifoc()->Read(data, len); |
| 79 ScopedUnixEventEmitter peer = GetPeerEmitter(); |
| 80 if (peer) { |
| 81 peer->UpdateStatus_Locked(); |
| 82 } |
| 83 UpdateStatus_Locked(); |
| 84 return count; |
| 85 } |
| 86 |
| 87 uint32_t UnixEventEmitter::WriteOut_Locked(const char* data, uint32_t len) { |
| 88 AUTO_LOCK(GetFifoLock()); |
| 89 uint32_t count = out_fifoc()->Write(data, len); |
| 90 ScopedUnixEventEmitter peer = GetPeerEmitter(); |
| 91 if (peer) { |
| 92 peer->UpdateStatus_Locked(); |
| 93 } |
| 94 UpdateStatus_Locked(); |
| 95 return count; |
| 96 } |
| 97 |
| 98 ScopedUnixEventEmitter UnixEventEmitter::MakeUnixEventEmitter(size_t size) { |
| 99 return ScopedUnixEventEmitter(new UnixMasterEventEmitter(size)); |
| 100 } |
| 101 |
| 102 } // namespace nacl_io |
| OLD | NEW |