OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 #include "media/audio/shared_mem_synchronizer.h" | |
scherkus (not reviewing)
2012/03/08 02:37:08
blank line above
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
5 | |
6 #if defined(OS_POSIX) | |
7 #include <errno.h> | |
8 #include <sys/poll.h> | |
9 #endif | |
10 | |
11 #include "base/logging.h" | |
12 #include "base/memory/scoped_ptr.h" | |
13 | |
14 #if defined(OS_POSIX) | |
15 #include "base/file_descriptor_posix.h" | |
16 #endif | |
17 | |
18 SharedMemSynchronizer::WaitForMultiple::WaitForMultiple( | |
19 SharedMemSynchronizer* synchronizers, size_t count) | |
20 : synchronizers_(synchronizers), count_(count), last_(count - 1) { | |
21 DCHECK_GT(count, 0U); | |
22 } | |
23 | |
24 int SharedMemSynchronizer::WaitForMultiple::Wait() { | |
25 int ret = WaitMultiple(synchronizers_, count_, last_); | |
26 last_ = (ret >= 0) ? static_cast<size_t>(ret) : count_ - 1; | |
27 return ret; | |
28 } | |
29 | |
30 SharedMemSynchronizer::SharedMemSynchronizer() { | |
scherkus (not reviewing)
2012/03/08 02:37:08
nit: typically collapse these one-liners {}
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
31 } | |
32 | |
33 #if defined(OS_POSIX) | |
34 | |
35 SharedMemSynchronizer::~SharedMemSynchronizer() { | |
scherkus (not reviewing)
2012/03/08 02:37:08
nit: typically collapse these one-liners {}
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
36 } | |
37 | |
38 SharedMemSynchronizer::SharedMemSynchronizer(IPCHandle handle_1, | |
39 IPCHandle handle_2) | |
40 : socket_(handle_1.fd) { | |
41 DCHECK_NE(handle_1.fd, -1); | |
42 DCHECK_EQ(handle_2.fd, -1); | |
43 DCHECK(IsValid()); | |
44 } | |
45 | |
46 void SharedMemSynchronizer::Signal() { | |
47 DCHECK(IsValid()); | |
48 char signal = 1; | |
49 size_t bytes = socket_.Send(&signal, sizeof(signal)); | |
50 DCHECK_EQ(bytes, 1U) << "errno: " << errno; | |
51 } | |
52 | |
53 void SharedMemSynchronizer::Wait() { | |
54 DCHECK(IsValid()); | |
55 char signal = 0; | |
56 size_t bytes = socket_.Receive(&signal, sizeof(signal)); | |
57 DCHECK_EQ(bytes, 1U) << "errno: " << errno; | |
58 DCHECK_EQ(signal, 1); | |
59 } | |
60 | |
61 bool SharedMemSynchronizer::IsValid() const { | |
62 return socket_.handle() != SocketClass::kInvalidHandle; | |
63 } | |
64 | |
65 bool SharedMemSynchronizer::ShareToProcess(base::ProcessHandle process, | |
66 IPCHandle* handle_1, | |
67 IPCHandle* handle_2) { | |
68 DCHECK(IsValid()); | |
69 handle_1->fd = socket_.handle(); | |
70 handle_1->auto_close = false; | |
71 handle_2->fd = -1; | |
72 return true; | |
73 } | |
74 | |
75 // static | |
76 bool SharedMemSynchronizer::Create(SharedMemSynchronizer* a, | |
77 SharedMemSynchronizer* b) { | |
78 DCHECK(!a->IsValid()); | |
79 DCHECK(!b->IsValid()); | |
80 | |
81 bool ok = SocketClass::CreatePair(&a->socket_, &b->socket_); | |
82 | |
83 DLOG_IF(WARNING, !ok) << "failed to create socket: " << errno; | |
84 DCHECK(!ok || a->IsValid()); | |
85 DCHECK(!ok || b->IsValid()); | |
86 return ok; | |
87 } | |
88 | |
89 // static | |
90 int SharedMemSynchronizer::WaitMultiple(SharedMemSynchronizer* synchronizers, | |
91 size_t count, | |
92 size_t last_signaled) { | |
93 DCHECK(last_signaled < count); | |
scherkus (not reviewing)
2012/03/08 02:37:08
DCHECK_LE
tommi (sloooow) - chröme
2012/03/08 16:10:57
changed to DCHECK_LT
| |
94 #ifndef NDEBUG | |
scherkus (not reviewing)
2012/03/08 02:37:08
if we added curly braces around that for-loop I'd
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done. Do we even need the curly braces? (the comp
| |
95 for (size_t i = 0; i < count; ++i) | |
96 DCHECK(synchronizers[i].IsValid()); | |
97 #endif | |
98 | |
99 int ret = -1; | |
100 | |
101 scoped_array<struct pollfd> sockets(new struct pollfd[count]); | |
102 memset(&sockets[0], 0, count * sizeof(struct pollfd)); // NOLINT | |
scherkus (not reviewing)
2012/03/08 02:37:08
is the NOLINT for sizeof(struct pollfd)?
would si
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
103 size_t index = 0; | |
104 for (size_t i = last_signaled + 1; i < count; ++i) { | |
scherkus (not reviewing)
2012/03/08 02:37:08
I'd have a smallish comment here describing what's
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
105 struct pollfd& fd = sockets[index++]; | |
106 fd.events = POLLIN; | |
107 fd.fd = synchronizers[i].socket_.handle(); | |
108 } | |
109 | |
110 for (size_t i = 0; i <= last_signaled; ++i) { | |
111 struct pollfd& fd = sockets[index++]; | |
112 fd.events = POLLIN; | |
113 fd.fd = synchronizers[i].socket_.handle(); | |
114 } | |
115 DCHECK_EQ(index, count); | |
116 | |
117 int err = poll(&sockets[0], count, -1); | |
118 if (err != -1) { | |
119 for (size_t i = 0; i < count; ++i) { | |
120 if (sockets[i].revents) { | |
121 ret = (i + last_signaled + 1) % count; | |
122 DCHECK_EQ(sockets[i].fd, synchronizers[ret].socket_.handle()); | |
123 synchronizers[ret].Wait(); | |
124 break; | |
125 } | |
126 } | |
127 } else { | |
128 NOTREACHED() << "err: " << errno; | |
scherkus (not reviewing)
2012/03/08 02:37:08
something more descriptive?
tommi (sloooow) - chröme
2012/03/08 16:10:57
Done.
| |
129 } | |
130 | |
131 DCHECK_NE(ret, -1); | |
132 return ret; | |
133 } | |
134 | |
135 #endif // !defined(OS_POSIX) | |
OLD | NEW |