Subversion Repositories HelenOS-historic

Rev

Rev 1392 | Rev 1463 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1392 Rev 1443
Line 118... Line 118...
118
    async_call_t *call;
118
    async_call_t *call;
119
    ipc_callid_t callid;
119
    ipc_callid_t callid;
120
 
120
 
121
    call = malloc(sizeof(*call));
121
    call = malloc(sizeof(*call));
122
    if (!call) {
122
    if (!call) {
-
 
123
        if (callback)
123
        callback(private, ENOMEM, NULL);
124
            callback(private, ENOMEM, NULL);
124
        return;
125
        return;
125
    }
126
    }
126
       
127
       
127
    callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2);
128
    callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2);
128
    if (callid == IPC_CALLRET_FATAL) {
129
    if (callid == IPC_CALLRET_FATAL) {
129
        /* Call asynchronous handler with error code */
130
        /* Call asynchronous handler with error code */
-
 
131
        if (callback)
130
        callback(private, ENOENT, NULL);
132
            callback(private, ENOENT, NULL);
131
        free(call);
133
        free(call);
132
        return;
134
        return;
133
    }
135
    }
134
 
136
 
135
    call->callback = callback;
137
    call->callback = callback;
Line 203... Line 205...
203
            break;
205
            break;
204
        list_remove(&call->list);
206
        list_remove(&call->list);
205
 
207
 
206
        if (callid == IPC_CALLRET_FATAL) {
208
        if (callid == IPC_CALLRET_FATAL) {
207
            futex_up(&ipc_futex);
209
            futex_up(&ipc_futex);
-
 
210
            if (call->callback)
208
            call->callback(call->private, ENOENT, NULL);
211
                call->callback(call->private, ENOENT, NULL);
209
            free(call);
212
            free(call);
210
            futex_down(&ipc_futex);
213
            futex_down(&ipc_futex);
211
        } else {
214
        } else {
212
            call->u.callid = callid;
215
            call->u.callid = callid;
213
            list_append(&call->list, &dispatched_calls);
216
            list_append(&call->list, &dispatched_calls);
Line 234... Line 237...
234
         item = item->next) {
237
         item = item->next) {
235
        call = list_get_instance(item, async_call_t, list);
238
        call = list_get_instance(item, async_call_t, list);
236
        if (call->u.callid == callid) {
239
        if (call->u.callid == callid) {
237
            list_remove(&call->list);
240
            list_remove(&call->list);
238
            futex_up(&ipc_futex);
241
            futex_up(&ipc_futex);
-
 
242
            if (call->callback)
239
            call->callback(call->private,
243
                call->callback(call->private,
240
                       IPC_GET_RETVAL(*data),
244
                           IPC_GET_RETVAL(*data),
241
                       data);
245
                           data);
-
 
246
            free(call);
242
            return;
247
            return;
243
        }
248
        }
244
    }
249
    }
245
    futex_up(&ipc_futex);
250
    futex_up(&ipc_futex);
246
    printf("Received unidentified answer: %P!!!\n", callid);
251
    printf("Received unidentified answer: %P!!!\n", callid);