Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(484)

Side by Side Diff: content/common/gamepad_hardware_buffer.h

Issue 8689011: Renderer reading side of gamepad (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: move seqlock to gamepad-specific, improve description Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_ 5 #ifndef CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_
6 #define CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_ 6 #define CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_
7 7
8 #include "base/atomicops.h" 8 #include "content/common/gamepad_seqlock.h"
9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebGamepads.h" 9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebGamepads.h"
10 10
11 namespace gamepad { 11 namespace gamepad {
12 12
13 /* 13 /*
14 14
15 This structure is stored in shared memory that's shared between the browser 15 This structure is stored in shared memory that's shared between the browser
16 which does the hardware polling, and the various consumers of the gamepad 16 which does the hardware polling, and the various consumers of the gamepad
17 state (renderers and NaCl plugins). The performance characteristics are that 17 state (renderers and NaCl plugins). The performance characteristics are that
18 we want low latency (so would like to avoid explicit communication via IPC 18 we want low latency (so would like to avoid explicit communication via IPC
19 between producer and consumer) and relatively large data size. 19 between producer and consumer) and relatively large data size.
20 20
21 Writer and reader operate on the same buffer assuming contention is low, and 21 Writer and reader operate on the same buffer assuming contention is low, and
22 start_marker and end_marker are used to detect inconsistent reads. 22 contention is detected by using the associated SeqLock.
23
24 The writer atomically increments the start_marker counter before starting,
25 then fills in the gamepad data, then increments end_marker to the same value
26 as start_marker. The readers first reads end_marker, then the the data and
27 then start_marker, and if the reader finds that the start and end markers were
28 different, then it must retry as the buffer was updated while being read.
29
30 There is a requirement for memory barriers between the accesses to the markers
31 and the main data to ensure that both the reader and write see a consistent
32 view of those values. In the current implementation, the writer uses an
33 Barrier_AtomicIncrement for the counter, and the reader uses an Acquire_Load.
34 23
35 */ 24 */
36 25
37 struct GamepadHardwareBuffer { 26 struct GamepadHardwareBuffer {
38 base::subtle::Atomic32 start_marker; 27 GamepadSeqLock sequence;
39 WebKit::WebGamepads buffer; 28 WebKit::WebGamepads buffer;
40 base::subtle::Atomic32 end_marker;
41 }; 29 };
42 30
43 } 31 }
44 32
45 #endif // CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_ 33 #endif // CONTENT_COMMON_GAMEPAD_HARDWARE_BUFFER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698