예제 #1
0
파일: sysevent.c 프로젝트: esxgx/uofw
int sceKernelSysEventDispatch(int ev_type_mask, int ev_id, char* ev_name, void* param, int* result, int break_nonzero, SceSysEventHandler **break_handler)
{
    int oldGp = pspGetGp();
    int ret = 0;
    int oldIntr = suspendIntr();
    SceSysEventHandler *cur = g_sysEvHandlers;
    // C928
    while (cur != NULL)
    {
        if ((cur->type_mask & ev_type_mask) != 0)
        {
            // C984
            cur->busy = 1;
            resumeIntr(oldIntr);
            pspSetGp(cur->gp);
            ret = cur->handler(ev_id, ev_name, param, result);
            oldIntr = suspendIntr();
            cur->busy = 0;
            if (ret < 0 && break_nonzero != 0)
            {
                // C9D8
                if (break_handler != NULL)
                    *break_handler = cur;
                break;
            }
            ret = 0;
        }
        // C934
        cur = cur->next;
    }
    // C940
    resumeIntr(oldIntr);
    pspSetGp(oldGp);
    return ret;
}
예제 #2
0
파일: sysevent.c 프로젝트: joel16/utopia
//67b4
int sceKernelSysEventDispatch(int ev_type_mask, int ev_id, char *ev_name, void *param, int *result,
                              int break_nonzero, PspSysEventHandler *break_handler)
{
    int ret;
    SceSysEventHandler *handler;

//   fp = gp;
    int intr = sceKernelCpuSuspendIntr();

    for(handler = sys_event_handlers; handler; handler = handler->next)
    {
        if(handler->typemask & unk_a0)
        {
            //687c
            handler->busy = 1;

            sceKernelCpuResumeIntr(intr);

//       v0 = gp;
//       gp = s0->r28;
            ret = handler->handler(unk_a1, unk_a2, unk_a3, unk_t0);

            intr = sceKernelCpuSuspendIntr();

            handler->busy = 0;
            if((ret >> 31) & (0 < unk_t1))
            {
                //68d0
                if(unk_t2 != 0)
                {
                    unk_t2->unk_0 = s0;
                }

                break;
            }

            ret = 0;
        }
    }