static void psp_free(void *data) { psp1_video_t *psp = (psp1_video_t*)data; if(!(psp) || !(psp->main_dList)) return; sceDisplayWaitVblankStart(); sceGuDisplay(GU_FALSE); sceGuTerm(); if (psp->main_dList) free(psp->main_dList); if (psp->frame_dList) free(psp->frame_dList); if (psp->frame_coords) free(TO_CACHED_PTR(psp->frame_coords)); if (psp->menu.frame_coords) free(TO_CACHED_PTR(psp->menu.frame_coords)); if (psp->menu.dList) free(psp->menu.dList); if (psp->menu.frame) free(psp->menu.frame); free(data); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT,0); }
/*------------------------------------------------------------------------------*/ void TranceAsyncOff( void ) { if ( IndexUseNow == -1 ){ return; } sceKernelDisableSubIntr( 30, IndexUseNow ); sceKernelReleaseSubIntrHandler( 30, IndexUseNow ); IndexUseNow = -1; }
void suspendUsage() { int counter; sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, vblank_counter, &counter); counter = 0; sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); int flag = sceKernelCpuSuspendIntr(); sceKernelDelayThread(300000); sceKernelCpuResumeIntr(flag); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); printf("Interrupts suspended: %d\n", counter); counter = 0; sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, vblank_counter, &counter); sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); sceKernelDelayThread(300000); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0); printf("Interrupts resumed: %d\n", counter); }
void checkDispatchInterrupt() { dispatchCheckpoint("Interrupts while dispatch disabled:"); sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, &vblankCallback, NULL); sceKernelEnableSubIntr(PSP_VBLANK_INT, 0); ++ignoreResched; int state = sceKernelSuspendDispatchThread(); int base = sceDisplayGetVcount(); int i, j; for (i = 0; i < 1000; ++i) { if (sceDisplayGetVcount() > base + 3) { break; } for (j = 0; j < 10000; ++j) continue; } dispatchCheckpoint("vblanks=%d", sceDisplayGetVcount() - base); sceKernelResumeDispatchThread(state); --ignoreResched; base = sceDisplayGetVcount(); for (i = 0; i < 1000; ++i) { if (sceDisplayGetVcount() > base + 3) { break; } for (j = 0; j < 10000; ++j) continue; } dispatchCheckpoint("vblanks=%d", sceDisplayGetVcount() - base); sceKernelDisableSubIntr(PSP_VBLANK_INT, 0); sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0); flushschedf(); }
extern "C" int main(int argc, char *argv[]) { int result; sceKernelRegisterSubIntrHandler(30, 1, (void *)&handler, (void *)0xDEADBEEF); checkpointNext("sceKernelEnableSubIntr:"); result = sceKernelEnableSubIntr(70, 1); checkpoint(" Invalid intr: %08x", result); result = sceKernelEnableSubIntr(30, 70); checkpoint(" Invalid subintr: %08x", result); result = sceKernelEnableSubIntr(30, 1); checkpoint(" Registered: %08x", result); result = sceKernelEnableSubIntr(30, 1); checkpoint(" Twice: %08x", result); result = sceKernelEnableSubIntr(30, 3); checkpoint(" Unregistered: %08x", result); sceKernelDisableSubIntr(30, 2); sceKernelDisableSubIntr(30, 1); checkpointNext("Interrupts run when enabled:"); checkpoint(" With handler first:"); result = sceKernelEnableSubIntr(30, 1); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 1); checkpoint(" With handler after:"); result = sceKernelEnableSubIntr(30, 2); sceKernelRegisterSubIntrHandler(30, 2, (void *)&handler, (void *)0xDEADBEEF); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 2); sceKernelReleaseSubIntrHandler(30, 2); checkpoint(" Without handler:"); result = sceKernelEnableSubIntr(30, 3); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 3); checkpoint(" Released while enabled:"); sceKernelRegisterSubIntrHandler(30, 4, (void *)&handler, (void *)0xDEADBEEF); result = sceKernelEnableSubIntr(30, 4); sceKernelReleaseSubIntrHandler(30, 4); sceKernelRegisterSubIntrHandler(30, 4, (void *)&handler, (void *)0xDEADBEEF); sceKernelDelayThread(17000); sceKernelDisableSubIntr(30, 4); sceKernelReleaseSubIntrHandler(30, 4); checkpointNext("sceKernelDisableSubIntr:"); result = sceKernelDisableSubIntr(70, 1); checkpoint(" Invalid intr: %08x", result); result = sceKernelDisableSubIntr(30, 70); checkpoint(" Invalid subintr: %08x", result); sceKernelEnableSubIntr(30, 1); result = sceKernelDisableSubIntr(30, 1); checkpoint(" Registered: %08x", result); result = sceKernelDisableSubIntr(30, 1); checkpoint(" Twice: %08x", result); result = sceKernelDisableSubIntr(30, 3); checkpoint(" Unregistered: %08x", result); sceKernelReleaseSubIntrHandler(30, 1); return 0; }