diff --git a/src/node_threadsafe_cow-inl.h b/src/node_threadsafe_cow-inl.h new file mode 100644 index 00000000000000..1cd0055ed8079f --- /dev/null +++ b/src/node_threadsafe_cow-inl.h @@ -0,0 +1,54 @@ +#ifndef SRC_NODE_THREADSAFE_COW_INL_H_ +#define SRC_NODE_THREADSAFE_COW_INL_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +namespace node { + +template +T* CopyOnWrite::write() { + if (data_.use_count() > 1l) { + data_ = std::make_shared(*data_); + } + return data_.get(); +} + +template +ThreadsafeCopyOnWrite::Read::Read(const ThreadsafeCopyOnWrite* cow) + : cow_(cow), lock_(cow->impl_->mutex) {} + +template +const T& ThreadsafeCopyOnWrite::Read::operator*() const { + return cow_->impl_->data; +} + +template +const T* ThreadsafeCopyOnWrite::Read::operator->() const { + return &cow_->impl_->data; +} + +template +ThreadsafeCopyOnWrite::Write::Write(ThreadsafeCopyOnWrite* cow) + : cow_(cow), impl_(cow->impl_.write()), lock_(impl_->mutex) {} + +template +T& ThreadsafeCopyOnWrite::Write::operator*() { + return impl_->data; +} + +template +T* ThreadsafeCopyOnWrite::Write::operator->() { + return &impl_->data; +} + +template +ThreadsafeCopyOnWrite::Impl::Impl(const Impl& other) { + RwLock::ScopedReadLock lock(other.mutex); + data = other.data; +} + +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_THREADSAFE_COW_INL_H_