void GuiElement::LockElement() { // LWP_MutexLock(mutex); for (;;) // loop while element is locked by self { LWP_MutexLock(_lock_mutex); if (_lock_thread == LWP_THREAD_NULL) // element is not locked { _lock_thread = LWP_GetSelf(); // mark as locked _lock_count = 1; // set count of lock to 1 LWP_MutexUnlock(_lock_mutex); return; } else if (_lock_thread == LWP_GetSelf()) // thread is locked by my self { _lock_count++; // inc count of locks; LWP_MutexUnlock(_lock_mutex); return; } else // otherwise the element is locked by an other thread { if (_lock_queue == LWP_TQUEUE_NULL) // no queue - meens it is the first access to the locked element LWP_InitQueue(&_lock_queue); // init queue LWP_MutexUnlock(_lock_mutex); LWP_ThreadSleep(_lock_queue); // and sleep // try lock again; } } }
void LWP_SetThreadPriority(lwp_t thethread,u32 prio) { lwp_cntrl *lwp_thread; if(thethread==LWP_THREAD_NULL) thethread = LWP_GetSelf(); lwp_thread = __lwp_cntrl_open(thethread); if(!lwp_thread) return; __lwp_thread_changepriority(lwp_thread,__lwp_priotocore(prio),TRUE); __lwp_thread_dispatchenable(); }
void GuiElement::UnlockElement() { // LWP_MutexUnlock(mutex); LWP_MutexLock(_lock_mutex); // only the thread was locked this element, can call unlock if (_lock_thread == LWP_GetSelf()) // but we check it here safe is safe { if (--_lock_count == 0) // dec count of locks and check if it last lock; { _lock_thread = LWP_THREAD_NULL; // mark as unlocked if (_lock_queue != LWP_TQUEUE_NULL) // has a queue { LWP_CloseQueue(_lock_queue); // close the queue and wake all waited threads _lock_queue = LWP_TQUEUE_NULL; } } } LWP_MutexUnlock(_lock_mutex); }
Uint32 SDL_ThreadID(void) { return (Uint32) LWP_GetSelf(); }
int main(void) { int ret; void *frame_buffer = NULL; GXRModeObj *rmode = NULL; /* The game's boot loader is statically loaded at 0x81200000, so we'd better * not start mallocing there! */ SYS_SetArena1Hi((void *)0x81200000); /* initialise all subsystems */ if (!Event_Init(&main_event_fat_loaded)) goto exit_error; if (!Apploader_Init()) goto exit_error; if (!Module_Init()) goto exit_error; if (!Search_Init()) goto exit_error; /* main thread is UI, so set thread prior to UI */ LWP_SetThreadPriority(LWP_GetSelf(), THREAD_PRIO_UI); /* configure the video */ VIDEO_Init(); rmode = VIDEO_GetPreferredMode(NULL); frame_buffer = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); if (!frame_buffer) goto exit_error; console_init( frame_buffer, 20, 20, rmode->fbWidth, rmode->xfbHeight, rmode->fbWidth * VI_DISPLAY_PIX_SZ); /* spawn lots of worker threads to do stuff */ if (!Apploader_RunBackground()) goto exit_error; if (!Module_RunBackground()) goto exit_error; if (!Search_RunBackground()) goto exit_error; VIDEO_Configure(rmode); VIDEO_SetNextFramebuffer(frame_buffer); VIDEO_SetBlack(false); VIDEO_Flush(); VIDEO_WaitVSync(); if (rmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); /* display the welcome message */ printf("\x1b[2;0H"); printf("BrainSlug Wii v%x.%02x.%04x" #ifndef NDEBUG " DEBUG build" #endif "\n", BSLUG_VERSION_MAJOR(BSLUG_LOADER_VERSION), BSLUG_VERSION_MINOR(BSLUG_LOADER_VERSION), BSLUG_VERSION_REVISION(BSLUG_LOADER_VERSION)); printf(" by Chadderz\n\n"); if (!__io_wiisd.startup() || !__io_wiisd.isInserted()) { printf("Please insert an SD card.\n\n"); do { __io_wiisd.shutdown(); } while (!__io_wiisd.startup() || !__io_wiisd.isInserted()); } __io_wiisd.shutdown(); if (!fatMountSimple("sd", &__io_wiisd)) { fprintf(stderr, "Could not mount SD card.\n"); goto exit_error; } Event_Trigger(&main_event_fat_loaded); printf("Waiting for game disk...\n"); Event_Wait(&apploader_event_disk_id); printf("Game ID: %.4s\n", os0->disc.gamename); printf("Loading modules...\n"); Event_Wait(&module_event_list_loaded); if (module_list_count == 0) { printf("No valid modules found!\n"); } else { size_t module; printf( "%u module%s found.\n", module_list_count, module_list_count > 1 ? "s" : ""); for (module = 0; module < module_list_count; module++) { printf( "\t%s %s by %s (", module_list[module]->name, module_list[module]->version, module_list[module]->author); Main_PrintSize(module_list[module]->size); puts(")."); } Main_PrintSize(module_list_size); puts(" total."); } Event_Wait(&apploader_event_complete); Event_Wait(&module_event_complete); fatUnmount("sd"); __io_wiisd.shutdown(); if (module_has_error) { printf("\nPress RESET to exit.\n"); goto exit_error; } if (apploader_game_entry_fn == NULL) { fprintf(stderr, "Error... entry point is NULL.\n"); } else { if (module_has_info || search_has_info) { printf("\nPress RESET to launch game.\n"); while (!SYS_ResetButtonDown()) VIDEO_WaitVSync(); while (SYS_ResetButtonDown()) VIDEO_WaitVSync(); } SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); apploader_game_entry_fn(); } ret = 0; goto exit; exit_error: ret = -1; exit: while (!SYS_ResetButtonDown()) VIDEO_WaitVSync(); while (SYS_ResetButtonDown()) VIDEO_WaitVSync(); VIDEO_SetBlack(true); VIDEO_Flush(); VIDEO_WaitVSync(); free(frame_buffer); exit(ret); return ret; }