Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
|
binji
2015/09/17 01:03:57
Fix year
remove (c)
avallee
2015/09/17 19:00:31
Done.
| |
| 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/unix_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 UnixMasterEventEmitter(size_t size) | |
|
binji
2015/09/17 01:03:57
explicit
avallee
2015/09/17 19:00:31
Done.
| |
| 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 UnixChildEventEmitter(UnixMasterEventEmitter* parent) | |
|
binji
2015/09/17 01:03:58
explicit
avallee
2015/09/17 19:00:31
Done.
| |
| 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 UpdateStatus_Locked(); | |
| 80 ScopedUnixEventEmitter peer = GetPeerEmitter(); | |
| 81 if (peer) { | |
|
binji
2015/09/17 01:03:57
when would this be NULL?
avallee
2015/09/17 16:18:01
It could be NULL if we never create a child emitte
| |
| 82 peer->UpdateStatus_Locked(); | |
| 83 } | |
| 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) { | |
|
binji
2015/09/17 01:03:58
It looks like the order of updating status of this
avallee
2015/09/17 16:18:00
I don't *think* the order matters. However my init
| |
| 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 |