Tiny code cleanup and added comments.
[chromium-blink-merge.git] / ppapi / api / pp_completion_callback.idl
blob72aed837704b6ed4b5ab679623f54e0ba0c0329f
1 /* Copyright (c) 2012 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 */
6 /**
7 * This file defines the API to create and run a callback.
8 */
10 /**
11 * This typedef defines the signature that you implement to receive callbacks
12 * on asynchronous completion of an operation.
14 * @param[in] user_data A pointer to user data passed to a callback function.
15 * @param[in] result If result is 0 (PP_OK), the operation succeeded. Negative
16 * values (other than -1 or PP_OK_COMPLETE) indicate error and are specified
17 * in pp_errors.h. Positive values for result usually indicate success and have
18 * some operation-dependent meaning (such as bytes read).
20 typedef void PP_CompletionCallback_Func([inout] mem_t user_data,
21 [in] int32_t result);
23 /**
24 * This enumeration contains flags used to control how non-NULL callbacks are
25 * scheduled by asynchronous methods.
27 [assert_size(4)]
28 enum PP_CompletionCallback_Flag {
29 /**
30 * By default any non-NULL callback will always invoked asynchronously,
31 * on success or error, even if the operation could complete synchronously
32 * without blocking.
34 * The method taking such callback will always return PP_OK_COMPLETIONPENDING.
35 * The callback will be invoked on the same thread on which the method was
36 * invoked.
38 * NOTE: If the method taking the callback is invoked on a background
39 * thread that has no valid PPB_MessageLoop resource attached, the system has
40 * no way to run the callback on the correct thread. In this case, a log
41 * message will be emitted and the plugin will be made to crash.
43 PP_COMPLETIONCALLBACK_FLAG_NONE = 0 << 0,
44 /**
45 * This flag allows any method taking such callback to complete synchronously
46 * and not call the callback if the operation would not block. This is useful
47 * when performance is an issue, and the operation bandwidth should not be
48 * limited to the processing speed of the message loop.
50 * On synchronous method completion, the completion result will be returned
51 * by the method itself. Otherwise, the method will return
52 * PP_OK_COMPLETIONPENDING, and the callback will be invoked asynchronously on
53 * the same thread on which the method was invoked. If there is no valid
54 * PPB_MessageLoop attached to that thread, and the callback would normally
55 * run asynchronously, the invoked method will return
56 * PP_ERROR_NO_MESSAGE_LOOP.
58 PP_COMPLETIONCALLBACK_FLAG_OPTIONAL = 1 << 0
62 /**
63 * <code>PP_CompletionCallback</code> is a common mechanism for supporting
64 * potentially asynchronous calls in browser interfaces. Any method that takes a
65 * <code>PP_CompletionCallback</code> can be used in one of three different
66 * ways:
67 * - Required: The callback will always be invoked asynchronously on the
68 * thread where the associated PPB method was invoked. The method
69 * will always return PP_OK_COMPLETIONPENDING when a required
70 * callback, and the callback will be invoked later (barring
71 * system or thread shutdown; see PPB_MessageLoop for details).
72 * Required callbacks are the default.
73 * <br /><br />
74 * NOTE: If you use a required callback on a background thread,
75 * you must have created and attached a PPB_MessageLoop.
76 * Otherwise, the system can not run your callback on that thread,
77 * and will instead emit a log message and crash your plugin to
78 * make the problem more obvious.
80 * - Optional: The callback may be invoked asynchronously, or the PPB method
81 * may complete synchronously if it can do so without blocking.
82 * If the method will complete asynchronously, it will return
83 * PP_OK_COMPLETIONPENDING. Otherwise, it will complete
84 * synchronously and return an appropriate code (see below for
85 * more information on the return code). Optional callbacks are
86 * generally more difficult to use correctly than Required
87 * callbacks, but can provide better performance for some APIs
88 * (especially APIs with buffered reads, such as PPB_URLLoader or
89 * PPB_FileIO).
90 * <br /><br />
91 * NOTE: If you use an optional callback on a background thread,
92 * and you have not created and attached a PPB_MessageLoop, then
93 * the method you invoke will fail without running and return
94 * PP_ERROR_NO_MESSAGE_LOOP.
96 * - Blocking: In this case, the callback's function pointer is NULL, and the
97 * invoked method must complete synchronously. The method will
98 * run to completion and return an appropriate code when finished
99 * (see below for more information). Blocking completion
100 * callbacks are only supported on background threads.
101 * <br /><br />
102 * <code>PP_BlockUntilComplete()</code> provides a convenient way
103 * to specify blocking behavior. Refer to
104 * <code>PP_BlockUntilComplete</code> for more information.
106 * When the callback is run asynchronously, the result parameter passed to
107 * <code>func</code> is an int32_t that, if negative indicates an error code
108 * whose meaning is specific to the calling method (refer to
109 * <code>pp_error.h</code> for further information). A positive or 0 value is a
110 * return result indicating success whose meaning depends on the calling method
111 * (e.g. number of bytes read).
113 [passByValue] struct PP_CompletionCallback {
115 * This value is a callback function that will be called, or NULL if this is
116 * a blocking completion callback.
118 PP_CompletionCallback_Func func;
120 * This value is a pointer to user data passed to a callback function.
122 mem_t user_data;
125 * Flags used to control how non-NULL callbacks are scheduled by
126 * asynchronous methods.
128 int32_t flags;
131 #inline c
132 #include <stdlib.h>
135 * @addtogroup Functions
136 * @{
139 * PP_MakeCompletionCallback() is used to create a
140 * <code>PP_CompletionCallback</code>.
142 * <strong>Example, creating a Required callback:</strong>
144 * @code
145 * struct PP_CompletionCallback cc = PP_MakeCompletionCallback(Foo, NULL);
146 * @endcode
148 * <strong>Example, creating an Optional callback:</strong>
150 * @code
151 * struct PP_CompletionCallback cc = PP_MakeCompletionCallback(Foo, NULL);
152 * cc.flags = cc.flags | PP_COMPLETIONCALLBACK_FLAG_OPTIONAL;
153 * @endcode
155 * @param[in] func A <code>PP_CompletionCallback_Func</code> that will be
156 * called.
157 * @param[in] user_data A pointer to user data passed to your callback
158 * function. This is optional and is typically used to help track state
159 * when you may have multiple callbacks pending.
161 * @return A <code>PP_CompletionCallback</code> structure.
163 PP_INLINE struct PP_CompletionCallback PP_MakeCompletionCallback(
164 PP_CompletionCallback_Func func,
165 void* user_data) {
166 struct PP_CompletionCallback cc;
167 cc.func = func;
168 cc.user_data = user_data;
169 cc.flags = PP_COMPLETIONCALLBACK_FLAG_NONE;
170 return cc;
174 * PP_MakeOptionalCompletionCallback() is used to create a PP_CompletionCallback
175 * with PP_COMPLETIONCALLBACK_FLAG_OPTIONAL set.
177 * @param[in] func A PP_CompletionCallback_Func to be called on completion.
178 * @param[in] user_data A pointer to user data passed to be passed to the
179 * callback function. This is optional and is typically used to help track state
180 * in case of multiple pending callbacks.
182 * @return A PP_CompletionCallback structure.
184 PP_INLINE struct PP_CompletionCallback PP_MakeOptionalCompletionCallback(
185 PP_CompletionCallback_Func func,
186 void* user_data) {
187 struct PP_CompletionCallback cc = PP_MakeCompletionCallback(func, user_data);
188 cc.flags = cc.flags | PP_COMPLETIONCALLBACK_FLAG_OPTIONAL;
189 return cc;
192 * @}
196 * @addtogroup Functions
197 * @{
201 * PP_RunCompletionCallback() is used to run a callback. It invokes
202 * the callback function passing it user data specified on creation and
203 * completion |result|.
205 * @param[in] cc A pointer to a <code>PP_CompletionCallback</code> that will be
206 * run.
207 * @param[in] result The result of the operation. Non-positive values correspond
208 * to the error codes from pp_errors.h (excluding PP_OK_COMPLETIONPENDING).
209 * Positive values indicate additional information such as bytes read.
211 PP_INLINE void PP_RunCompletionCallback(struct PP_CompletionCallback* cc,
212 int32_t result) {
213 cc->func(cc->user_data, result);
217 * @}
221 * @addtogroup Functions
222 * @{
226 * PP_BlockUntilComplete() is used in place of an actual completion callback
227 * to request blocking behavior. If specified, the calling thread will block
228 * until the function completes. Blocking completion callbacks are only allowed
229 * from background threads.
231 * @return A <code>PP_CompletionCallback</code> structure.
233 PP_INLINE struct PP_CompletionCallback PP_BlockUntilComplete(void) {
234 return PP_MakeCompletionCallback(NULL, NULL);
238 * PP_RunAndClearCompletionCallback() runs a callback and clears the reference
239 * to that callback.
241 * This function is used when the null-ness of a completion callback is used as
242 * a signal for whether a completion callback has been registered. In this
243 * case, after the execution of the callback, it should be cleared. However,
244 * this introduces a conflict if the completion callback wants to schedule more
245 * work that involves the same completion callback again (for example, when
246 * reading data from an URLLoader, one would typically queue up another read
247 * callback). As a result, this function clears the pointer
248 * before the provided callback is executed.
250 PP_INLINE void PP_RunAndClearCompletionCallback(
251 struct PP_CompletionCallback* cc,
252 int32_t res) {
253 struct PP_CompletionCallback temp = *cc;
254 *cc = PP_BlockUntilComplete();
255 PP_RunCompletionCallback(&temp, res);
258 * @}
261 #endinl