void ovrJobManagerImpl::Shutdown() { Exiting = true; // allow all threads to complete their current job // waiting threads must timeout waiting for NewJobSignal while( Threads.GetSizeI() > 0 ) { NewJobSignal->Raise(); // raise signal to release any waiting thread // loop through threads until we find one that's seen the Exiting flag and detatched int threadIndex = 0; for ( ; ; ) { if ( Threads[threadIndex]->GetJni() == nullptr ) { LOG( "Exited thread '%s'", Threads[threadIndex]->GetThreadName() ); ovrJobThread::Destroy( Threads[threadIndex] ); Threads.RemoveAtUnordered( threadIndex ); break; } threadIndex++; if ( threadIndex >= Threads.GetSizeI() ) { threadIndex = 0; } } } ovrSignal::Destroy( NewJobSignal ); Initialized = false; }
void GetGraphicsCardList(OVR::Array< OVR::String > &gpus) { gpus.Clear(); char info[256] = { 0 }; FILE *file = popen("/usr/bin/lspci", "r"); if (file) { int status = 0; while (status >= 0) { status = fscanf(file, "%*[^\n]\n"); // Read up till the end of the current line, leaving the file pointer at the beginning of the next line (skipping any leading whitespace). OVR_UNUSED(status); // Prevent GCC compiler warning: "ignoring return value of ‘int fscanf(FILE*, const char*, ...)" status = fscanf(file, "%*[^ ] VGA compatible controller: %255[^\n]", info); if (status == 1) { gpus.PushBack(String(info)); } } pclose(file); } if (gpus.GetSizeI() <= 0) { gpus.PushBack(String("No video card details found.")); } }
//============================== // BitmapFontLocal::WordWrapText void BitmapFontLocal::WordWrapText( String & inOutText, const float widthMeters, OVR::Array< OVR::String > wholeStrsList, const float fontScale ) const { float const xScale = FontInfo.ScaleFactor * fontScale; const int32_t totalLength = inOutText.GetLengthI(); int32_t lastWhitespaceIndex = -1; double lineWidthAtLastWhitespace = 0.0f; double lineWidth = 0.0f; int dontSplitUntilIdx = -1; for ( int32_t pos = 0; pos < totalLength; ++pos ) { uint32_t charCode = inOutText.GetCharAt( pos ); // Replace any existing character escapes with space as we recompute where to insert line breaks if ( charCode == '\r' || charCode == '\n' || charCode == '\t' ) { inOutText.Remove( pos ); inOutText.InsertCharAt( ' ', pos ); charCode = ' '; } FontGlyphType const & g = GlyphForCharCode( charCode ); lineWidth += g.AdvanceX * xScale; for ( int i = 0; i < wholeStrsList.GetSizeI(); ++i ) { int curWholeStrLen = wholeStrsList[i].GetLengthI(); int endPos = pos + curWholeStrLen; if ( endPos < totalLength ) { String subInStr = inOutText.Substring( pos, endPos ); if ( subInStr == wholeStrsList[i] ) { dontSplitUntilIdx = Alg::Max(dontSplitUntilIdx, endPos); } } } if ( pos >= dontSplitUntilIdx ) { if ( charCode == ' ' ) { lastWhitespaceIndex = pos; lineWidthAtLastWhitespace = lineWidth; } // always check the line width and as soon as we exceed it, wrap the text at // the last whitespace. This ensure's the text always fits within the width. if ( lineWidth >= widthMeters && lastWhitespaceIndex >= 0 ) { dontSplitUntilIdx = -1; inOutText.Remove( lastWhitespaceIndex ); inOutText.InsertCharAt( '\n', lastWhitespaceIndex ); // subtract the width after the last whitespace so that we don't lose any // of the accumulated width since then. lineWidth -= lineWidthAtLastWhitespace; } } } }
// Updates the in-memory data and synchronously writes it to storage. void ovr_SetLocalPreferenceValueForKey( const char * keyName, const char * keyValue ) { LOG( "Set( %s, %s )", keyName, keyValue ); int i = 0; for ( ; i < LocalPreferences.GetSizeI() ; i++ ) { if ( !strcmp( keyName, LocalPreferences[i].Key.ToCStr() ) ) { LocalPreferences[i].Value = keyValue; } } if ( i == LocalPreferences.GetSizeI() ) { KeyPair kp; kp.Key = keyName; kp.Value = keyValue; LocalPreferences.PushBack( kp ); } // don't write out if prefs are disabled because we could overwrite with default values #if defined( ENABLE_LOCAL_PREFS ) // write the file FILE * f = fopen( localPrefsFile, "w" ); if ( !f ) { LOG( "Couldn't open %s for writing", localPrefsFile ); return; } for ( int i = 0 ; i < LocalPreferences.GetSizeI() ; i++ ) { fprintf( f, "%s %s", LocalPreferences[i].Key.ToCStr(), LocalPreferences[i].Value.ToCStr() ); } fclose( f ); #endif }
// Query the in-memory preferences for a key / value pair. // If the returned string is not defaultKeyValue, it will remain valid until the next ovr_UpdateLocalPreferences(). const char * ovr_GetLocalPreferenceValueForKey( const char * keyName, const char * defaultKeyValue ) { #if defined( ENABLE_LOCAL_PREFS ) for ( int i = 0 ; i < LocalPreferences.GetSizeI() ; i++ ) { if ( 0 == LocalPreferences[i].Key.CompareNoCase( keyName ) ) { LOG( "Key %s = %s", keyName, LocalPreferences[i].Value.ToCStr() ); return LocalPreferences[i].Value.ToCStr(); } } LOG( "Key %s not found, returning default %s", keyName, defaultKeyValue ); #endif return defaultKeyValue; }