/* Command 0x8000000a */ static void _request_call(SifRpcCallPkt_t *request, void *data) { SifRpcServerData_t *server = request->server; SifRpcDataQueue_t *base = server->base; data = data; if (base->start) base->end->link = server; else base->start = server; base->end = server; server->pkt_addr = request->pkt_addr; server->client = request->client; server->rpc_number = request->rpc_number; server->size = request->send_size; server->receive = request->receive; server->rsize = request->recv_size; server->rmode = request->rmode; server->rid = request->rec_id; /* XXX: Could be done easier without queue or in a thread? */ /* XXX: The following is done in interrupt context, should not be done here. */ server = SifGetNextRequest(base); if (server != NULL) { SifExecRequest(server); } #if 0 /* XXX: This code is in PS2SDK. */ if (base->thread_id < 0 || base->active == 0) return; iWakeupThread(base->thread_id); #endif }
///////////////////////////////////////////////////////////////////////[16] void SifRpcLoop(struct sifcmd_RPC_DATA_QUEUE *qd){ register struct sifcmd_RPC_SERVER_DATA *s; do{ if (s=SifGetNextRequest(qd)) SifExecRequest(s); else SleepThread(); } while (1); }