1 // Copyright 2017 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 5 #ifndef MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_ 6 #define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_ 7 8 #include "mojo/public/c/system/types.h" 9 #include "mojo/public/cpp/system/system_export.h" 10 11 namespace mojo { 12 13 // A convenience wrapper around the MojoHandleSignalsState struct. 14 struct MOJO_CPP_SYSTEM_EXPORT HandleSignalsState final 15 : public MojoHandleSignalsState { HandleSignalsStatefinal16 HandleSignalsState() { 17 satisfied_signals = MOJO_HANDLE_SIGNAL_NONE; 18 satisfiable_signals = MOJO_HANDLE_SIGNAL_NONE; 19 } 20 HandleSignalsStatefinal21 HandleSignalsState(MojoHandleSignals satisfied, 22 MojoHandleSignals satisfiable) { 23 satisfied_signals = satisfied; 24 satisfiable_signals = satisfiable; 25 } 26 27 bool operator==(const HandleSignalsState& other) const { 28 return satisfied_signals == other.satisfied_signals && 29 satisfiable_signals == other.satisfiable_signals; 30 } 31 32 // TODO(rockot): Remove this in favor of operator==. equalsfinal33 bool equals(const HandleSignalsState& other) const { 34 return satisfied_signals == other.satisfied_signals && 35 satisfiable_signals == other.satisfiable_signals; 36 } 37 satisfies_anyfinal38 bool satisfies_any(MojoHandleSignals signals) const { 39 return !!(satisfied_signals & signals); 40 } 41 satisfies_allfinal42 bool satisfies_all(MojoHandleSignals signals) const { 43 return (satisfied_signals & signals) == signals; 44 } 45 can_satisfy_anyfinal46 bool can_satisfy_any(MojoHandleSignals signals) const { 47 return !!(satisfiable_signals & signals); 48 } 49 50 // The handle is currently readable. May apply to a message pipe handle or 51 // data pipe consumer handle. readablefinal52 bool readable() const { return satisfies_any(MOJO_HANDLE_SIGNAL_READABLE); } 53 54 // The handle is currently writable. May apply to a message pipe handle or 55 // data pipe producer handle. writablefinal56 bool writable() const { return satisfies_any(MOJO_HANDLE_SIGNAL_WRITABLE); } 57 58 // The handle's peer is closed. May apply to any message pipe or data pipe 59 // handle. peer_closedfinal60 bool peer_closed() const { 61 return satisfies_any(MOJO_HANDLE_SIGNAL_PEER_CLOSED); 62 } 63 64 // The handle's peer exists in a remote execution context (e.g. in another 65 // process.) peer_remotefinal66 bool peer_remote() const { 67 return satisfies_any(MOJO_HANDLE_SIGNAL_PEER_REMOTE); 68 } 69 70 // Indicates whether the handle has exceeded some quota limit. quota_exceededfinal71 bool quota_exceeded() const { 72 return satisfies_any(MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED); 73 } 74 75 // The handle will never be |readable()| again. never_readablefinal76 bool never_readable() const { 77 return !can_satisfy_any(MOJO_HANDLE_SIGNAL_READABLE); 78 } 79 80 // The handle will never be |writable()| again. never_writablefinal81 bool never_writable() const { 82 return !can_satisfy_any(MOJO_HANDLE_SIGNAL_WRITABLE); 83 } 84 85 // The handle can never indicate |peer_closed()|. Never true for message pipe 86 // or data pipe handles (they can always signal peer closure), but always true 87 // for other types of handles (they have no peer.) never_peer_closedfinal88 bool never_peer_closed() const { 89 return !can_satisfy_any(MOJO_HANDLE_SIGNAL_PEER_CLOSED); 90 } 91 92 // THe handle will never indicate |peer_remote()| again. True iff the peer is 93 // known to be closed. never_peer_remotefinal94 bool never_peer_remote() const { 95 return !can_satisfy_any(MOJO_HANDLE_SIGNAL_PEER_REMOTE); 96 } 97 98 // (Copy and assignment allowed.) 99 }; 100 101 static_assert(sizeof(HandleSignalsState) == sizeof(MojoHandleSignalsState), 102 "HandleSignalsState should add no overhead"); 103 104 } // namespace mojo 105 106 #endif // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_ 107