Chromium Code Reviews| Index: native_client_sdk/src/libraries/nacl_io/socket/unix_event_emitter.cc |
| diff --git a/native_client_sdk/src/libraries/nacl_io/socket/unix_event_emitter.cc b/native_client_sdk/src/libraries/nacl_io/socket/unix_event_emitter.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..14f03162b27899011ea706c6d7d3be4a48945c3c |
| --- /dev/null |
| +++ b/native_client_sdk/src/libraries/nacl_io/socket/unix_event_emitter.cc |
| @@ -0,0 +1,102 @@ |
| +// 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.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "nacl_io/socket/unix_event_emitter.h" |
| + |
| +#include <stdlib.h> |
| + |
| +#include "nacl_io/fifo_char.h" |
| +#include "sdk_util/scoped_ref.h" |
| + |
| +namespace nacl_io { |
| + |
| +class UnixChildEventEmitter; |
| +class UnixMasterEventEmitter; |
| + |
| +typedef sdk_util::ScopedRef<UnixMasterEventEmitter> |
| + ScopedUnixMasterEventEmitter; |
| + |
| +class UnixMasterEventEmitter : public UnixEventEmitter { |
| + public: |
| + UnixMasterEventEmitter(size_t size) |
|
binji
2015/09/17 01:03:57
explicit
avallee
2015/09/17 19:00:31
Done.
|
| + : in_fifo_(size), |
| + out_fifo_(size), |
| + child_emitter_created_(false), |
| + child_emitter_(NULL) { |
| + UpdateStatus_Locked(); |
| + } |
| + |
| + virtual ScopedUnixEventEmitter GetPeerEmitter(); |
| + |
| + protected: |
| + virtual FIFOChar* in_fifoc() { return &in_fifo_; } |
| + virtual FIFOChar* out_fifoc() { return &out_fifo_; } |
| + virtual const sdk_util::SimpleLock& GetFifoLock() { return fifo_lock_; } |
| + |
| + private: |
| + FIFOChar in_fifo_; |
| + FIFOChar out_fifo_; |
| + sdk_util::SimpleLock fifo_lock_; |
| + bool child_emitter_created_; |
| + UnixChildEventEmitter* child_emitter_; |
| + |
| + friend class UnixChildEventEmitter; |
| +}; |
| + |
| +class UnixChildEventEmitter : public UnixEventEmitter { |
| + public: |
| + UnixChildEventEmitter(UnixMasterEventEmitter* parent) |
|
binji
2015/09/17 01:03:58
explicit
avallee
2015/09/17 19:00:31
Done.
|
| + : parent_emitter_(parent) { |
| + UpdateStatus_Locked(); |
| + } |
| + virtual ScopedUnixEventEmitter GetPeerEmitter() { return parent_emitter_; } |
| + |
| + protected: |
| + virtual void Destroy() { parent_emitter_->child_emitter_ = NULL; } |
| + |
| + virtual FIFOChar* in_fifoc() { return parent_emitter_->out_fifoc(); } |
| + virtual FIFOChar* out_fifoc() { return parent_emitter_->in_fifoc(); } |
| + virtual const sdk_util::SimpleLock& GetFifoLock() { |
| + return parent_emitter_->GetFifoLock(); |
| + } |
| + |
| + private: |
| + ScopedUnixMasterEventEmitter parent_emitter_; |
| +}; |
| + |
| +ScopedUnixEventEmitter UnixMasterEventEmitter::GetPeerEmitter() { |
| + if (!child_emitter_created_) { |
| + child_emitter_created_ = true; |
| + child_emitter_ = new UnixChildEventEmitter(this); |
| + } |
| + return sdk_util::ScopedRef<UnixChildEventEmitter>(child_emitter_); |
| +} |
| + |
| +uint32_t UnixEventEmitter::ReadIn_Locked(char* data, uint32_t len) { |
| + AUTO_LOCK(GetFifoLock()); |
| + uint32_t count = in_fifoc()->Read(data, len); |
| + UpdateStatus_Locked(); |
| + ScopedUnixEventEmitter peer = GetPeerEmitter(); |
| + 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
|
| + peer->UpdateStatus_Locked(); |
| + } |
| + return count; |
| +} |
| + |
| +uint32_t UnixEventEmitter::WriteOut_Locked(const char* data, uint32_t len) { |
| + AUTO_LOCK(GetFifoLock()); |
| + uint32_t count = out_fifoc()->Write(data, len); |
| + ScopedUnixEventEmitter peer = GetPeerEmitter(); |
| + 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
|
| + peer->UpdateStatus_Locked(); |
| + } |
| + UpdateStatus_Locked(); |
| + return count; |
| +} |
| + |
| +ScopedUnixEventEmitter UnixEventEmitter::MakeUnixEventEmitter(size_t size) { |
| + return ScopedUnixEventEmitter(new UnixMasterEventEmitter(size)); |
| +} |
| + |
| +} // namespace nacl_io |