/** ============================================================================ * @func LIST_SearchElement * * @desc This function searchs for a element in the List. * * @modif None. * ============================================================================ */ EXPORT_API DSP_STATUS LIST_SearchElement (IN List * list, IN Pvoid data, OUT ListElement ** elem, IN ListMatchFunc matchFunc) { DSP_STATUS status = DSP_SOK ; ListElement * temp = NULL ; ListElement * temp1 = NULL ; Bool found = FALSE ; DBC_Require (list != NULL) ; DBC_Require (elem != NULL) ; DBC_Require (matchFunc != NULL) ; if ((list == NULL) || (elem == NULL)) { status = DSP_EINVALIDARG ; SET_FAILURE_REASON ; } else { if (LIST_IsEmpty (list)) { status = DSP_EINVALIDARG ; SET_FAILURE_REASON ; } if (DSP_SUCCEEDED (status)) { status = LIST_First (list, &temp) ; if (DSP_SUCCEEDED (status)) { while ((found == FALSE) && (temp != NULL)) { if ((*matchFunc) (temp, data) == TRUE) { found = TRUE ; } else { temp1 = temp ; LIST_Next (list, temp1, &temp) ; } } if (found == TRUE) { *elem = temp ; } else { *elem = NULL ; status = DSP_ENOTFOUND ; SET_FAILURE_REASON ; } } else { SET_FAILURE_REASON ; } } } return status ; }
PUBLIC void Main() { if(!LoadRTL(0x40000000)) goto _Finish; //Alloc window window = XKY_WINDOW_Alloc(); if(!window) goto _Finish; //Set random seed SetSeed(XKY_RTC_Seconds() + XKY_TMR_GetTicks()); //Set exception handler for memory failures //XKY_EXCEPTION_SetHandler(0x0E, MtTestExceptionHandler); //Set-up stacks so thread finds it's parameters on it PAINT_PARAMETERS* p1 = (PAINT_PARAMETERS*)HEAP_Alloc(sizeof(PAINT_PARAMETERS)); p1->x = 0; p1->y = 0; p1->width = XKY_WINDOW_GetWidth(window)/2; p1->height = XKY_WINDOW_GetHeight(window)/2; p1->color = SRGB(255, 0, 0); PAINT_PARAMETERS* p2 = (PAINT_PARAMETERS*)HEAP_Alloc(sizeof(PAINT_PARAMETERS)); p2->x = 0; p2->y = XKY_WINDOW_GetHeight(window)/2; p2->width = XKY_WINDOW_GetWidth(window)/2; p2->height = XKY_WINDOW_GetHeight(window)/2; p2->color = SRGB(0, 255, 0); PAINT_PARAMETERS* p3 = (PAINT_PARAMETERS*)HEAP_Alloc(sizeof(PAINT_PARAMETERS)); p3->x = XKY_WINDOW_GetWidth(window)/2; p3->y = XKY_WINDOW_GetHeight(window)/2; p3->width = XKY_WINDOW_GetWidth(window)/2; p3->height = XKY_WINDOW_GetHeight(window)/2; p3->color = SRGB(0, 0, 255); PAINT_PARAMETERS* p4 = (PAINT_PARAMETERS*)HEAP_Alloc(sizeof(PAINT_PARAMETERS)); p4->x = XKY_WINDOW_GetWidth(window)/2; p4->y = 0; p4->width = XKY_WINDOW_GetWidth(window)/2; p4->height = XKY_WINDOW_GetHeight(window)/2; p4->color = SRGB(255, 255, 255); //Create threads ThreadInit(); HANDLE t1 = CreateThread(PaintThread, p1); HANDLE t2 = CreateThread(PaintThread, p2); HANDLE t3 = CreateThread(PaintThread, p3); HANDLE t4 = CreateThread(PaintThread, p4); //Init scheduler iterator scheduler = LIST_First(&threads); //Start scheduler //XKY_CPU_RegisterCallback(XKY_ADDRESS_SPACE_GetCurrent(), MtCpuTimerCallbackFCFS); XKY_CPU_RegisterCallback(XKY_ADDRESS_SPACE_GetCurrent(), MtCpuTimerCallbackRoundRobin); while(!ThreadHasFinished(t1) || !ThreadHasFinished(t2) || !ThreadHasFinished(t3) || !ThreadHasFinished(t4)); //All threads finished dword width = XKY_WINDOW_GetWidth(window); dword height = XKY_WINDOW_GetHeight(window); for(dword x = 0; x < width; x++) { for(dword y = 0; y < height; y++) { XKY_WINDOW_SetPixel(window, x, y, TRGB(0, 0, 0)); } } XKY_WINDOW_PrintText(window, 200, 200, SRGB(255, 0, 255), &DONE); _Finish: XKY_OS_Finish(); }