xref: /aosp_15_r20/external/libchrome/mojo/public/c/system/trap.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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