Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1089 → Rev 1090

/kernel/trunk/generic/src/ipc/ipc.c
145,7 → 145,6
{
answerbox_t *callerbox = call->callerbox;
 
call->flags &= ~IPC_CALL_DISPATCHED;
call->flags |= IPC_CALL_ANSWERED;
 
spinlock_lock(&callerbox->lock);
169,6 → 168,23
_ipc_answer_free_call(call);
}
 
/** Simulate sending back a message
*
* Most errors are better handled by forming a normal backward
* message and sending it as a normal answer.
*/
void ipc_backsend_err(phone_t *phone, call_t *call, __native err)
{
call->data.phone = phone;
atomic_inc(&phone->active_calls);
if (phone->busy == IPC_BUSY_CONNECTED)
IPC_SET_RETVAL(call->data, EHANGUP);
else
IPC_SET_RETVAL(call->data, ENOENT);
 
_ipc_answer_free_call(call);
}
 
/* Unsafe unchecking ipc_call */
static void _ipc_call(phone_t *phone, answerbox_t *box, call_t *call)
{
200,16 → 216,14
spinlock_unlock(&phone->lock);
if (call->flags & IPC_CALL_FORWARDED) {
IPC_SET_RETVAL(call->data, EFORWARD);
} else { /* Simulate sending a message */
call->data.phone = phone;
atomic_inc(&phone->active_calls);
_ipc_answer_free_call(call);
} else { /* Simulate sending back a message */
if (phone->busy == IPC_BUSY_CONNECTED)
IPC_SET_RETVAL(call->data, EHANGUP);
ipc_backsend_err(phone, call, EHANGUP);
else
IPC_SET_RETVAL(call->data, ENOENT);
ipc_backsend_err(phone, call, ENOENT);
}
 
_ipc_answer_free_call(call);
return ENOENT;
}
_ipc_call(phone, box, call);
307,7 → 321,6
list_remove(&request->list);
/* Append request to dispatch queue */
list_append(&request->list, &box->dispatched_calls);
request->flags |= IPC_CALL_DISPATCHED;
} else {
printf("WARNING: Spurious IPC wakeup.\n");
spinlock_unlock(&box->lock);