static void ioAlarmFunc(s32 id, u16 time, void *arg) { if (!gIOTerminate && !stopIOTimer) { iWakeupThread ( gDispatcherThreadID ); iRotateThreadReadyQueue ( 30 ); alarmID = iSetAlarm ( 625, &ioAlarmFunc, NULL ); } }
// 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; }