diff --git a/checkin_notes b/checkin_notes index 883c0ec66a..3115ba89b6 100644 --- a/checkin_notes +++ b/checkin_notes @@ -1308,3 +1308,15 @@ David 5 Feb 2009 user.inc user/ show_user.php + +Charlie Feb 5 2009 + - SS: Screensaver coordinator reads ss_config.xml file. + - SS: If coordinator runs default screensaver during science phase because + no science graphics are available, then shorten the next default + graphics phase by that much time. + + clientscr/ + screensaver.cpp, .h + Mac_Saver_Module.h + screensaver_win.h + ss_config.xml (added) diff --git a/clientscr/Mac_Saver_Module.h b/clientscr/Mac_Saver_Module.h index 2fb2b64dbf..19b2262717 100644 --- a/clientscr/Mac_Saver_Module.h +++ b/clientscr/Mac_Saver_Module.h @@ -86,6 +86,9 @@ protected: int m_tLastResultChangeCounter; bool m_StatusMessageUpdated; bool m_bDefault_ss_exists; + double m_fGFXDefaultPeriod; + double m_fGFxSciencePeriod; + double m_fGFXChangePeriod; // // Data management layer @@ -101,7 +104,7 @@ protected: int launch_default_screensaver(char *dir_path, int& graphics_application); void HandleRPCError(void); OSErr KillScreenSaver(void); - void GetDisplayPeriods(double& default_period, double& science_period, double& change_period); + void GetDisplayPeriods(char *dir_path); pthread_t m_hDataManagementThread; pid_t m_hGraphicsApplication; diff --git a/clientscr/screensaver.cpp b/clientscr/screensaver.cpp index c958aeda7a..05b22d1b05 100644 --- a/clientscr/screensaver.cpp +++ b/clientscr/screensaver.cpp @@ -82,7 +82,7 @@ int CScreensaver::count_active_graphic_apps(RESULTS& results, RESULT* exclude) { if ((results.results[i]->graphics_exec_path.size() == 0) && (state.executing_as_daemon || !(results.results[i]->supports_graphics))) continue; BOINCTRACE(_T("get_random_graphics_app -- active task detected w/graphics\n")); - + if (is_same_task(results.results[i], exclude)) continue; graphics_app_count++; } @@ -346,26 +346,27 @@ DWORD WINAPI CScreensaver::DataManagementProc() { #else void *CScreensaver::DataManagementProc() { #endif - int retval = 0; - int suspend_reason = 0; - RESULT* theResult = NULL; - RESULT* graphics_app_result_ptr = NULL; + int retval = 0; + int suspend_reason = 0; + RESULT* theResult = NULL; + RESULT* graphics_app_result_ptr = NULL; RESULT previous_result; // previous_result_ptr = &previous_result when previous_result is valid, else NULL - RESULT* previous_result_ptr = NULL; - int iResultCount = 0; - int iIndex = 0; - double default_phase_start_time = 0.0; - double science_phase_start_time = 0.0; - double last_change_time = 0.0; - double gfx_default_period = GFX_DEFAULT_PERIOD; - double gfx_science_period = GFX_SCIENCE_PERIOD; - double gfx_change_period = GFX_CHANGE_PERIOD; + RESULT* previous_result_ptr = NULL; + int iResultCount = 0; + int iIndex = 0; + double default_phase_start_time = 0.0; + double science_phase_start_time = 0.0; + double last_change_time = 0.0; + // If we run default screensaver during science phase because no science graphics + // are available, then shorten next default graphics phase by that much time. + double default_saver_start_time = 0.0; + double default_saver_duration = 0.0; - SS_PHASE ss_phase = DEFAULT_SS_PHASE; - bool science_gfx_running = false; - bool default_gfx_running = false; - bool switch_to_default_gfx = false; + SS_PHASE ss_phase = DEFAULT_SS_PHASE; + bool science_gfx_running = false; + bool default_gfx_running = false; + bool switch_to_default_gfx = false; char full_path[1024]; #ifdef _WIN32 @@ -379,6 +380,9 @@ void *CScreensaver::DataManagementProc() { #endif m_bDefault_ss_exists = false; + m_fGFXDefaultPeriod = GFX_DEFAULT_PERIOD; + m_fGFxSciencePeriod = GFX_SCIENCE_PERIOD; + m_fGFXChangePeriod = GFX_CHANGE_PERIOD; #ifdef __APPLE__ char * default_ss_dir_path = "/Library/Application Support/BOINC Data"; @@ -402,7 +406,7 @@ void *CScreensaver::DataManagementProc() { science_phase_start_time = dtime(); } - GetDisplayPeriods(gfx_default_period, gfx_science_period, gfx_change_period); + GetDisplayPeriods(default_ss_dir_path); while (true) { for (int i = 0; i < 4; i++) { @@ -478,9 +482,9 @@ void *CScreensaver::DataManagementProc() { continue; } - // Time to switch to default graphics? + // Time to switch to default graphics phase? if (m_bDefault_ss_exists && (ss_phase == SCIENCE_SS_PHASE)) { - if (science_phase_start_time && ((dtime() - science_phase_start_time) > gfx_science_period)) { + if (science_phase_start_time && ((dtime() - science_phase_start_time) > m_fGFxSciencePeriod)) { switch_to_default_gfx = true; ss_phase = DEFAULT_SS_PHASE; default_phase_start_time = dtime(); @@ -512,6 +516,9 @@ void *CScreensaver::DataManagementProc() { default_gfx_running = false; } else { default_gfx_running = true; + if (ss_phase == SCIENCE_SS_PHASE) { + default_saver_start_time = dtime(); + } } } } @@ -523,13 +530,21 @@ void *CScreensaver::DataManagementProc() { if (m_bDefault_ss_exists && !default_gfx_running) { switch_to_default_gfx = true; } - } else { - // Time to switch to science graphics? - if (ss_phase == DEFAULT_SS_PHASE) { - if (default_phase_start_time && ((dtime() - default_phase_start_time) > gfx_default_period)) { - ss_phase = SCIENCE_SS_PHASE; - default_phase_start_time = 0; - science_phase_start_time = dtime(); + } + + // Time to switch to science graphics phase? + if (ss_phase == DEFAULT_SS_PHASE) { + if (default_phase_start_time && + ((dtime() - default_phase_start_time + default_saver_duration) + > m_fGFXDefaultPeriod)) { + // BOINCTRACE(_T("CScreensaver::Ending Default phase: now=%f, default_phase_start_time=%f, default_saver_duration=%f\n"), + // dtime(), default_phase_start_time, default_saver_duration); + ss_phase = SCIENCE_SS_PHASE; + default_phase_start_time = 0; + default_saver_duration = 0; + science_phase_start_time = dtime(); + if (default_gfx_running) { + default_saver_start_time = science_phase_start_time; } } } @@ -575,7 +590,7 @@ void *CScreensaver::DataManagementProc() { // waitpid test will clear m_hGraphicsApplication } - if (last_change_time && ((dtime() - last_change_time) > gfx_change_period)) { + if (last_change_time && ((dtime() - last_change_time) > m_fGFXChangePeriod)) { if (count_active_graphic_apps(results, previous_result_ptr) > 0) { if (previous_result_ptr) { BOINCTRACE(_T("CScreensaver::DataManagementProc - time to change: %s / %s\n"), @@ -603,6 +618,10 @@ void *CScreensaver::DataManagementProc() { if (graphics_app_result_ptr) { if (default_gfx_running) { kill_program(m_hGraphicsApplication); + default_saver_duration += dtime() - default_saver_start_time; + //BOINCTRACE(_T("CScreensaver::During Science phase: now=%f, default_saver_start_time=%f, default_saver_duration=%f\n"), + // dtime(), default_saver_start_time, default_saver_duration); + // waitpid test will clear m_hGraphicsApplication and graphics_app_result_ptr } else { retval = launch_screensaver(graphics_app_result_ptr, m_hGraphicsApplication); @@ -667,6 +686,7 @@ void *CScreensaver::DataManagementProc() { default_gfx_running = false; } else { default_gfx_running = true; + default_saver_start_time = dtime(); } } } @@ -696,9 +716,28 @@ void *CScreensaver::DataManagementProc() { } -void CScreensaver::GetDisplayPeriods(double& default_period, - double& science_period, - double& change_period) { +void CScreensaver::GetDisplayPeriods(char *dir_path) { + char buf[1024]; + FILE* f; + MIOFILE mf; -// TODO: pares ss_config.xml file here. + strlcpy(buf, dir_path, sizeof(buf)); + strlcat(buf, PATH_SEPARATOR, sizeof(buf)); + strlcat(buf, SS_CONFIG_FILE, sizeof(buf)); + + f = boinc_fopen(buf, "r"); + if (!f) return; + + mf.init_file(f); + XML_PARSER xp(&mf); + + while (mf.fgets(buf, sizeof(buf))) { + if (parse_double(buf, "", m_fGFXDefaultPeriod)) continue; + if (parse_double(buf, "", m_fGFxSciencePeriod)) continue; + if (parse_double(buf, "", m_fGFXChangePeriod)) continue; + } + fclose(f); + + BOINCTRACE(_T("CScreensaver::GetDisplayPeriods: m_fGFXDefaultPeriod=%f, m_fGFxSciencePeriod=%f, m_fGFXChangePeriod=%f\n"), + m_fGFXDefaultPeriod, m_fGFxSciencePeriod, m_fGFXChangePeriod); } \ No newline at end of file diff --git a/clientscr/screensaver.h b/clientscr/screensaver.h index a50732a32e..e186263ead 100644 --- a/clientscr/screensaver.h +++ b/clientscr/screensaver.h @@ -20,15 +20,9 @@ #define __SCREENSAVER_H__ // Default values, overriden by screensaver config file ss_config.xml -#if 0 -define GFX_DEFAULT_PERIOD 600 /* if default OpenGL screensaver exists, display it for 600 secs */ +#define GFX_DEFAULT_PERIOD 600 /* if default OpenGL screensaver exists, display it for 600 secs */ #define GFX_SCIENCE_PERIOD 1800 /* Display various science graphics apps for 1800 secs */ #define GFX_CHANGE_PERIOD 600 /* if > 1 CPUs, change screensaver every 600 secs */ -#else // Temporary for testing -#define GFX_DEFAULT_PERIOD 15 /* if default OpenGL screensaver exists, display it for 15 secs */ -#define GFX_SCIENCE_PERIOD 30 /* Display various science graphics apps for 30 secs */ -#define GFX_CHANGE_PERIOD 15 /* if > 1 CPUs, change screensaver every q5 secs */ -#endif enum SS_PHASE { DEFAULT_SS_PHASE, diff --git a/clientscr/screensaver_win.h b/clientscr/screensaver_win.h index 947debe59e..2a60de9e98 100644 --- a/clientscr/screensaver_win.h +++ b/clientscr/screensaver_win.h @@ -162,7 +162,7 @@ protected: int launch_screensaver(RESULT* rp, HANDLE& graphics_application); int launch_default_screensaver(char *dir_path, HANDLE& graphics_application); void HandleRPCError(void); - void GetDisplayPeriods(double& default_period, double& science_period, double& change_period); + void GetDisplayPeriods(char *dir_path); // Determine if two RESULT pointers refer to the same task bool is_same_task(RESULT* taska, RESULT* taskb); @@ -190,6 +190,10 @@ protected: time_t m_tLastResultChangeTime; time_t m_tThreadCreateTime; + double m_fGFXDefaultPeriod; + double m_fGFxSciencePeriod; + double m_fGFXChangePeriod; + // // Presentation layer // diff --git a/clientscr/ss_config.xml b/clientscr/ss_config.xml new file mode 100644 index 0000000000..1a6c3997b5 --- /dev/null +++ b/clientscr/ss_config.xml @@ -0,0 +1,3 @@ +90 +90 +30