1*635a8641SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef MOJO_PUBLIC_C_SYSTEM_TRAP_H_ 6*635a8641SAndroid Build Coastguard Worker #define MOJO_PUBLIC_C_SYSTEM_TRAP_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/macros.h" 11*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/system_export.h" 12*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/types.h" 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker // Flags passed to trap event handlers within |MojoTrapEvent|. 15*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoTrapEventFlags; 16*635a8641SAndroid Build Coastguard Worker 17*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 18*635a8641SAndroid Build Coastguard Worker const MojoTrapEventFlags MOJO_TRAP_EVENT_FLAG_NONE = 0; 19*635a8641SAndroid Build Coastguard Worker const MojoTrapEventFlags MOJO_TRAP_EVENT_FLAG_WITHIN_API_CALL = 1 << 0; 20*635a8641SAndroid Build Coastguard Worker #else 21*635a8641SAndroid Build Coastguard Worker #define MOJO_TRAP_EVENT_FLAG_NONE ((MojoTrapEventFlags)0) 22*635a8641SAndroid Build Coastguard Worker #define MOJO_TRAP_EVENT_FLAG_WITHIN_API_CALL ((MojoTrapEventFlags)1 << 0) 23*635a8641SAndroid Build Coastguard Worker #endif 24*635a8641SAndroid Build Coastguard Worker 25*635a8641SAndroid Build Coastguard Worker // Structure passed to trap event handlers when invoked by a tripped trap. 26*635a8641SAndroid Build Coastguard Worker struct MOJO_ALIGNAS(8) MojoTrapEvent { 27*635a8641SAndroid Build Coastguard Worker // The size of this structure, used for versioning. 28*635a8641SAndroid Build Coastguard Worker uint32_t struct_size; 29*635a8641SAndroid Build Coastguard Worker 30*635a8641SAndroid Build Coastguard Worker // May take on some combination of the following values: 31*635a8641SAndroid Build Coastguard Worker // 32*635a8641SAndroid Build Coastguard Worker // |MOJO_TRAP_EVENT_FLAG_NONE|: No flags. 33*635a8641SAndroid Build Coastguard Worker // 34*635a8641SAndroid Build Coastguard Worker // |MOJO_TRAP_EVENT_FLAG_WITHIN_API_CALL|: The trap was tripped within the 35*635a8641SAndroid Build Coastguard Worker // extent of a user call to some Mojo API. This means that the event 36*635a8641SAndroid Build Coastguard Worker // handler itself is re-entering user code. May happen, for example, if 37*635a8641SAndroid Build Coastguard Worker // user code writes to an intra-process pipe and the receiving end trips 38*635a8641SAndroid Build Coastguard Worker // a trap as a result. In that case the event handler executes within 39*635a8641SAndroid Build Coastguard Worker // the extent of the |MojoWriteMessage()| call. 40*635a8641SAndroid Build Coastguard Worker MojoTrapEventFlags flags; 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker // The context for the trigger which tripped the trap. 43*635a8641SAndroid Build Coastguard Worker MOJO_POINTER_FIELD(uintptr_t, trigger_context); 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker // A result code indicating the cause of the event. May take on any of the 46*635a8641SAndroid Build Coastguard Worker // following values: 47*635a8641SAndroid Build Coastguard Worker // 48*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_OK|: The trigger's conditions were met. 49*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_FAILED_PRECONDITION|: The trigger's observed handle has 50*635a8641SAndroid Build Coastguard Worker // changed state in such a way that the trigger's conditions can never 51*635a8641SAndroid Build Coastguard Worker // be met again. 52*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_CANCELLED|: The trigger has been removed and will never 53*635a8641SAndroid Build Coastguard Worker // cause another event to fire. This is always the last event fired by 54*635a8641SAndroid Build Coastguard Worker // a trigger and it will fire when: the trigger is explicitly removed 55*635a8641SAndroid Build Coastguard Worker // with |MojoRemoteTrigger()|, the trigger's owning trap handle is 56*635a8641SAndroid Build Coastguard Worker // closed, or the handle observed by the trigger is closed. 57*635a8641SAndroid Build Coastguard Worker // 58*635a8641SAndroid Build Coastguard Worker // Unlike the other result types above |MOJO_RESULT_CANCELLED| can 59*635a8641SAndroid Build Coastguard Worker // fire even when the trap is disarmed. 60*635a8641SAndroid Build Coastguard Worker MojoResult result; 61*635a8641SAndroid Build Coastguard Worker 62*635a8641SAndroid Build Coastguard Worker // The last known signalling state of the trigger's observed handle at the 63*635a8641SAndroid Build Coastguard Worker // time the trap was tripped. 64*635a8641SAndroid Build Coastguard Worker struct MojoHandleSignalsState signals_state; 65*635a8641SAndroid Build Coastguard Worker }; 66*635a8641SAndroid Build Coastguard Worker MOJO_STATIC_ASSERT(sizeof(MojoTrapEvent) == 32, 67*635a8641SAndroid Build Coastguard Worker "MojoTrapEvent has wrong size."); 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker // Value given to |MojoAddTrigger| to configure what condition should cause it 70*635a8641SAndroid Build Coastguard Worker // to trip its trap. May be one of the following values: 71*635a8641SAndroid Build Coastguard Worker // 72*635a8641SAndroid Build Coastguard Worker // |MOJO_TRIGGER_CONDITION_SIGNALS_UNSATISFIED| - A trigger added with this 73*635a8641SAndroid Build Coastguard Worker // condition will trip its trap when any of its observed signals 74*635a8641SAndroid Build Coastguard Worker // transition from being satisfied to being unsatisfied. 75*635a8641SAndroid Build Coastguard Worker // |MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED| - A triger added with this 76*635a8641SAndroid Build Coastguard Worker // condition will trip its trap when any of its observed signals 77*635a8641SAndroid Build Coastguard Worker // transition from being unsatisfied to being satisfied, or when none of 78*635a8641SAndroid Build Coastguard Worker // the observed signals can ever be satisfied again. 79*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoTriggerCondition; 80*635a8641SAndroid Build Coastguard Worker 81*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 82*635a8641SAndroid Build Coastguard Worker const MojoTriggerCondition MOJO_TRIGGER_CONDITION_SIGNALS_UNSATISFIED = 0; 83*635a8641SAndroid Build Coastguard Worker const MojoTriggerCondition MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED = 1; 84*635a8641SAndroid Build Coastguard Worker #else 85*635a8641SAndroid Build Coastguard Worker #define MOJO_TRIGGER_CONDITION_SIGNALS_UNSATISFIED ((MojoTriggerCondition)0) 86*635a8641SAndroid Build Coastguard Worker #define MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED ((MojoTriggerCondition)1) 87*635a8641SAndroid Build Coastguard Worker #endif 88*635a8641SAndroid Build Coastguard Worker 89*635a8641SAndroid Build Coastguard Worker // Flags passed to |MojoCreateTrap()| via |MojoCreateTrapOptions|. 90*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoCreateTrapFlags; 91*635a8641SAndroid Build Coastguard Worker 92*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 93*635a8641SAndroid Build Coastguard Worker const MojoCreateTrapFlags MOJO_CREATE_TRAP_FLAG_NONE = 0; 94*635a8641SAndroid Build Coastguard Worker #else 95*635a8641SAndroid Build Coastguard Worker #define MOJO_CREATE_TRAP_FLAG_NONE ((MojoCreateTrapFlags)0) 96*635a8641SAndroid Build Coastguard Worker #endif 97*635a8641SAndroid Build Coastguard Worker 98*635a8641SAndroid Build Coastguard Worker // Options passed to |MojoCreateTrap()|. 99*635a8641SAndroid Build Coastguard Worker struct MOJO_ALIGNAS(8) MojoCreateTrapOptions { 100*635a8641SAndroid Build Coastguard Worker // The size of this structure, used for versioning. 101*635a8641SAndroid Build Coastguard Worker uint32_t struct_size; 102*635a8641SAndroid Build Coastguard Worker 103*635a8641SAndroid Build Coastguard Worker // Flags. Currently unused. 104*635a8641SAndroid Build Coastguard Worker MojoCreateTrapFlags flags; 105*635a8641SAndroid Build Coastguard Worker }; 106*635a8641SAndroid Build Coastguard Worker MOJO_STATIC_ASSERT(sizeof(MojoCreateTrapOptions) == 8, 107*635a8641SAndroid Build Coastguard Worker "MojoCreateTrapOptions has wrong size."); 108*635a8641SAndroid Build Coastguard Worker 109*635a8641SAndroid Build Coastguard Worker // Flags passed to |MojoAddTrigger()| via |MojoAddTriggerOptions|. 110*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoAddTriggerFlags; 111*635a8641SAndroid Build Coastguard Worker 112*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 113*635a8641SAndroid Build Coastguard Worker const MojoAddTriggerFlags MOJO_ADD_TRIGGER_FLAG_NONE = 0; 114*635a8641SAndroid Build Coastguard Worker #else 115*635a8641SAndroid Build Coastguard Worker #define MOJO_ADD_TRIGGER_FLAG_NONE ((MojoAddTriggerFlags)0) 116*635a8641SAndroid Build Coastguard Worker #endif 117*635a8641SAndroid Build Coastguard Worker 118*635a8641SAndroid Build Coastguard Worker // Options passed to |MojoAddTrigger()|. 119*635a8641SAndroid Build Coastguard Worker struct MOJO_ALIGNAS(8) MojoAddTriggerOptions { 120*635a8641SAndroid Build Coastguard Worker // The size of this structure, used for versioning. 121*635a8641SAndroid Build Coastguard Worker uint32_t struct_size; 122*635a8641SAndroid Build Coastguard Worker 123*635a8641SAndroid Build Coastguard Worker // Flags. Currently unused. 124*635a8641SAndroid Build Coastguard Worker MojoAddTriggerFlags flags; 125*635a8641SAndroid Build Coastguard Worker }; 126*635a8641SAndroid Build Coastguard Worker MOJO_STATIC_ASSERT(sizeof(MojoAddTriggerOptions) == 8, 127*635a8641SAndroid Build Coastguard Worker "MojoAddTriggerOptions has wrong size."); 128*635a8641SAndroid Build Coastguard Worker 129*635a8641SAndroid Build Coastguard Worker // Flags passed to |MojoRemoveTrigger()| via |MojoRemoveTriggerOptions|. 130*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoRemoveTriggerFlags; 131*635a8641SAndroid Build Coastguard Worker 132*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 133*635a8641SAndroid Build Coastguard Worker const MojoRemoveTriggerFlags MOJO_REMOVE_TRIGGER_FLAG_NONE = 0; 134*635a8641SAndroid Build Coastguard Worker #else 135*635a8641SAndroid Build Coastguard Worker #define MOJO_REMOVE_TRIGGER_FLAG_NONE ((MojoRemoveTriggerFlags)0) 136*635a8641SAndroid Build Coastguard Worker #endif 137*635a8641SAndroid Build Coastguard Worker 138*635a8641SAndroid Build Coastguard Worker // Options passed to |MojoRemoveTrigger()|. 139*635a8641SAndroid Build Coastguard Worker struct MOJO_ALIGNAS(8) MojoRemoveTriggerOptions { 140*635a8641SAndroid Build Coastguard Worker // The size of this structure, used for versioning. 141*635a8641SAndroid Build Coastguard Worker uint32_t struct_size; 142*635a8641SAndroid Build Coastguard Worker 143*635a8641SAndroid Build Coastguard Worker // Flags. Currently unused. 144*635a8641SAndroid Build Coastguard Worker MojoRemoveTriggerFlags flags; 145*635a8641SAndroid Build Coastguard Worker }; 146*635a8641SAndroid Build Coastguard Worker MOJO_STATIC_ASSERT(sizeof(MojoRemoveTriggerOptions) == 8, 147*635a8641SAndroid Build Coastguard Worker "MojoRemoveTriggerOptions has wrong size."); 148*635a8641SAndroid Build Coastguard Worker 149*635a8641SAndroid Build Coastguard Worker // Flags passed to |MojoArmTrap()| via |MojoArmTrapOptions|. 150*635a8641SAndroid Build Coastguard Worker typedef uint32_t MojoArmTrapFlags; 151*635a8641SAndroid Build Coastguard Worker 152*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 153*635a8641SAndroid Build Coastguard Worker const MojoArmTrapFlags MOJO_ARM_TRAP_FLAG_NONE = 0; 154*635a8641SAndroid Build Coastguard Worker #else 155*635a8641SAndroid Build Coastguard Worker #define MOJO_ARM_TRAP_FLAG_NONE ((MojoArmTrapFlags)0) 156*635a8641SAndroid Build Coastguard Worker #endif 157*635a8641SAndroid Build Coastguard Worker 158*635a8641SAndroid Build Coastguard Worker // Options passed to |MojoArmTrap()|. 159*635a8641SAndroid Build Coastguard Worker struct MOJO_ALIGNAS(8) MojoArmTrapOptions { 160*635a8641SAndroid Build Coastguard Worker // The size of this structure, used for versioning. 161*635a8641SAndroid Build Coastguard Worker uint32_t struct_size; 162*635a8641SAndroid Build Coastguard Worker 163*635a8641SAndroid Build Coastguard Worker // Flags. Currently unused. 164*635a8641SAndroid Build Coastguard Worker MojoArmTrapFlags flags; 165*635a8641SAndroid Build Coastguard Worker }; 166*635a8641SAndroid Build Coastguard Worker MOJO_STATIC_ASSERT(sizeof(MojoArmTrapOptions) == 8, 167*635a8641SAndroid Build Coastguard Worker "MojoArmTrapOptions has wrong size."); 168*635a8641SAndroid Build Coastguard Worker 169*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 170*635a8641SAndroid Build Coastguard Worker extern "C" { 171*635a8641SAndroid Build Coastguard Worker #endif 172*635a8641SAndroid Build Coastguard Worker 173*635a8641SAndroid Build Coastguard Worker // A user-provided callback to handle trap events. Passed to |MojoCreateTrap()|. 174*635a8641SAndroid Build Coastguard Worker typedef void (*MojoTrapEventHandler)(const struct MojoTrapEvent* event); 175*635a8641SAndroid Build Coastguard Worker 176*635a8641SAndroid Build Coastguard Worker // Creates a new trap which can be used to detect signal changes on a handle. 177*635a8641SAndroid Build Coastguard Worker // Traps execute arbitrary user code when tripped. 178*635a8641SAndroid Build Coastguard Worker // 179*635a8641SAndroid Build Coastguard Worker // Traps can trip only while armed**, and new traps are created in a disarmed 180*635a8641SAndroid Build Coastguard Worker // state. Traps may be armed using |MojoArmTrap()|. 181*635a8641SAndroid Build Coastguard Worker // 182*635a8641SAndroid Build Coastguard Worker // Arming a trap is only possible when the trap has one or more triggers 183*635a8641SAndroid Build Coastguard Worker // attached to it. Triggers can be added or removed using |MojoAddTrigger()| and 184*635a8641SAndroid Build Coastguard Worker // |MojoRemoveTrigger()|. 185*635a8641SAndroid Build Coastguard Worker // 186*635a8641SAndroid Build Coastguard Worker // If a trap is tripped by any of its triggers, it is disarmed immediately and 187*635a8641SAndroid Build Coastguard Worker // the traps |MojoTrapEventHandler| is invoked once for every relevant trigger. 188*635a8641SAndroid Build Coastguard Worker // 189*635a8641SAndroid Build Coastguard Worker // |options| may be null. 190*635a8641SAndroid Build Coastguard Worker // 191*635a8641SAndroid Build Coastguard Worker // ** An unarmed trap will still fire an event when a trigger is removed. This 192*635a8641SAndroid Build Coastguard Worker // event will always convey the result |MOJO_RESULT_CANCELLED|. 193*635a8641SAndroid Build Coastguard Worker // 194*635a8641SAndroid Build Coastguard Worker // Parameters: 195*635a8641SAndroid Build Coastguard Worker // |handler|: The |MojoTrapEventHandler| to invoke any time this trap is 196*635a8641SAndroid Build Coastguard Worker // tripped. Note that this may be called from any arbitrary thread. 197*635a8641SAndroid Build Coastguard Worker // |trap_handle|: The address at which to store the MojoHandle corresponding 198*635a8641SAndroid Build Coastguard Worker // to the new trap if successfully created. 199*635a8641SAndroid Build Coastguard Worker // 200*635a8641SAndroid Build Coastguard Worker // Returns: 201*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_OK| if the trap has been successfully created. 202*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_RESOURCE_EXHAUSTED| if a handle could not be allocated for 203*635a8641SAndroid Build Coastguard Worker // this trap. 204*635a8641SAndroid Build Coastguard Worker MOJO_SYSTEM_EXPORT MojoResult 205*635a8641SAndroid Build Coastguard Worker MojoCreateTrap(MojoTrapEventHandler handler, 206*635a8641SAndroid Build Coastguard Worker const struct MojoCreateTrapOptions* options, 207*635a8641SAndroid Build Coastguard Worker MojoHandle* trap_handle); 208*635a8641SAndroid Build Coastguard Worker 209*635a8641SAndroid Build Coastguard Worker // Adds a trigger to a trap. This configures the trap to invoke its event 210*635a8641SAndroid Build Coastguard Worker // handler if the specified conditions are met (or can no longer be met) while 211*635a8641SAndroid Build Coastguard Worker // the trap is armed. 212*635a8641SAndroid Build Coastguard Worker // 213*635a8641SAndroid Build Coastguard Worker // Note that event handler invocations for a given trigger are mutually 214*635a8641SAndroid Build Coastguard Worker // exclusive in execution: the handler will never be entered for a trigger while 215*635a8641SAndroid Build Coastguard Worker // another thread is executing it for the same trigger. Similarly, event 216*635a8641SAndroid Build Coastguard Worker // handlers are never re-entered. If an event handler changes the state of the 217*635a8641SAndroid Build Coastguard Worker // system such that another event would fire, that event is deferred until the 218*635a8641SAndroid Build Coastguard Worker // first handler returns. 219*635a8641SAndroid Build Coastguard Worker // 220*635a8641SAndroid Build Coastguard Worker // Parameters: 221*635a8641SAndroid Build Coastguard Worker // |trap_handle|: The trap to which this trigger is to be added. 222*635a8641SAndroid Build Coastguard Worker // |handle|: The handle whose signals this trigger will observe. Must be a 223*635a8641SAndroid Build Coastguard Worker // message pipe or data pipe handle. 224*635a8641SAndroid Build Coastguard Worker // |signals|: The specific signal(s) this trigger will observe on |handle|. 225*635a8641SAndroid Build Coastguard Worker // |condition|: The signaling condition this trigger will observe. i.e. 226*635a8641SAndroid Build Coastguard Worker // whether to trip the trap when |signals| become satisfied or when they 227*635a8641SAndroid Build Coastguard Worker // become unsatisfied. 228*635a8641SAndroid Build Coastguard Worker // |context|: An arbitrary context value to be passed to the trap's event 229*635a8641SAndroid Build Coastguard Worker // handler when this trigger was responsible for tripping the trap. See 230*635a8641SAndroid Build Coastguard Worker // the |trigger_context| field in |MojoTrapEvent|. This value must be 231*635a8641SAndroid Build Coastguard Worker // unique among all triggers on the trap. 232*635a8641SAndroid Build Coastguard Worker // 233*635a8641SAndroid Build Coastguard Worker // |options| may be null. 234*635a8641SAndroid Build Coastguard Worker // 235*635a8641SAndroid Build Coastguard Worker // Returns: 236*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_OK| if the handle is now being observed by the trigger. 237*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_INVALID_ARGUMENT| if |trap_handle| is not a trap handle, 238*635a8641SAndroid Build Coastguard Worker // |handle| is not a valid message pipe or data pipe handle, or |signals| 239*635a8641SAndroid Build Coastguard Worker // or |condition| are an invalid value. 240*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_ALREADY_EXISTS| if the trap already has a trigger associated 241*635a8641SAndroid Build Coastguard Worker // with |context| or |handle|. 242*635a8641SAndroid Build Coastguard Worker MOJO_SYSTEM_EXPORT MojoResult 243*635a8641SAndroid Build Coastguard Worker MojoAddTrigger(MojoHandle trap_handle, 244*635a8641SAndroid Build Coastguard Worker MojoHandle handle, 245*635a8641SAndroid Build Coastguard Worker MojoHandleSignals signals, 246*635a8641SAndroid Build Coastguard Worker MojoTriggerCondition condition, 247*635a8641SAndroid Build Coastguard Worker uintptr_t context, 248*635a8641SAndroid Build Coastguard Worker const struct MojoAddTriggerOptions* options); 249*635a8641SAndroid Build Coastguard Worker 250*635a8641SAndroid Build Coastguard Worker // Removes a trigger from a trap. 251*635a8641SAndroid Build Coastguard Worker // 252*635a8641SAndroid Build Coastguard Worker // This ensures that the trigger is removed as soon as possible. Removal may 253*635a8641SAndroid Build Coastguard Worker // block an arbitrarily long time if the trap is already executing its handler. 254*635a8641SAndroid Build Coastguard Worker // 255*635a8641SAndroid Build Coastguard Worker // When removal is complete, the trap's handler is invoked one final time for 256*635a8641SAndroid Build Coastguard Worker // time for |context|, with the result |MOJO_RESULT_CANCELLED|. 257*635a8641SAndroid Build Coastguard Worker // 258*635a8641SAndroid Build Coastguard Worker // The same behavior can be elicted by either closing the watched handle 259*635a8641SAndroid Build Coastguard Worker // associated with this trigger, or by closing |trap_handle| itself. 260*635a8641SAndroid Build Coastguard Worker // 261*635a8641SAndroid Build Coastguard Worker // Parameters: 262*635a8641SAndroid Build Coastguard Worker // |trap_handle|: The handle of the trap from which to remove a trigger. 263*635a8641SAndroid Build Coastguard Worker // |context|: The context of the trigger to be removed. 264*635a8641SAndroid Build Coastguard Worker // 265*635a8641SAndroid Build Coastguard Worker // Returns: 266*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_OK| if the trigger has been removed. 267*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_INVALID_ARGUMENT| if |trap_handle| is not a trap handle. 268*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_NOT_FOUND| if there is no trigger registered on this trap for 269*635a8641SAndroid Build Coastguard Worker // the given value of |context|. 270*635a8641SAndroid Build Coastguard Worker MOJO_SYSTEM_EXPORT MojoResult 271*635a8641SAndroid Build Coastguard Worker MojoRemoveTrigger(MojoHandle trap_handle, 272*635a8641SAndroid Build Coastguard Worker uintptr_t context, 273*635a8641SAndroid Build Coastguard Worker const struct MojoRemoveTriggerOptions* options); 274*635a8641SAndroid Build Coastguard Worker 275*635a8641SAndroid Build Coastguard Worker // Arms a trap, allowing it to invoke its event handler the next time any of its 276*635a8641SAndroid Build Coastguard Worker // triggers' conditions are met. 277*635a8641SAndroid Build Coastguard Worker // 278*635a8641SAndroid Build Coastguard Worker // Parameters: 279*635a8641SAndroid Build Coastguard Worker // |trap_handle|: The handle of the trap to be armed. 280*635a8641SAndroid Build Coastguard Worker // |num_blocking_events|: An address pointing to the number of elements 281*635a8641SAndroid Build Coastguard Worker // available for storage at the address given by |blocking_events|. 282*635a8641SAndroid Build Coastguard Worker // Optional and only used when |MOJO_RESULT_FAILED_PRECONDITION| is 283*635a8641SAndroid Build Coastguard Worker // returned. See below. 284*635a8641SAndroid Build Coastguard Worker // |blocking_events|: An output buffer for |MojoTrapEvent| structures to be 285*635a8641SAndroid Build Coastguard Worker // filled in if one or more triggers would have tripped the trap 286*635a8641SAndroid Build Coastguard Worker // immediately if it were armed. Optional and used only when 287*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_FAILED_PRECONDITION| is returned. See below. 288*635a8641SAndroid Build Coastguard Worker // 289*635a8641SAndroid Build Coastguard Worker // Returns: 290*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_OK| if the trap has been successfully armed. 291*635a8641SAndroid Build Coastguard Worker // |num_blocking_events| and |blocking_events| are ignored. 292*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_NOT_FOUND| if the trap does not have any triggers. 293*635a8641SAndroid Build Coastguard Worker // |num_blocking_events| and |blocking_events| are ignored. 294*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_INVALID_ARGUMENT| if |trap_handle| is not a valid trap handle, 295*635a8641SAndroid Build Coastguard Worker // or if |num_blocking_events| is non-null but |blocking_events| is 296*635a8641SAndroid Build Coastguard Worker // not. 297*635a8641SAndroid Build Coastguard Worker // |MOJO_RESULT_FAILED_PRECONDITION| if one or more triggers would have 298*635a8641SAndroid Build Coastguard Worker // tripped the trap immediately upon arming. If |num_blocking_events| is 299*635a8641SAndroid Build Coastguard Worker // non-null, this assumes there is enough space for |*num_blocking_events| 300*635a8641SAndroid Build Coastguard Worker // entries at the non-null address in |blocking_events|. 301*635a8641SAndroid Build Coastguard Worker // 302*635a8641SAndroid Build Coastguard Worker // At most |*num_blocking_events| entries are populated there, with each 303*635a8641SAndroid Build Coastguard Worker // entry corresponding to one of the triggers which would have tripped the 304*635a8641SAndroid Build Coastguard Worker // trap. The actual number of entries populated is written to 305*635a8641SAndroid Build Coastguard Worker // |*num_blocking_events| before returning. 306*635a8641SAndroid Build Coastguard Worker // 307*635a8641SAndroid Build Coastguard Worker // If there are more ready triggers than available provided storage, the 308*635a8641SAndroid Build Coastguard Worker // subset presented to the caller is arbitrary. The runtime makes an 309*635a8641SAndroid Build Coastguard Worker // effort to circulate triggers returned by consecutive failed 310*635a8641SAndroid Build Coastguard Worker // |MojoArmTrap()| calls so that callers may avoid handle starvation when 311*635a8641SAndroid Build Coastguard Worker // observing a large number of active handles with a single trap. 312*635a8641SAndroid Build Coastguard Worker MOJO_SYSTEM_EXPORT MojoResult 313*635a8641SAndroid Build Coastguard Worker MojoArmTrap(MojoHandle trap_handle, 314*635a8641SAndroid Build Coastguard Worker const struct MojoArmTrapOptions* options, 315*635a8641SAndroid Build Coastguard Worker uint32_t* num_blocking_events, 316*635a8641SAndroid Build Coastguard Worker struct MojoTrapEvent* blocking_events); 317*635a8641SAndroid Build Coastguard Worker 318*635a8641SAndroid Build Coastguard Worker #ifdef __cplusplus 319*635a8641SAndroid Build Coastguard Worker } // extern "C" 320*635a8641SAndroid Build Coastguard Worker #endif 321*635a8641SAndroid Build Coastguard Worker 322*635a8641SAndroid Build Coastguard Worker #endif // MOJO_PUBLIC_C_SYSTEM_TRAP_H_ 323