Chromium Code Reviews| Index: mojo/public/cpp/system/wait.h |
| diff --git a/mojo/public/cpp/system/wait.h b/mojo/public/cpp/system/wait.h |
| index a3871d524dd8cbc75c84c32ad8708831ba410002..a1846b05428836553cfbe2459112a8e8a76b40af 100644 |
| --- a/mojo/public/cpp/system/wait.h |
| +++ b/mojo/public/cpp/system/wait.h |
| @@ -7,7 +7,7 @@ |
| #include <stdint.h> |
| -#include <cstddef> |
| +#include <vector> |
| #include "mojo/public/c/system/handle.h" |
| #include "mojo/public/c/system/result.h" |
| @@ -52,18 +52,19 @@ struct WaitManyResult { |
| uint32_t index; |
| }; |
| -// |HandleVectorType| and |FlagsVectorType| should be similar enough to |
| -// |std::vector<Handle>| and |std::vector<MojoHandleSignals>|, respectively: |
| -// - They should have a (const) |size()| method that returns an unsigned type. |
| -// - They must provide contiguous storage, with access via (const) reference to |
| -// that storage provided by a (const) |operator[]()| (by reference). |
| -template <class HandleVectorType, |
| - class FlagsVectorType, |
| - class SignalsStateVectorType> |
| -inline WaitManyResult WaitMany(const HandleVectorType& handles, |
| - const FlagsVectorType& signals, |
| - MojoDeadline deadline, |
| - SignalsStateVectorType* signals_states) { |
| +// |HandleType| should be |Handle| or a "trivial" subclass thereof, like |
| +// |MessagePipeHandle|, etc. |
| +template <class HandleType> |
| +inline WaitManyResult WaitMany( |
| + const std::vector<HandleType>& handles, |
|
vardhan
2016/06/29 18:02:18
I'm guessing it used to be templated so that it'd
|
| + const std::vector<MojoHandleSignals>& signals, |
| + MojoDeadline deadline, |
| + std::vector<MojoHandleSignalsState>* signals_states) { |
| + // We rely on being able to treat a vector of |HandleType|s as if it's an |
| + // array of |MojoHandle|s. |
| + static_assert(sizeof(HandleType) == sizeof(Handle), |
| + "HandleType is not the same size as Handle"); |
| + |
| if (signals.size() != handles.size() || |
| (signals_states && signals_states->size() != signals.size())) |
| return WaitManyResult(MOJO_RESULT_INVALID_ARGUMENT); |
| @@ -76,41 +77,10 @@ inline WaitManyResult WaitMany(const HandleVectorType& handles, |
| } |
| uint32_t result_index = kInvalidWaitManyIndexValue; |
| - const Handle& first_handle = handles[0]; |
| - const MojoHandleSignals& first_signals = signals[0]; |
| - MojoHandleSignalsState* first_state = |
| - signals_states ? &(*signals_states)[0] : nullptr; |
| - MojoResult result = |
| - MojoWaitMany(reinterpret_cast<const MojoHandle*>(&first_handle), |
| - &first_signals, static_cast<uint32_t>(handles.size()), |
| - deadline, &result_index, first_state); |
| - return WaitManyResult(result, result_index); |
| -} |
| - |
| -// C++ 4.10, regarding pointer conversion, says that an integral null pointer |
| -// constant can be converted to |std::nullptr_t|. The opposite direction is not |
| -// allowed. |
| -template <class HandleVectorType, class FlagsVectorType> |
| -inline WaitManyResult WaitMany(const HandleVectorType& handles, |
| - const FlagsVectorType& signals, |
| - MojoDeadline deadline, |
| - std::nullptr_t signals_states) { |
| - if (signals.size() != handles.size()) |
| - return WaitManyResult(MOJO_RESULT_INVALID_ARGUMENT); |
| - if (handles.size() >= kInvalidWaitManyIndexValue) |
| - return WaitManyResult(MOJO_RESULT_RESOURCE_EXHAUSTED); |
| - |
| - if (handles.size() == 0) { |
| - return WaitManyResult( |
| - MojoWaitMany(nullptr, nullptr, 0, deadline, nullptr, nullptr)); |
| - } |
| - |
| - uint32_t result_index = kInvalidWaitManyIndexValue; |
| - const Handle& first_handle = handles[0]; |
| - const MojoHandleSignals& first_signals = signals[0]; |
| MojoResult result = MojoWaitMany( |
| - reinterpret_cast<const MojoHandle*>(&first_handle), &first_signals, |
| - static_cast<uint32_t>(handles.size()), deadline, &result_index, nullptr); |
| + &handles[0].value(), signals.data(), |
| + static_cast<uint32_t>(handles.size()), deadline, &result_index, |
| + signals_states ? signals_states->data() : nullptr); |
| return WaitManyResult(result, result_index); |
| } |