Esempio n. 1
0
// Con este ya va, pero estamos limitados 
// a cambiar solo entre 2 hilos, que son los que usa
// la abadia en Vigasoco
static int ms_handler(int ca)
{
	static int cambiar_a_main;

	if (_gCAMBIAR)
	{
		if (_gthread_async_id!=-1)
		{
			if (cambiar_a_main==1)
			{
				/* Estos 2 se pueden poner por
				 * seguridad para evitar que las llamadas
				 * RPC de por medio la lien */
				iSuspendThread(_gthread_async_id);
				iResumeThread(_gthread_main_id);

				// salir de los SleepThread de SDL_Delay
				iWakeupThread(_gthread_main_id);

				cambiar_a_main=0;

				iChangeThreadPriority(_gthread_async_id,65); 
				iChangeThreadPriority(_gthread_main_id,64); 
			}
			else
			{
				/* Estos 2 se pueden poner por
				 * seguridad para evitar que las llamadas
				 * RPC de por medio la lien  */
				iSuspendThread(_gthread_main_id);
				iResumeThread(_gthread_async_id);

				// salir de los SleepThread de SDL_Delay
				iWakeupThread(_gthread_async_id);

				cambiar_a_main=1;
				//cambiar_a_main++;

				iChangeThreadPriority(_gthread_main_id,65); 
				iChangeThreadPriority(_gthread_async_id,64); 
			}
			iRotateThreadReadyQueue(64);
		}
	}

	/* reset counter */
	T0_COUNT = 0;
	/* reset interrupt */
	T0_MODE |= (1 << 10);
	__asm__ volatile("sync.l; ei");

	return ca;
}
Esempio n. 2
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
}
Esempio n. 3
0
/* Command 0x8000000a */
static void _request_call(SifRpcCallPkt_t *request, void *data)
{
	SifRpcServerData_t *server = request->server;
	SifRpcDataQueue_t *base = server->base;

	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;

	if (base->thread_id < 0 || base->active == 0)
		return;

	iWakeupThread(base->thread_id);
}
Esempio n. 4
0
static void ioAlarmFunc(s32 id, u16 time, void *arg) {
        if (!gIOTerminate && !stopIOTimer) {
		iWakeupThread ( gDispatcherThreadID ); 
		iRotateThreadReadyQueue ( 30 ); 
		alarmID = iSetAlarm ( 625, &ioAlarmFunc, NULL ); 
	}
} 
Esempio n. 5
0
static void TxEndCallback(void *arg)
{
	PacketReqs.count -= ReceiveBuffer.result;

	if(NetmanTxWaitingThread >= 0)
	{
		iWakeupThread(NetmanTxWaitingThread);
		NetmanTxWaitingThread = -1;
	}
}
Esempio n. 6
0
void cmd8000000A_CALL(RPC_PACKET_CALL *packet, struct tag_rpc_common *common){
	struct sifcmd_RPC_DATA_QUEUE *qd;

	qd = packet->server->base;
	if (qd->start==0)	qd->start=packet->server;
	else			qd->end->link=packet->server;
	qd->end=packet->server;
	packet->server->pkt_addr=packet->packet.packet.paddr;
	packet->server->client=packet->packet.client;
	packet->server->fno=packet->packet.fno;
	packet->server->size=packet->size;
	packet->server->receive=packet->receive;
	packet->server->rsize=packet->rsize;
	packet->server->rmode=packet->rmode;
	if ((qd->key>=0) && (qd->active==0))
		iWakeupThread(qd->key);
}
Esempio n. 7
0
void cmd80000008_END(RPC_PACKET_END *packet, struct tag_rpc_common *common){
	if (packet->command==0x8000000A){
		if (packet->client->func)
			packet->client->func(packet->client->param);
	}else
	if (packet->command==0x80000009){
		packet->client->server=packet->server;
		packet->client->buff  =packet->buff;
		packet->client->cbuff =packet->cbuff;
	}

	if (packet->client->hdr.tid>=0)
		iWakeupThread(packet->client->hdr.tid);

	rpc_free_packet(packet->client->hdr.pkt_addr);
	packet->client->hdr.pkt_addr=0;
}
Esempio n. 8
0
static int ms_handler(int ca)
{
	int i;

	ticks++;

	for (i=0; i<nsleeping_threads; i++)
	{
		if (sleeping_threads[i].id >= 0)
		{
			iWakeupThread(sleeping_threads[i].id);
		}
	}

	/* reset counter */
	*T1_COUNT = 0;
	/* reset interrupt */
	*T1_MODE |= (1 << 10);
	__asm__ volatile("sync.l; ei");
	return 0;
}
Esempio n. 9
0
static int rmOnVSync(void) {
	iWakeupThread(guiThreadID);

	return 0;
}