/////////////////// // Initialize the standard Auxiliary Library int InitializeAuxLib(const std::string& config, int bpp, int vidflags) { // We have already loaded all options from the config file at this time. #ifdef linux //XInitThreads(); // We should call this before any SDL video stuff and window creation #endif ConfigFile=config; if(getenv("SDL_VIDEODRIVER")) notes << "SDL_VIDEODRIVER=" << getenv("SDL_VIDEODRIVER") << endl; // Solves problem with FPS in fullscreen #ifdef WIN32 if(!getenv("SDL_VIDEODRIVER")) { notes << "SDL_VIDEODRIVER not set, setting to directx" << endl; putenv((char*)"SDL_VIDEODRIVER=directx"); } #endif // Initialize SDL int SDLflags = SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE; if(!bDedicated) { SDLflags |= SDL_INIT_VIDEO; } else { hints << "DEDICATED MODE" << endl; bDisableSound = true; bJoystickSupport = false; } if(SDL_Init(SDLflags) == -1) { errors << "Failed to initialize the SDL system!\nErrorMsg: " << std::string(SDL_GetError()) << endl; #ifdef WIN32 // retry it with any available video driver unsetenv("SDL_VIDEODRIVER"); if(SDL_Init(SDLflags) != -1) hints << "... but we have success with the any driver" << endl; // retry with windib else if(putenv((char*)"SDL_VIDEODRIVER=windib") == 0 && SDL_Init(SDLflags) != -1) hints << "... but we have success with the windib driver" << endl; else #endif return false; } #ifndef DISABLE_JOYSTICK if(bJoystickSupport) { if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0) { warnings << "WARNING: couldn't init joystick subystem: " << SDL_GetError() << endl; bJoystickSupport = false; } } #endif if(!bDedicated && !SetVideoMode()) return false; // Enable the system events SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); SDL_EventState(SDL_VIDEOEXPOSE, SDL_ENABLE); // Enable unicode and key repeat SDL_EnableUNICODE(1); SDL_EnableKeyRepeat(200,20); /* Note about the different sound vars: bDisableSound - if the sound system+driver is disabled permanentely tLXOptions->bSoundOn - if the sound is enabled temporarely (false -> volume=0, nothing else) I.e., even with tLXOptions->bSoundOn=false (Audio.Enabled=false in config), the sound system will be loaded. To start OLX without the sound system, use the -nosound parameter. The console variable Audio.Enabled links to tLXOptions->bSoundOn. The console command 'sound' also wraps around tLXOptions->bSoundOn. tLXOptions->iSoundVolume will never be touched by OLX itself, only the user can modify it. tLXOptions->bSoundOn will also not be touched by OLX itself, only user actions can modify it. (Both points were somewhat broken earlier and kind of annoying.) */ if( !bDisableSound ) { // Initialize sound //if(!InitSoundSystem(22050, 1, 512)) { if(!InitSoundSystem(44100, 1, 512)) { warnings << "Failed the initialize the sound system" << endl; bDisableSound = true; } } if(bDisableSound) { notes << "soundsystem completly disabled" << endl; // NOTE: Don't change tLXOptions->bSoundOn here! } if( tLXOptions->bSoundOn ) { StartSoundSystem(); } else StopSoundSystem(); // Give a seed to the random number generator srand((unsigned int)time(NULL)); if(!bDedicated) { SmartPointer<SDL_Surface> bmpIcon = LoadGameImage("data/icon.png", true); if(bmpIcon.get()) SDL_WM_SetIcon(bmpIcon.get(), NULL); } InitEventQueue(); // Initialize the keyboard & mouse InitEventSystem(); // Initialize timers InitializeTimers(); #ifdef DEBUG // Cache InitCacheDebug(); #endif return true; }
static void RunFIFOTest(SDL_bool lock_free) { SDL_EventQueue queue; WriterData writerData[NUM_WRITERS]; ReaderData readerData[NUM_READERS]; Uint32 start, end; int i, j; int grand_total; printf("\nFIFO test---------------------------------------\n\n"); printf("Mode: %s\n", lock_free ? "LockFree" : "Mutex"); readersDone = SDL_CreateSemaphore(0); writersDone = SDL_CreateSemaphore(0); SDL_memset(&queue, 0xff, sizeof(queue)); InitEventQueue(&queue); if (!lock_free) { queue.mutex = SDL_CreateMutex(); } start = SDL_GetTicks(); #ifdef TEST_SPINLOCK_FIFO /* Start a monitoring thread */ if (lock_free) { SDL_CreateThread(FIFO_Watcher, "FIFOWatcher", &queue); } #endif /* Start the readers first */ printf("Starting %d readers\n", NUM_READERS); SDL_zero(readerData); SDL_AtomicSet(&readersRunning, NUM_READERS); for (i = 0; i < NUM_READERS; ++i) { char name[64]; SDL_snprintf(name, sizeof (name), "FIFOReader%d", i); readerData[i].queue = &queue; readerData[i].lock_free = lock_free; SDL_CreateThread(FIFO_Reader, name, &readerData[i]); } /* Start up the writers */ printf("Starting %d writers\n", NUM_WRITERS); SDL_zero(writerData); SDL_AtomicSet(&writersRunning, NUM_WRITERS); for (i = 0; i < NUM_WRITERS; ++i) { char name[64]; SDL_snprintf(name, sizeof (name), "FIFOWriter%d", i); writerData[i].queue = &queue; writerData[i].index = i; writerData[i].lock_free = lock_free; SDL_CreateThread(FIFO_Writer, name, &writerData[i]); } /* Wait for the writers */ while (SDL_AtomicGet(&writersRunning) > 0) { SDL_SemWait(writersDone); } /* Shut down the queue so readers exit */ queue.active = SDL_FALSE; /* Wait for the readers */ while (SDL_AtomicGet(&readersRunning) > 0) { SDL_SemWait(readersDone); } end = SDL_GetTicks(); SDL_DestroySemaphore(readersDone); SDL_DestroySemaphore(writersDone); if (!lock_free) { SDL_DestroyMutex(queue.mutex); } printf("Finished in %f sec\n", (end - start) / 1000.f); printf("\n"); for (i = 0; i < NUM_WRITERS; ++i) { printf("Writer %d wrote %d events, had %d waits\n", i, EVENTS_PER_WRITER, writerData[i].waits); } printf("Writers wrote %d total events\n", NUM_WRITERS*EVENTS_PER_WRITER); /* Print a breakdown of which readers read messages from which writer */ printf("\n"); grand_total = 0; for (i = 0; i < NUM_READERS; ++i) { int total = 0; for (j = 0; j < NUM_WRITERS; ++j) { total += readerData[i].counters[j]; } grand_total += total; printf("Reader %d read %d events, had %d waits\n", i, total, readerData[i].waits); printf(" { "); for (j = 0; j < NUM_WRITERS; ++j) { if (j > 0) { printf(", "); } printf("%d", readerData[i].counters[j]); } printf(" }\n"); } printf("Readers read %d total events\n", grand_total); }