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

Side by Side Diff: mojo/public/cpp/system/wait.h

Issue 2102903005: Make the mojo::WaitMany() wrapper insist on std::vectors. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 5 months 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_ 5 #ifndef MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
6 #define MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_ 6 #define MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <cstddef> 10 #include <vector>
11 11
12 #include "mojo/public/c/system/handle.h" 12 #include "mojo/public/c/system/handle.h"
13 #include "mojo/public/c/system/result.h" 13 #include "mojo/public/c/system/result.h"
14 #include "mojo/public/c/system/time.h" 14 #include "mojo/public/c/system/time.h"
15 #include "mojo/public/c/system/wait.h" 15 #include "mojo/public/c/system/wait.h"
16 #include "mojo/public/cpp/system/handle.h" 16 #include "mojo/public/cpp/system/handle.h"
17 17
18 namespace mojo { 18 namespace mojo {
19 19
20 inline MojoResult Wait(Handle handle, 20 inline MojoResult Wait(Handle handle,
(...skipping 24 matching lines...) Expand all
45 bool AreSignalsStatesValid() const { 45 bool AreSignalsStatesValid() const {
46 return result != MOJO_RESULT_INVALID_ARGUMENT && 46 return result != MOJO_RESULT_INVALID_ARGUMENT &&
47 result != MOJO_RESULT_RESOURCE_EXHAUSTED && 47 result != MOJO_RESULT_RESOURCE_EXHAUSTED &&
48 result != MOJO_RESULT_BUSY; 48 result != MOJO_RESULT_BUSY;
49 } 49 }
50 50
51 MojoResult result; 51 MojoResult result;
52 uint32_t index; 52 uint32_t index;
53 }; 53 };
54 54
55 // |HandleVectorType| and |FlagsVectorType| should be similar enough to 55 // |HandleType| should be |Handle| or a "trivial" subclass thereof, like
56 // |std::vector<Handle>| and |std::vector<MojoHandleSignals>|, respectively: 56 // |MessagePipeHandle|, etc.
57 // - They should have a (const) |size()| method that returns an unsigned type. 57 template <class HandleType>
58 // - They must provide contiguous storage, with access via (const) reference to 58 inline WaitManyResult WaitMany(
59 // that storage provided by a (const) |operator[]()| (by reference). 59 const std::vector<HandleType>& handles,
vardhan 2016/06/29 18:02:18 I'm guessing it used to be templated so that it'd
60 template <class HandleVectorType, 60 const std::vector<MojoHandleSignals>& signals,
61 class FlagsVectorType, 61 MojoDeadline deadline,
62 class SignalsStateVectorType> 62 std::vector<MojoHandleSignalsState>* signals_states) {
63 inline WaitManyResult WaitMany(const HandleVectorType& handles, 63 // We rely on being able to treat a vector of |HandleType|s as if it's an
64 const FlagsVectorType& signals, 64 // array of |MojoHandle|s.
65 MojoDeadline deadline, 65 static_assert(sizeof(HandleType) == sizeof(Handle),
66 SignalsStateVectorType* signals_states) { 66 "HandleType is not the same size as Handle");
67
67 if (signals.size() != handles.size() || 68 if (signals.size() != handles.size() ||
68 (signals_states && signals_states->size() != signals.size())) 69 (signals_states && signals_states->size() != signals.size()))
69 return WaitManyResult(MOJO_RESULT_INVALID_ARGUMENT); 70 return WaitManyResult(MOJO_RESULT_INVALID_ARGUMENT);
70 if (handles.size() >= kInvalidWaitManyIndexValue) 71 if (handles.size() >= kInvalidWaitManyIndexValue)
71 return WaitManyResult(MOJO_RESULT_RESOURCE_EXHAUSTED); 72 return WaitManyResult(MOJO_RESULT_RESOURCE_EXHAUSTED);
72 73
73 if (handles.size() == 0) { 74 if (handles.size() == 0) {
74 return WaitManyResult( 75 return WaitManyResult(
75 MojoWaitMany(nullptr, nullptr, 0, deadline, nullptr, nullptr)); 76 MojoWaitMany(nullptr, nullptr, 0, deadline, nullptr, nullptr));
76 } 77 }
77 78
78 uint32_t result_index = kInvalidWaitManyIndexValue; 79 uint32_t result_index = kInvalidWaitManyIndexValue;
79 const Handle& first_handle = handles[0]; 80 MojoResult result = MojoWaitMany(
80 const MojoHandleSignals& first_signals = signals[0]; 81 &handles[0].value(), signals.data(),
81 MojoHandleSignalsState* first_state = 82 static_cast<uint32_t>(handles.size()), deadline, &result_index,
82 signals_states ? &(*signals_states)[0] : nullptr; 83 signals_states ? signals_states->data() : nullptr);
83 MojoResult result =
84 MojoWaitMany(reinterpret_cast<const MojoHandle*>(&first_handle),
85 &first_signals, static_cast<uint32_t>(handles.size()),
86 deadline, &result_index, first_state);
87 return WaitManyResult(result, result_index); 84 return WaitManyResult(result, result_index);
88 } 85 }
89 86
90 // C++ 4.10, regarding pointer conversion, says that an integral null pointer
91 // constant can be converted to |std::nullptr_t|. The opposite direction is not
92 // allowed.
93 template <class HandleVectorType, class FlagsVectorType>
94 inline WaitManyResult WaitMany(const HandleVectorType& handles,
95 const FlagsVectorType& signals,
96 MojoDeadline deadline,
97 std::nullptr_t signals_states) {
98 if (signals.size() != handles.size())
99 return WaitManyResult(MOJO_RESULT_INVALID_ARGUMENT);
100 if (handles.size() >= kInvalidWaitManyIndexValue)
101 return WaitManyResult(MOJO_RESULT_RESOURCE_EXHAUSTED);
102
103 if (handles.size() == 0) {
104 return WaitManyResult(
105 MojoWaitMany(nullptr, nullptr, 0, deadline, nullptr, nullptr));
106 }
107
108 uint32_t result_index = kInvalidWaitManyIndexValue;
109 const Handle& first_handle = handles[0];
110 const MojoHandleSignals& first_signals = signals[0];
111 MojoResult result = MojoWaitMany(
112 reinterpret_cast<const MojoHandle*>(&first_handle), &first_signals,
113 static_cast<uint32_t>(handles.size()), deadline, &result_index, nullptr);
114 return WaitManyResult(result, result_index);
115 }
116
117 } // namespace mojo 87 } // namespace mojo
118 88
119 #endif // MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_ 89 #endif // MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698