Rev 1463 | Rev 1503 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1463 | Rev 1489 | ||
|---|---|---|---|
| Line 113... | Line 113... | ||
| 113 | static ipc_callid_t _ipc_call_async(int phoneid, ipc_call_t *data) |
113 | static ipc_callid_t _ipc_call_async(int phoneid, ipc_call_t *data) |
| 114 | { |
114 | { |
| 115 | return __SYSCALL2(SYS_IPC_CALL_ASYNC, phoneid, (sysarg_t)data); |
115 | return __SYSCALL2(SYS_IPC_CALL_ASYNC, phoneid, (sysarg_t)data); |
| 116 | } |
116 | } |
| 117 | 117 | ||
| 118 | /** Send asynchronous message |
118 | /** Prolog to ipc_async_send functions */ |
| 119 | * |
- | |
| 120 | * - if fatal error, call callback handler with proper error code |
- | |
| 121 | * - if message cannot be temporarily sent, add to queue |
- | |
| 122 | */ |
- | |
| 123 | void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
- | |
| 124 | ipcarg_t arg2, void *private, |
- | |
| 125 | ipc_async_callback_t callback) |
119 | static inline async_call_t *ipc_prepare_async(void *private, ipc_async_callback_t callback) |
| 126 | { |
120 | { |
| 127 | async_call_t *call; |
121 | async_call_t *call; |
| 128 | ipc_callid_t callid; |
- | |
| 129 | 122 | ||
| 130 | call = malloc(sizeof(*call)); |
123 | call = malloc(sizeof(*call)); |
| 131 | if (!call) { |
124 | if (!call) { |
| 132 | if (callback) |
125 | if (callback) |
| 133 | callback(private, ENOMEM, NULL); |
126 | callback(private, ENOMEM, NULL); |
| 134 | return; |
127 | return NULL; |
| 135 | } |
128 | } |
| 136 | - | ||
| 137 | call->callback = callback; |
129 | call->callback = callback; |
| 138 | call->private = private; |
130 | call->private = private; |
| 139 | 131 | ||
| 140 | /* We need to make sure that we get callid before |
132 | return call; |
| - | 133 | } |
|
| - | 134 | ||
| 141 | * another thread accesses the queue again */ |
135 | /** Epilogue of ipc_async_send functions */ |
| 142 | futex_down(&ipc_futex); |
- | |
| 143 | callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2); |
136 | static inline void ipc_finish_async(ipc_callid_t callid, int phoneid, async_call_t *call) |
| - | 137 | { |
|
| 144 | if (callid == IPC_CALLRET_FATAL) { |
138 | if (callid == IPC_CALLRET_FATAL) { |
| 145 | futex_up(&ipc_futex); |
139 | futex_up(&ipc_futex); |
| 146 | /* Call asynchronous handler with error code */ |
140 | /* Call asynchronous handler with error code */ |
| 147 | if (callback) |
141 | if (call->callback) |
| 148 | callback(private, ENOENT, NULL); |
142 | call->callback(call->private, ENOENT, NULL); |
| 149 | free(call); |
143 | free(call); |
| 150 | return; |
144 | return; |
| 151 | } |
145 | } |
| 152 | 146 | ||
| 153 | if (callid == IPC_CALLRET_TEMPORARY) { |
147 | if (callid == IPC_CALLRET_TEMPORARY) { |
| 154 | futex_up(&ipc_futex); |
148 | futex_up(&ipc_futex); |
| 155 | 149 | ||
| 156 | call->u.msg.phoneid = phoneid; |
150 | call->u.msg.phoneid = phoneid; |
| 157 | IPC_SET_METHOD(call->u.msg.data, method); |
- | |
| 158 | IPC_SET_ARG1(call->u.msg.data, arg1); |
- | |
| 159 | IPC_SET_ARG2(call->u.msg.data, arg2); |
- | |
| 160 | 151 | ||
| 161 | call->ptid = psthread_get_id(); |
152 | call->ptid = psthread_get_id(); |
| 162 | futex_down(&async_futex); |
153 | futex_down(&async_futex); |
| 163 | list_append(&call->list, &queued_calls); |
154 | list_append(&call->list, &queued_calls); |
| 164 | 155 | ||
| Line 168... | Line 159... | ||
| 168 | } |
159 | } |
| 169 | call->u.callid = callid; |
160 | call->u.callid = callid; |
| 170 | /* Add call to list of dispatched calls */ |
161 | /* Add call to list of dispatched calls */ |
| 171 | list_append(&call->list, &dispatched_calls); |
162 | list_append(&call->list, &dispatched_calls); |
| 172 | futex_up(&ipc_futex); |
163 | futex_up(&ipc_futex); |
| - | 164 | ||
| - | 165 | } |
|
| - | 166 | ||
| - | 167 | /** Send asynchronous message |
|
| - | 168 | * |
|
| - | 169 | * - if fatal error, call callback handler with proper error code |
|
| - | 170 | * - if message cannot be temporarily sent, add to queue |
|
| - | 171 | */ |
|
| - | 172 | void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
|
| - | 173 | ipcarg_t arg2, void *private, |
|
| - | 174 | ipc_async_callback_t callback) |
|
| - | 175 | { |
|
| - | 176 | async_call_t *call; |
|
| - | 177 | ipc_callid_t callid; |
|
| - | 178 | ||
| - | 179 | call = ipc_prepare_async(private, callback); |
|
| - | 180 | if (!call) |
|
| - | 181 | return; |
|
| - | 182 | ||
| - | 183 | /* We need to make sure that we get callid before |
|
| - | 184 | * another thread accesses the queue again */ |
|
| - | 185 | futex_down(&ipc_futex); |
|
| - | 186 | callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2); |
|
| - | 187 | ||
| - | 188 | if (callid == IPC_CALLRET_TEMPORARY) { |
|
| - | 189 | IPC_SET_METHOD(call->u.msg.data, method); |
|
| - | 190 | IPC_SET_ARG1(call->u.msg.data, arg1); |
|
| - | 191 | IPC_SET_ARG2(call->u.msg.data, arg2); |
|
| - | 192 | } |
|
| - | 193 | ipc_finish_async(callid, phoneid, call); |
|
| - | 194 | } |
|
| - | 195 | ||
| - | 196 | /** Send asynchronous message |
|
| - | 197 | * |
|
| - | 198 | * - if fatal error, call callback handler with proper error code |
|
| - | 199 | * - if message cannot be temporarily sent, add to queue |
|
| - | 200 | */ |
|
| - | 201 | void ipc_call_async_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
|
| - | 202 | ipcarg_t arg2, ipcarg_t arg3, void *private, |
|
| - | 203 | ipc_async_callback_t callback) |
|
| - | 204 | { |
|
| - | 205 | async_call_t *call; |
|
| - | 206 | ipc_callid_t callid; |
|
| - | 207 | ||
| - | 208 | call = ipc_prepare_async(private, callback); |
|
| - | 209 | if (!call) |
|
| - | 210 | return; |
|
| - | 211 | ||
| - | 212 | IPC_SET_METHOD(call->u.msg.data, method); |
|
| - | 213 | IPC_SET_ARG1(call->u.msg.data, arg1); |
|
| - | 214 | IPC_SET_ARG2(call->u.msg.data, arg2); |
|
| - | 215 | IPC_SET_ARG3(call->u.msg.data, arg3); |
|
| - | 216 | /* We need to make sure that we get callid before |
|
| - | 217 | * another thread accesses the queue again */ |
|
| - | 218 | futex_down(&ipc_futex); |
|
| - | 219 | callid = _ipc_call_async(phoneid, &call->u.msg.data); |
|
| - | 220 | ||
| - | 221 | ipc_finish_async(callid, phoneid, call); |
|
| 173 | } |
222 | } |
| 174 | 223 | ||
| 175 | 224 | ||
| 176 | /** Send a fast answer to a received call. |
225 | /** Send a fast answer to a received call. |
| 177 | * |
226 | * |