Beispiel #1
0
/* 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
}
Beispiel #2
0
///////////////////////////////////////////////////////////////////////[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);
}