diff --git a/checkin_notes b/checkin_notes index a0e1a4b06e..06c34b2884 100755 --- a/checkin_notes +++ b/checkin_notes @@ -15054,3 +15054,18 @@ Rom 11 July 2004 stdwx.h Workunit.cpp, .h XMLParser.cpp, .h + +Daniel 2004-07-12 + - bugfix: don't tell uninitalized apps to reread prefs + - only call set_client_state_dirty("schedule_cpus") if some + project had a runnable result. (if no such project, then debt + and active task set can't change.) + - tell apps to stop doing screensaver graphics when rescheduling + CPUs + - added ACTIVE_TASK_SET::get_next_graphics_capable_app(), not + currently used + + client/ + app.{C,h} + cs_apps.C + diff --git a/client/app.C b/client/app.C index 494a8c1d1b..b989cf9888 100644 --- a/client/app.C +++ b/client/app.C @@ -1070,6 +1070,11 @@ void ACTIVE_TASK_SET::request_reread_prefs(PROJECT* project) { for (i=0; iresult->project != project) continue; + if (atp->state == PROCESS_IN_LIMBO + || atp->state == PROCESS_UNINITIALIZED + ) { + continue; + } atp->request_reread_prefs(); } } @@ -1635,6 +1640,39 @@ int ACTIVE_TASK_SET::parse(MIOFILE& fin) { return 0; } +// return the next graphics-capable app +// try to choose an app from a different project +// preferences goes to pre-ss mode WINDOW, then apps with pre-ss mode HIDE +// +ACTIVE_TASK* ACTIVE_TASK_SET::get_next_graphics_capable_app() { + static int project_index = 0; + unsigned int i, j; + ACTIVE_TASK *atp; + PROJECT *p; + + for (i=0; ischeduler_state != CPU_SCHED_RUNNING) continue; + if (atp->result->project != p) continue; + if (atp->graphics_mode_before_ss == MODE_WINDOW) { + return atp; + } + } + for (j=0; jscheduler_state != CPU_SCHED_RUNNING) continue; + if (atp->result->project != p) continue; + if (atp->graphics_mode_before_ss == MODE_HIDE_GRAPHICS) { + return atp; + } + } + } + return NULL; +} + // return an app with pre-ss mode WINDOW, if there is one // else return an app with pre-ss mode HIDE, if there is one // else return NULL diff --git a/client/app.h b/client/app.h index cb7c00fc24..34ce16d751 100644 --- a/client/app.h +++ b/client/app.h @@ -180,6 +180,7 @@ public: void send_trickle_downs(); // screensaver-related functions + ACTIVE_TASK* get_next_graphics_capable_app(); ACTIVE_TASK* get_graphics_capable_app(); ACTIVE_TASK* get_app_requested(int req_mode); void save_app_modes(); diff --git a/client/cs_apps.C b/client/cs_apps.C index ab62221866..24f1e31da0 100644 --- a/client/cs_apps.C +++ b/client/cs_apps.C @@ -236,7 +236,7 @@ void CLIENT_STATE::assign_results_to_projects() { // Before assigning a result to an active task, check if that result is a file xfer // this will be appearent by the lack of files associated with the workunit's app // Running this function will find these results and mark them as completed. - + // handle_file_xfer_apps(); for (unsigned int i=0; inext_runnable_result will not be NULL if there were any. + // for (unsigned int i=0; ialready_selected) continue; PROJECT *p = results[i]->wup->project; @@ -335,6 +336,8 @@ bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off) { bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { double expected_pay_off; vector::iterator iter; + ACTIVE_TASK *atp; + PROJECT *p; bool some_app_started = false; double total_resource_share = 0; int retval, elapsed_time; @@ -351,9 +354,16 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { return false; } + // tell app doing screensaver (fullscreen) graphics to stop + // + if ((atp = gstate.active_tasks.get_app_requested(MODE_FULLSCREEN)) != 0) { + atp->request_graphics_mode(MODE_HIDE_GRAPHICS); + } + // finish work accounting for active tasks, reset temporary fields + // for (i=0; i < active_tasks.active_tasks.size(); ++i) { - ACTIVE_TASK *atp = active_tasks.active_tasks[i]; + atp = active_tasks.active_tasks[i]; if (atp->scheduler_state != CPU_SCHED_RUNNING) continue; double task_cpu_time = atp->current_cpu_time - atp->cpu_time_at_last_sched; atp->result->project->work_done_this_period += task_cpu_time; @@ -365,7 +375,7 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { // assign_results_to_projects(); // do this to see which projects have work for (i=0; i < projects.size(); ++i) { - PROJECT *p = projects[i]; + p = projects[i]; if (p->next_runnable_result != NULL) { total_resource_share += projects[i]->resource_share; } @@ -374,8 +384,9 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { // adjust project debts // reset debts for projects with no runnable results // reset temporary fields + // for (i=0; i < projects.size(); ++i) { - PROJECT *p = projects[i]; + p = projects[i]; if (p->next_runnable_result == NULL) { p->debt = 0; p->anticipated_debt = 0; @@ -395,6 +406,7 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { } // schedule tasks for projects in order of decreasing anticipated debt + // for (i=0; ialready_selected = false; } @@ -405,9 +417,10 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { } // preempt, start, and resume tasks + // iter = active_tasks.active_tasks.begin(); while (iter != active_tasks.active_tasks.end()) { - ACTIVE_TASK *atp = *iter; + atp = *iter; if (atp->scheduler_state == CPU_SCHED_RUNNING && atp->next_scheduler_state == CPU_SCHED_PREEMPTED ) { @@ -439,13 +452,17 @@ bool CLIENT_STATE::schedule_cpus(bool must_reschedule) { // reset work accounting // doing this at the end of schedule_cpus() because // work_done_this_period's can change as apps finish + // for (i=0; i < projects.size(); ++i) { - projects[i]->work_done_this_period = 0; + p = projects[i]; + p->work_done_this_period = 0; } cpu_sched_work_done_this_period = 0; cpu_sched_last_time = time(0); - set_client_state_dirty("schedule_cpus"); + if (total_resource_share > 0.0) { + set_client_state_dirty("schedule_cpus"); + } if (some_app_started) { app_started = cpu_sched_last_time; } @@ -520,7 +537,7 @@ int CLIENT_STATE::choose_version_num(char* app_name, SCHEDULER_REPLY& sr) { // goes through results and checks if the associated apps has no app files // then there is nothing to do, never start the app, close the result - +// void CLIENT_STATE::handle_file_xfer_apps() { for(vector ::const_iterator i = results.begin(); i!=results.end(); ++i) @@ -532,4 +549,3 @@ void CLIENT_STATE::handle_file_xfer_apps() { } } } -