Rev 1709 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1709 | Rev 1751 | ||
|---|---|---|---|
| Line 147... | Line 147... | ||
| 147 | 147 | ||
| 148 | /** Epilogue of ipc_async_send functions */ |
148 | /** Epilogue of ipc_async_send functions */ |
| 149 | static inline void ipc_finish_async(ipc_callid_t callid, int phoneid, |
149 | static inline void ipc_finish_async(ipc_callid_t callid, int phoneid, |
| 150 | async_call_t *call, int can_preempt) |
150 | async_call_t *call, int can_preempt) |
| 151 | { |
151 | { |
| - | 152 | if (!call) { /* Nothing to do regardless if failed or not */ |
|
| - | 153 | futex_up(&ipc_futex); |
|
| - | 154 | return; |
|
| - | 155 | } |
|
| - | 156 | ||
| 152 | if (callid == IPC_CALLRET_FATAL) { |
157 | if (callid == IPC_CALLRET_FATAL) { |
| 153 | futex_up(&ipc_futex); |
158 | futex_up(&ipc_futex); |
| 154 | /* Call asynchronous handler with error code */ |
159 | /* Call asynchronous handler with error code */ |
| 155 | if (call->callback) |
160 | if (call->callback) |
| 156 | call->callback(call->private, ENOENT, NULL); |
161 | call->callback(call->private, ENOENT, NULL); |
| Line 190... | Line 195... | ||
| 190 | */ |
195 | */ |
| 191 | void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
196 | void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
| 192 | ipcarg_t arg2, void *private, |
197 | ipcarg_t arg2, void *private, |
| 193 | ipc_async_callback_t callback, int can_preempt) |
198 | ipc_async_callback_t callback, int can_preempt) |
| 194 | { |
199 | { |
| 195 | async_call_t *call; |
200 | async_call_t *call = NULL; |
| 196 | ipc_callid_t callid; |
201 | ipc_callid_t callid; |
| 197 | 202 | ||
| - | 203 | if (callback) { |
|
| 198 | call = ipc_prepare_async(private, callback); |
204 | call = ipc_prepare_async(private, callback); |
| 199 | if (!call) |
205 | if (!call) |
| 200 | return; |
206 | return; |
| - | 207 | } |
|
| 201 | 208 | ||
| 202 | /* We need to make sure that we get callid before |
209 | /* We need to make sure that we get callid before |
| 203 | * another thread accesses the queue again */ |
210 | * another thread accesses the queue again */ |
| 204 | futex_down(&ipc_futex); |
211 | futex_down(&ipc_futex); |
| 205 | callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2); |
212 | callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2); |
| 206 | 213 | ||
| 207 | if (callid == IPC_CALLRET_TEMPORARY) { |
214 | if (callid == IPC_CALLRET_TEMPORARY) { |
| - | 215 | if (!call) { |
|
| - | 216 | call = ipc_prepare_async(private, callback); |
|
| - | 217 | if (!call) |
|
| - | 218 | return; |
|
| - | 219 | } |
|
| 208 | IPC_SET_METHOD(call->u.msg.data, method); |
220 | IPC_SET_METHOD(call->u.msg.data, method); |
| 209 | IPC_SET_ARG1(call->u.msg.data, arg1); |
221 | IPC_SET_ARG1(call->u.msg.data, arg1); |
| 210 | IPC_SET_ARG2(call->u.msg.data, arg2); |
222 | IPC_SET_ARG2(call->u.msg.data, arg2); |
| 211 | } |
223 | } |
| 212 | ipc_finish_async(callid, phoneid, call, can_preempt); |
224 | ipc_finish_async(callid, phoneid, call, can_preempt); |
| Line 340... | Line 352... | ||
| 340 | free(call); |
352 | free(call); |
| 341 | return; |
353 | return; |
| 342 | } |
354 | } |
| 343 | } |
355 | } |
| 344 | futex_up(&ipc_futex); |
356 | futex_up(&ipc_futex); |
| 345 | printf("Received unidentified answer: %P!!!\n", callid); |
357 | /* We may get here after async_msg, which doesn't register any callback */ |
| 346 | } |
358 | } |
| 347 | 359 | ||
| 348 | 360 | ||
| 349 | /** One cycle of ipc wait for call call |
361 | /** One cycle of ipc wait for call call |
| 350 | * |
362 | * |