// 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; }
/* 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 }
/* 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); }
static void ioAlarmFunc(s32 id, u16 time, void *arg) { if (!gIOTerminate && !stopIOTimer) { iWakeupThread ( gDispatcherThreadID ); iRotateThreadReadyQueue ( 30 ); alarmID = iSetAlarm ( 625, &ioAlarmFunc, NULL ); } }
static void TxEndCallback(void *arg) { PacketReqs.count -= ReceiveBuffer.result; if(NetmanTxWaitingThread >= 0) { iWakeupThread(NetmanTxWaitingThread); NetmanTxWaitingThread = -1; } }
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); }
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; }
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; }
static int rmOnVSync(void) { iWakeupThread(guiThreadID); return 0; }