/* * ======== Hwi_Instance_init ======== */ Int Hwi_Instance_init(Hwi_Object *hwi, Int intNum, Hwi_FuncPtr fxn, const Hwi_Params *params, Error_Block *eb) { Int status; if (Hwi_module->dispatchTable[intNum] != NULL) { Error_raise(eb, Hwi_E_alreadyDefined, intNum, 0); return (1); } Hwi_module->dispatchTable[intNum] = hwi; Hwi_reconfig(hwi, fxn, params); #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS if (Hwi_hooks.length > 0) { /* Allocate environment space for each hook instance. */ hwi->hookEnv = Memory_calloc(Hwi_Object_heap(), Hwi_hooks.length * sizeof(Ptr), 0, eb); if (hwi->hookEnv == NULL) { return (1); } } #endif hwi->irp = 0; status = postInit(hwi, eb); if (Error_check(eb)) { return (2 + status); } return (0); }
/* * ======== Hwi_Instance_finalize ======== * Here on Hwi_delete() or failed Hwi_create(). */ Void Hwi_Instance_finalize(Hwi_Object *hwi, Int status) { Int i, cnt; UInt intNum; if (status == 1) { /* failed early in Hwi_Instance_init() */ return; } for (intNum = 0; intNum < Hwi_NUM_INTERRUPTS; intNum++) { if (Hwi_module->dispatchTable[intNum] == hwi) { break; } } if (intNum == Hwi_NUM_INTERRUPTS) { Error_raise(NULL, Hwi_E_handleNotFound, hwi, 0); return; /* never reached, but keep Coverity happy */ } Hwi_disableInterrupt(intNum); Hwi_module->dispatchTable[intNum] = NULL; Hwi_plug(intNum, Hwi_unPluggedInterrupt); if (status == 2) { /* failed mid-way into Hwi_Instance_init() */ return; } #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS if (Hwi_hooks.length > 0) { if (status == 0) { cnt = Hwi_hooks.length; } else { cnt = status - 3; /* failed within hook init */ } for (i = 0; i < cnt; i++) { if (Hwi_hooks.elem[i].deleteFxn != NULL) { Hwi_hooks.elem[i].deleteFxn((IHwi_Handle)hwi); } } Memory_free(Hwi_Object_heap(), hwi->hookEnv, Hwi_hooks.length * sizeof(Ptr)); } #endif }
/* * ======== Hwi_Instance_finalize ======== */ Void Hwi_Instance_finalize(Hwi_Object *hwi, Int status) { #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS Int i, cnt; #endif UInt intNum; for (intNum = 0; intNum < Hwi_NUM_INTERRUPTS; intNum++) { if (Hwi_module->dispatchTable[intNum] == hwi) { break; } } if (intNum == Hwi_NUM_INTERRUPTS) { Error_raise(NULL, Hwi_E_handleNotFound, hwi, 0); return; } Hwi_disableInterrupt(intNum); Hwi_module->dispatchTable[intNum] = ti_sysbios_family_arm_gic_Hwi_Module_State_nonPluggedHwi(); if (status == 1) { /* failed Hwi_create */ return; } #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS if (Hwi_hooks.length > 0) { if (status == 0) { cnt = Hwi_hooks.length; } else { cnt = status - 2; } for (i = 0; i < cnt; i++) { if (Hwi_hooks.elem[i].deleteFxn != NULL) { Hwi_hooks.elem[i].deleteFxn((IHwi_Handle)hwi); } } Memory_free(Hwi_Object_heap(), hwi->hookEnv, Hwi_hooks.length * sizeof(Ptr)); } #endif }
/* * ======== Hwi_Instance_finalize ======== * Here on Hwi_delete() or failed Hwi_create(). */ Void Hwi_Instance_finalize(Hwi_Object *hwi, Int status) { Int i, cnt; UInt intNum; for (intNum = 0; intNum < Hwi_NUM_INTERRUPTS; intNum++) { if (Hwi_module->dispatchTable[intNum] == hwi) { break; } } /* Kill the interrupt */ Hwi_disableInterrupt(intNum); /* null out the dispatch table entry */ Hwi_module->dispatchTable[intNum] = NULL; if (status == 1) { /* failed Hwi_create */ return; } #ifndef ti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS if (Hwi_hooks.length > 0) { if (status == 0) { cnt = Hwi_hooks.length; } else { cnt = status - 2; } for (i = 0; i < cnt; i++) { if (Hwi_hooks.elem[i].deleteFxn != NULL) { Hwi_hooks.elem[i].deleteFxn((IHwi_Handle)hwi); } } Memory_free(Hwi_Object_heap(), hwi->hookEnv, Hwi_hooks.length * sizeof(Ptr)); } #endif }