diff options
author | timvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-11 08:00:57 +0000 |
---|---|---|
committer | timvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-11 08:00:57 +0000 |
commit | 876526aa519026f4328af16f2fb3a778bcb0fb16 (patch) | |
tree | 09176ae22e1f23c4e2790360cdfe47b3081f6198 /content/renderer/shared_memory_seqlock_reader.h | |
parent | ede840c16352588eb01cd75761d614b20cfe92fc (diff) | |
download | chromium_src-876526aa519026f4328af16f2fb3a778bcb0fb16.zip chromium_src-876526aa519026f4328af16f2fb3a778bcb0fb16.tar.gz chromium_src-876526aa519026f4328af16f2fb3a778bcb0fb16.tar.bz2 |
Implement the content/renderer and content/browser part of the Device Motion API.
This patch has a partial implementation of provider and does not include any device motion fetchers.
The patch features:
- chromium-side event pump
- shared memory reader and buffer representation
- IPC messages and filters for shared memory communication
- service class to keep track of listening renderers
BUG=135804
Review URL: https://chromiumcodereview.appspot.com/14678012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211043 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/shared_memory_seqlock_reader.h')
-rw-r--r-- | content/renderer/shared_memory_seqlock_reader.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/content/renderer/shared_memory_seqlock_reader.h b/content/renderer/shared_memory_seqlock_reader.h new file mode 100644 index 0000000..d355d9f --- /dev/null +++ b/content/renderer/shared_memory_seqlock_reader.h @@ -0,0 +1,71 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_SHARED_MEMORY_SEQLOCK_READER_H_ +#define CONTENT_RENDERER_SHARED_MEMORY_SEQLOCK_READER_H_ + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/shared_memory.h" +#include "content/common/shared_memory_seqlock_buffer.h" + +namespace internal { + +class SharedMemorySeqLockReaderBase { + protected: + SharedMemorySeqLockReaderBase(); + virtual ~SharedMemorySeqLockReaderBase(); + + void* InitializeSharedMemory( + base::SharedMemoryHandle shared_memory_handle, + size_t buffer_size); + + bool FetchFromBuffer(content::OneWriterSeqLock* seqlock, void* final, + void* temp, void* from, size_t size); + + static const int kMaximumContentionCount = 10; + base::SharedMemoryHandle renderer_shared_memory_handle_; + scoped_ptr<base::SharedMemory> renderer_shared_memory_; +}; + +} // namespace internal + +namespace content { + +// Template argument Data should be a pod-like structure only containing +// data fields, such that it is copyable by memcpy method. +template<typename Data> +class SharedMemorySeqLockReader + : private internal::SharedMemorySeqLockReaderBase { + public: + SharedMemorySeqLockReader() : buffer_(0) { } + virtual ~SharedMemorySeqLockReader() { } + + bool GetLatestData(Data* data) { + DCHECK(buffer_); + DCHECK(sizeof(*data) == sizeof(*temp_buffer_)); + return FetchFromBuffer(&buffer_->seqlock, data, temp_buffer_.get(), + &buffer_->data, sizeof(*temp_buffer_)); + } + + bool Initialize(base::SharedMemoryHandle shared_memory_handle) { + if (void* memory = InitializeSharedMemory( + shared_memory_handle, sizeof(SharedMemorySeqLockBuffer<Data>))) { + buffer_ = static_cast<SharedMemorySeqLockBuffer<Data>*>(memory); + temp_buffer_.reset(new Data); + return true; + } + return false; + } + + private: + SharedMemorySeqLockBuffer<Data>* buffer_; + scoped_ptr<Data> temp_buffer_; + + DISALLOW_COPY_AND_ASSIGN(SharedMemorySeqLockReader); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_SHARED_MEMORY_SEQLOCK_READER_H_ |