diff --git a/api/boinc_api.C b/api/boinc_api.C index c87a4d5914..7356172499 100644 --- a/api/boinc_api.C +++ b/api/boinc_api.C @@ -247,37 +247,31 @@ int boinc_parse_init_data_file() { FILE* f; int retval; - // If in standalone mode, use init files if they're there, - // but don't demand that they exist - // + memset(&aid, 0, sizeof(aid)); + safe_strncpy(aid.user_name, "Unknown user", sizeof(aid.user_name)); + safe_strncpy(aid.team_name, "Unknown team", sizeof(aid.team_name)); + aid.wu_cpu_time = 1000; + aid.user_total_credit = 1000; + aid.user_expavg_credit = 500; + aid.host_total_credit = 1000; + aid.host_expavg_credit = 500; + aid.checkpoint_period = DEFAULT_CHECKPOINT_PERIOD; + aid.fraction_done_update_period = DEFAULT_FRACTION_DONE_UPDATE_PERIOD; + if (!boinc_file_exists(INIT_DATA_FILE)) { - if (standalone) { - safe_strncpy(aid.project_preferences, "", sizeof(aid.project_preferences)); - safe_strncpy(aid.user_name, "Unknown user", sizeof(aid.user_name)); - safe_strncpy(aid.team_name, "Unknown team", sizeof(aid.team_name)); - aid.wu_cpu_time = 1000; - aid.user_total_credit = 1000; - aid.user_expavg_credit = 500; - aid.host_total_credit = 1000; - aid.host_expavg_credit = 500; - aid.checkpoint_period = DEFAULT_CHECKPOINT_PERIOD; - aid.fraction_done_update_period = DEFAULT_FRACTION_DONE_UPDATE_PERIOD; - } else { - fprintf(stderr, - "boinc_parse_init_data_file(): can't open init data file\n" - ); - return ERR_FOPEN; - } - } else { - f = boinc_fopen(INIT_DATA_FILE, "r"); - retval = parse_init_data_file(f, aid); - fclose(f); - if (retval) { - fprintf(stderr, - "boinc_parse_init_data_file(): can't parse init data file\n" - ); - return retval; - } + fprintf(stderr, + "Can't open init data file - running in standalone mode\n" + ); + return ERR_FOPEN; + } + f = boinc_fopen(INIT_DATA_FILE, "r"); + retval = parse_init_data_file(f, aid); + fclose(f); + if (retval) { + fprintf(stderr, + "Can't parse init data file - running in standalone mode\n" + ); + return retval; } return 0; } diff --git a/api/x_opengl.C b/api/x_opengl.C index f21b4d05b2..f8a691242a 100644 --- a/api/x_opengl.C +++ b/api/x_opengl.C @@ -112,12 +112,12 @@ static void make_new_window(int mode){ strcpy(aid.app_name, "BOINC Application"); } win = glutCreateWindow(aid.app_name); + glutReshapeFunc(app_graphics_resize); glutKeyboardFunc(keyboardD); glutKeyboardUpFunc(keyboardU); glutMouseFunc(mouse_click); glutMotionFunc(mouse_click_move); - //glutCloseFunc(close_func); glutDisplayFunc(maybe_render); app_graphics_init(); @@ -143,10 +143,18 @@ void set_mode(int mode) { if (mode != MODE_HIDE_GRAPHICS) { make_new_window(mode); } - - // tell the core client that we're entering new mode - // - if (app_client_shm) { +} + +static void wait_for_initial_message() { + app_client_shm->shm->graphics_reply.send_msg( + xml_graphics_modes[MODE_HIDE_GRAPHICS] + ); + acked_graphics_mode = MODE_HIDE_GRAPHICS; + while (1) { + if (app_client_shm->shm->graphics_request.has_msg()) { + break; + } + sleep(1); } } @@ -194,7 +202,8 @@ void xwin_graphics_event_loop(){ if (boinc_is_standalone()) { set_mode(MODE_WINDOW); } else { - set_mode(MODE_HIDE_GRAPHICS); + wait_for_initial_message(); + timer_handler(0); } glutTimerFunc(TIMER_INTERVAL_MSEC, timer_handler, 0); glutMainLoop(); diff --git a/checkin_notes b/checkin_notes index db34ea50cf..9b39603e47 100755 --- a/checkin_notes +++ b/checkin_notes @@ -18369,3 +18369,54 @@ David 13 Oct 2004 sched/ file_upload_handler.C + +David 14 Oct 2004 + - Core client: change the poll paradigm a little + OLD: all the poll functions get called, + at least once a second or more often when there's activity, + e.g. network traffic. + The problem: some of the poll functions (e.g. garbage collect) + do a lot of work, and in periods of network activity + they get called hundreds of times/sec. + NEW: all poll functions take a "double now" argument. + Those that only need to run every second can + keep track of the last time called, and return false + if not enough time has gone by + - Clarify meaning of TIME_STATS::active_frac: + it is the fraction of total time + (NOT time that core client is running) + that core client is enabled to work + - CLIENT_STATE::compute_work_requests(): + Don't divide by active_frac in computing work request; + the scheduler already does this!! + - Core client: don't use time_t for times. Use double. + - garbage collect: delete an unused FILE_INFO even if + it has an active PERS_FILE_XFER. + (Delete the PERS_FILE_XFER first.) + - API: fix crashing bug if app_init_data.xml file isn't there + - Graphics API, X version: wait for initial message + before doing anything (since GLUT needs a window) + - scheduler: fix small error in WU wallclock estimate + + api/ + boinc_api.C + x_opengl.C + client/ + app.C,h + client_state.C,h + client_types.C + cs_apps.C + cs_files.C + cs_scheduler.C + file_xfer.C,h + gui_rpc_server.C,h + http.C,h + main.C + net_xfer.C,h + scheduler_op.C + time_stats.h + lib/ + app_ipc.C,h + makefile.gui_test + sched/ + sched_send.C diff --git a/client/app.C b/client/app.C index 81eeed3895..09e6c08830 100644 --- a/client/app.C +++ b/client/app.C @@ -186,8 +186,11 @@ void ACTIVE_TASK_SET::free_mem() { // - check if any has exited, and clean up // - see if any has exceeded its CPU or disk space limits, and abort it // -bool ACTIVE_TASK_SET::poll() { +bool ACTIVE_TASK_SET::poll(double now) { bool action; + static double last_time = 0; + if (now - last_time < 1.0) return false; + last_time = now; action = check_app_exited(); send_heartbeats(); diff --git a/client/app.h b/client/app.h index ce3782e4d0..f6d1f447e1 100644 --- a/client/app.h +++ b/client/app.h @@ -186,7 +186,7 @@ public: int remove(ACTIVE_TASK*); ACTIVE_TASK* lookup_pid(int); ACTIVE_TASK* lookup_result(RESULT*); - bool poll(); + bool poll(double); void suspend_all(bool leave_apps_in_memory=true); void unsuspend_all(); bool is_task_executing(); diff --git a/client/client_state.C b/client/client_state.C index fd9d4cac17..833ec3c426 100644 --- a/client/client_state.C +++ b/client/client_state.C @@ -322,9 +322,9 @@ int CLIENT_STATE::net_sleep(double x) { } } -#define POLL_ACTION(name, func) \ - do { if (func()) { \ - ++actions; \ +#define POLL_ACTION(name, func) \ + do { if (func(now)) { \ + ++actions; \ scope_messages.printf("CLIENT_STATE::do_something(): active task: " #name "\n"); \ } } while(0) @@ -333,7 +333,7 @@ int CLIENT_STATE::net_sleep(double x) { // Returns true if something happened // (in which case should call this again immediately) // -bool CLIENT_STATE::do_something() { +bool CLIENT_STATE::do_something(double now) { int actions = 0, reason, retval; SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_POLL); @@ -364,7 +364,7 @@ bool CLIENT_STATE::do_something() { } else { cpu_benchmarks_poll(); } - return gui_rpcs.poll(); + return gui_rpcs.poll(dtime()); } check_suspend_network(reason); @@ -707,7 +707,7 @@ void CLIENT_STATE::print_summary() { // delete unneeded records and files // -bool CLIENT_STATE::garbage_collect() { +bool CLIENT_STATE::garbage_collect(double now) { unsigned int i, j; int failnum; FILE_INFO* fip; @@ -723,6 +723,12 @@ bool CLIENT_STATE::garbage_collect() { PROJECT* project; char buf[1024]; + static double last_time=0; + if (now>0) { + if (now - last_time < 1.0) return false; + last_time = now; + } + SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_STATE); // zero references counts on WUs, FILE_INFOs and APP_VERSIONs @@ -874,7 +880,12 @@ bool CLIENT_STATE::garbage_collect() { fip = *fi_iter; // if there was an error with a permanent file, get rid of its file_info if (fip->status < 0) fip->sticky = false; - if (fip->ref_cnt==0 && fip->pers_file_xfer==NULL && !fip->sticky) { + if (fip->ref_cnt==0 && !fip->sticky) { + if (fip->pers_file_xfer) { + pers_file_xfers->remove(fip->pers_file_xfer); + delete fip->pers_file_xfer; + fip->pers_file_xfer = 0; + } #if 0 fip->project->size -= fip->nbytes; #endif @@ -900,10 +911,14 @@ bool CLIENT_STATE::garbage_collect() { // update the state of results // -bool CLIENT_STATE::update_results() { +bool CLIENT_STATE::update_results(double now) { RESULT* rp; vector::iterator result_iter; bool action = false; + static double last_time=0; + + if (now - last_time < 1.0) return false; + last_time = 0; result_iter = results.begin(); while (result_iter != results.end()) { @@ -947,8 +962,8 @@ bool CLIENT_STATE::update_results() { bool CLIENT_STATE::time_to_exit() { if (!exit_when_idle && !exit_after_app_start_secs) return false; if (exit_after_app_start_secs - && app_started - && (difftime(time(0), app_started) >= exit_after_app_start_secs) + && (app_started>0) + && ((dtime() - app_started) >= exit_after_app_start_secs) ) { msg_printf(NULL, MSG_INFO, "exiting because time is up: %d\n", exit_after_app_start_secs); return true; @@ -1104,7 +1119,7 @@ int CLIENT_STATE::reset_project(PROJECT* project) { } } - garbage_collect(); + garbage_collect(0); // forcibly remove apps and app_versions // (but not if anonymous platform) @@ -1131,7 +1146,7 @@ int CLIENT_STATE::reset_project(PROJECT* project) { app_iter++; } } - garbage_collect(); + garbage_collect(0); } write_state_file(); diff --git a/client/client_state.h b/client/client_state.h index 59d7473b8a..d3d084464d 100644 --- a/client/client_state.h +++ b/client/client_state.h @@ -133,19 +133,19 @@ private: // if set, run benchmarks on client startup int exit_after_app_start_secs; // if nonzero, exit this many seconds after starting an app - time_t app_started; + double app_started; // when the most recent app was started // CPU sched state // - time_t cpu_sched_last_time; + double cpu_sched_last_time; double cpu_sched_work_done_this_period; // --------------- client_state.C: public: CLIENT_STATE(); int init(); - bool do_something(); + bool do_something(double t); // Initiates and completes actions (file transfers, process executions) // Never blocks. // Returns true if it actually did something, @@ -172,8 +172,8 @@ private: int link_workunit(PROJECT*, WORKUNIT*); int link_result(PROJECT*, RESULT*); void print_summary(); - bool garbage_collect(); - bool update_results(); + bool garbage_collect(double); + bool update_results(double); double total_resource_share(); // --------------- cs_account.C: @@ -202,8 +202,8 @@ private: void assign_results_to_projects(); bool schedule_largest_debt_project(double expected_pay_off); bool start_apps(); - bool schedule_cpus(); - bool handle_finished_apps(); + bool schedule_cpus(double); + bool handle_finished_apps(double); void handle_file_xfer_apps(); int schedule_result(RESULT*); @@ -227,7 +227,7 @@ public: bool start_new_file_xfer(PERS_FILE_XFER&); private: int make_project_dirs(); - bool handle_pers_file_xfers(); + bool handle_pers_file_xfers(double); // --------------- cs_prefs.C: public: @@ -262,7 +262,7 @@ private: PROJECT* find_project_with_overdue_results(); PROJECT* next_project_sched_rpc_pending(); bool some_project_rpc_ok(); - bool scheduler_rpc_poll(); + bool scheduler_rpc_poll(double); double ettprc(PROJECT*, int); double avg_proc_rate(PROJECT*); diff --git a/client/client_types.C b/client/client_types.C index 3262a78593..7ecbd6432c 100644 --- a/client/client_types.C +++ b/client/client_types.C @@ -410,7 +410,7 @@ FILE_INFO::FILE_INFO() { FILE_INFO::~FILE_INFO() { if (pers_file_xfer) { - msg_printf(NULL, MSG_ERROR, "FILE_INFO::~FILE_INFO(): removing FILE_INFO when a pers_file_xfer still points to me\n"); + msg_printf(NULL, MSG_ERROR, "%s: delete FILE_INFO when a pers_file_xfer still points to it\n", name); pers_file_xfer->fip = NULL; } } diff --git a/client/cs_apps.C b/client/cs_apps.C index 59688d98e2..aebfda151f 100644 --- a/client/cs_apps.C +++ b/client/cs_apps.C @@ -143,10 +143,13 @@ int CLIENT_STATE::app_finished(ACTIVE_TASK& at) { // clean up after finished apps // -bool CLIENT_STATE::handle_finished_apps() { +bool CLIENT_STATE::handle_finished_apps(double now) { unsigned int i; ACTIVE_TASK* atp; bool action = false; + static double last_time = 0; + if (now - last_time < 1.0) return false; + last_time = now; SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_TASK); @@ -327,15 +330,15 @@ bool CLIENT_STATE::schedule_largest_debt_project(double expected_pay_off) { // and whenever all the input files for a result finish downloading // (with must_reschedule=true) // -bool CLIENT_STATE::schedule_cpus() { +bool CLIENT_STATE::schedule_cpus(double now) { double expected_pay_off; ACTIVE_TASK *atp; PROJECT *p; bool some_app_started = false, first; double total_resource_share; - int retval, elapsed_time, j; + int retval, j; double min_debt=0; - double vm_limit; + double vm_limit, elapsed_time; unsigned int i; SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_TASK); @@ -350,11 +353,12 @@ bool CLIENT_STATE::schedule_cpus() { if (must_schedule_cpus) { must_schedule_cpus = false; } else { - elapsed_time = time(0) - cpu_sched_last_time; + elapsed_time = now - cpu_sched_last_time; if (elapsed_time < (global_prefs.cpu_scheduling_period_minutes*60)) { return false; } } + cpu_sched_last_time = now; // mark file xfer results as completed; // TODO: why do this here?? @@ -503,9 +507,8 @@ bool CLIENT_STATE::schedule_cpus() { } cpu_sched_work_done_this_period = 0; - cpu_sched_last_time = time(0); if (some_app_started) { - app_started = cpu_sched_last_time; + app_started = now; } // debts and active_tasks can only change if some project had a runnable result diff --git a/client/cs_files.C b/client/cs_files.C index 71a20db7cd..d250fe5eb6 100644 --- a/client/cs_files.C +++ b/client/cs_files.C @@ -162,12 +162,16 @@ int FILE_INFO::verify_downloaded_file() { // scan all FILE_INFOs and PERS_FILE_XFERs. // start and finish downloads and uploads as needed. // -bool CLIENT_STATE::handle_pers_file_xfers() { +bool CLIENT_STATE::handle_pers_file_xfers(double now) { unsigned int i; FILE_INFO* fip; PERS_FILE_XFER *pfx; bool action = false; int retval; + static double last_time; + + if (now - last_time < 1.0) return false; + last_time = now; // Look for FILE_INFOs for which we should start a transfer, // and make PERS_FILE_XFERs for them diff --git a/client/cs_scheduler.C b/client/cs_scheduler.C index fb14f360ff..5ba1a46c0d 100644 --- a/client/cs_scheduler.C +++ b/client/cs_scheduler.C @@ -343,9 +343,7 @@ bool CLIENT_STATE::some_project_rpc_ok() { // for project p in a second of (wall-clock) time // double CLIENT_STATE::avg_proc_rate(PROJECT *p) { - return (p->resource_share / trs) - * ncpus - * time_stats.on_frac * time_stats.active_frac; + return (p->resource_share / trs) * ncpus * time_stats.active_frac; } // "estimated time to project result count" @@ -411,24 +409,26 @@ int CLIENT_STATE::compute_work_requests() { // if (estimated_time_to_starvation < work_min_period) { if (estimated_time_to_starvation == 0) { -// msg_printf(p, MSG_INFO, "Will starve!"); + msg_printf(p, MSG_INFO, "is starved"); urgency = NEED_WORK_IMMEDIATELY; } else { -// msg_printf(p, MSG_INFO, "Will starve in %.2fs!", -// estimated_time_to_starvation -// ); + msg_printf(p, MSG_INFO, "will starve in %.2f sec", + estimated_time_to_starvation + ); urgency = max(NEED_WORK, urgency); } } // determine work requests for each project + // NOTE: don't need to divide by active_frac etc.; + // the scheduler does that (see sched/sched_send.C) // - p->work_request = - max(0.0, - //(2*work_min_period - estimated_time_to_starvation) - (work_min_period - estimated_time_to_starvation) - * avg_proc_rate(p) - ); + p->work_request = max(0.0, + //(2*work_min_period - estimated_time_to_starvation) + (work_min_period - estimated_time_to_starvation) + * ncpus + ); + //msg_printf(p, MSG_INFO, "work req: %f sec", p->work_request); } if (urgency == DONT_NEED_WORK) { @@ -443,10 +443,14 @@ int CLIENT_STATE::compute_work_requests() { // called from the client's polling loop. // initiate scheduler RPC activity if needed and possible // -bool CLIENT_STATE::scheduler_rpc_poll() { +bool CLIENT_STATE::scheduler_rpc_poll(double now) { int urgency = DONT_NEED_WORK; PROJECT *p; bool action=false; + static double last_time=0; + + if (now - last_time < 1.0) return false; + last_time = now; switch(scheduler_op->state) { case SCHEDULER_OP_STATE_IDLE: diff --git a/client/file_xfer.C b/client/file_xfer.C index 6e42577e2b..e1bf83777d 100644 --- a/client/file_xfer.C +++ b/client/file_xfer.C @@ -184,10 +184,14 @@ int FILE_XFER_SET::remove(FILE_XFER* fxp) { // Run through the FILE_XFER_SET and determine if any of the file // transfers are complete or had an error // -bool FILE_XFER_SET::poll() { +bool FILE_XFER_SET::poll(double now) { unsigned int i; FILE_XFER* fxp; bool action = false; + static double last_time=0; + + if (now - last_time < 1.0) return false; + last_time = now; SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_FILE_XFER); diff --git a/client/file_xfer.h b/client/file_xfer.h index cf350b109e..1703c1da37 100644 --- a/client/file_xfer.h +++ b/client/file_xfer.h @@ -57,7 +57,7 @@ public: FILE_XFER_SET(HTTP_OP_SET*); int insert(FILE_XFER*); int remove(FILE_XFER*); - bool poll(); + bool poll(double); }; #endif diff --git a/client/gui_rpc_server.C b/client/gui_rpc_server.C index 5a08368d56..32ac2c7b4b 100644 --- a/client/gui_rpc_server.C +++ b/client/gui_rpc_server.C @@ -558,7 +558,7 @@ int GUI_RPC_CONN_SET::init() { return 0; } -bool GUI_RPC_CONN_SET::poll() { +bool GUI_RPC_CONN_SET::poll(double) { int n = 0; unsigned int i; fd_set read_fds, error_fds; diff --git a/client/gui_rpc_server.h b/client/gui_rpc_server.h index a867b96aef..b9ebeda777 100644 --- a/client/gui_rpc_server.h +++ b/client/gui_rpc_server.h @@ -34,7 +34,7 @@ class GUI_RPC_CONN_SET { int get_allowed_hosts(); int insert(GUI_RPC_CONN*); public: - bool poll(); + bool poll(double); int init(); }; diff --git a/client/http.C b/client/http.C index 2c3ee4c98a..1a32582c51 100644 --- a/client/http.C +++ b/client/http.C @@ -496,7 +496,7 @@ int HTTP_OP_SET::insert(HTTP_OP* ho) { return 0; } -bool HTTP_OP_SET::poll() { +bool HTTP_OP_SET::poll(double) { unsigned int i; HTTP_OP* htp; int n, retval; diff --git a/client/http.h b/client/http.h index 9bd397d8f5..3c1cf1146a 100644 --- a/client/http.h +++ b/client/http.h @@ -96,7 +96,7 @@ class HTTP_OP_SET { NET_XFER_SET* net_xfers; public: HTTP_OP_SET(NET_XFER_SET*); - bool poll(); + bool poll(double); int insert(HTTP_OP*); int remove(HTTP_OP*); }; diff --git a/client/main.C b/client/main.C index 7b12bb646a..26e8c2565a 100644 --- a/client/main.C +++ b/client/main.C @@ -272,7 +272,8 @@ int boinc_main_loop(int argc, char** argv) { while (1) { - if (!gstate.do_something()) { + dt = dtime(); + if (!gstate.do_something(dt)) { dt = dtime(); gstate.net_sleep(1.); dt = dtime() - dt; diff --git a/client/net_xfer.C b/client/net_xfer.C index 824ed9ddc2..74210f5d1f 100644 --- a/client/net_xfer.C +++ b/client/net_xfer.C @@ -349,12 +349,11 @@ int NET_XFER_SET::remove(NET_XFER* nxp) { // Transfer data to/from active sockets. // Keep doing I/O until would block, or we hit rate limits, -// or about .5 second goes by +// or .5 second goes by // -bool NET_XFER_SET::poll() { +bool NET_XFER_SET::poll(double now) { double bytes_xferred; int retval; - time_t t = time(0); bool action = false; while (1) { @@ -362,7 +361,7 @@ bool NET_XFER_SET::poll() { if (retval) break; if (bytes_xferred == 0) break; action = true; - if (time(0) != t) break; + if ((dtime() - now) > 0.5) break; } return action; } @@ -382,7 +381,7 @@ int NET_XFER_SET::net_sleep(double x) { retval = do_select(bytes_xferred, x); if (retval) return retval; if (bytes_xferred) { - return poll(); + return poll(dtime()); } return 0; } diff --git a/client/net_xfer.h b/client/net_xfer.h index 2a8917262f..8ab6107e18 100644 --- a/client/net_xfer.h +++ b/client/net_xfer.h @@ -95,7 +95,7 @@ public: time_t last_time; int insert(NET_XFER*); int remove(NET_XFER*); - bool poll(); + bool poll(double); int net_sleep(double); int do_select(double& bytes_transferred, double timeout); NET_XFER* lookup_fd(int); // lookup by fd diff --git a/client/pers_file_xfer.C b/client/pers_file_xfer.C index e5bdd83290..1627f2a1b5 100644 --- a/client/pers_file_xfer.C +++ b/client/pers_file_xfer.C @@ -171,7 +171,7 @@ int PERS_FILE_XFER::start_xfer() { // If it's time to start it, then attempt to start it. // If it has finished or failed, then deal with it appropriately // -bool PERS_FILE_XFER::poll(time_t now) { +bool PERS_FILE_XFER::poll(double now) { int retval; char pathname[256], buf[256]; double existing_size = 0; @@ -187,7 +187,7 @@ bool PERS_FILE_XFER::poll(time_t now) { // See if it's time to try again. // if (now >= next_request_time) { - last_time = dtime(); + last_time = now; fip->upload_offset = -1; retval = start_xfer(); return (retval == 0); @@ -198,11 +198,11 @@ bool PERS_FILE_XFER::poll(time_t now) { // don't count suspended periods in total time // - double diff = dtime() - last_time; + double diff = now - last_time; if (diff <= 2) { time_so_far += diff; } - last_time = dtime(); + last_time = now; if (fxp->file_xfer_done) { if (fip->nbytes) { @@ -469,10 +469,13 @@ PERS_FILE_XFER_SET::PERS_FILE_XFER_SET(FILE_XFER_SET* p) { // Run through the set, starting any transfers that need to be // started and deleting any that have finished // -bool PERS_FILE_XFER_SET::poll() { +bool PERS_FILE_XFER_SET::poll(double now) { unsigned int i; bool action = false; - int now = time(0); + static double last_time=0; + + if (now - last_time < 1.0) return false; + last_time = now; for (i=0; ipoll(now); diff --git a/client/pers_file_xfer.h b/client/pers_file_xfer.h index 5e1a39b72e..3c45e992ae 100644 --- a/client/pers_file_xfer.h +++ b/client/pers_file_xfer.h @@ -20,10 +20,6 @@ #ifndef _PERS_FILE_XFER_H #define _PERS_FILE_XFER_H -#ifndef _WIN32 -#include -#endif - #include "client_types.h" #include "file_xfer.h" @@ -66,7 +62,7 @@ public: PERS_FILE_XFER(); ~PERS_FILE_XFER(); int init(FILE_INFO*, bool is_file_upload); - bool poll(time_t now); + bool poll(double); void handle_xfer_failure(); void retry_or_backoff(); void check_giveup(char*); @@ -85,7 +81,7 @@ public: PERS_FILE_XFER_SET(FILE_XFER_SET*); int insert(PERS_FILE_XFER*); int remove(PERS_FILE_XFER*); - bool poll(); + bool poll(double); void suspend(); }; diff --git a/client/scheduler_op.C b/client/scheduler_op.C index e614cd1ce7..a550dde614 100644 --- a/client/scheduler_op.C +++ b/client/scheduler_op.C @@ -75,7 +75,7 @@ bool SCHEDULER_OP::check_master_fetch_start() { return false; } -// try to get some work, from any project from which we need it +// try to get work, from any project from which we need it // PRECONDITION: compute_work_requests() has been called // to fill in PROJECT::work_request // @@ -87,11 +87,8 @@ int SCHEDULER_OP::init_get_work() { must_get_work = true; project = gstate.next_project_need_work(0); if (project) { - // for new work fetch policy ns = project->work_request; - msg_printf(project, MSG_INFO, - "Requesting %.0f seconds of work", ns - ); + msg_printf(project, MSG_INFO, "Requesting %.2f seconds of work", ns); retval = init_op_project(ns); if (retval) { sprintf(err_msg, "init_op_project failed, error %d\n", retval); diff --git a/client/time_stats.h b/client/time_stats.h index 6c12a4c77a..00759c34b0 100644 --- a/client/time_stats.h +++ b/client/time_stats.h @@ -25,13 +25,11 @@ class TIME_STATS { public: // we maintain an exponentially weighted average of these quantities: double on_frac; - // the fraction of time this host runs the core client + // the fraction of total time this host runs the core client double connected_frac; - // of the time running the core client, - // the fraction the host is connected to the Internet + // the fraction of total time the host is connected to the Internet double active_frac; - // of the time running the core client, - // the fraction the core client is able to work + // the fraction of total time the core client is able to work // (due to preferences, manual suspend/resume, etc.) void update(bool is_connected, bool is_active); diff --git a/lib/app_ipc.C b/lib/app_ipc.C index 3b0a116f56..683925e889 100755 --- a/lib/app_ipc.C +++ b/lib/app_ipc.C @@ -177,6 +177,11 @@ bool MSG_CHANNEL::get_msg(char *msg) { return true; } +bool MSG_CHANNEL::has_msg() { + if (buf[0]) return true; + return false; +} + bool MSG_CHANNEL::send_msg(char *msg) { if (buf[0]) return false; safe_strncpy(buf+1, msg, MSG_CHANNEL_SIZE-1); diff --git a/lib/app_ipc.h b/lib/app_ipc.h index e1dbf236a0..66542baa90 100755 --- a/lib/app_ipc.h +++ b/lib/app_ipc.h @@ -53,6 +53,7 @@ struct MSG_CHANNEL { char buf[MSG_CHANNEL_SIZE]; bool get_msg(char*); // returns a message and clears pending flag + bool has_msg(); bool send_msg(char*); // if there is not a message in the segment, // writes specified message and sets pending flag void send_msg_overwrite(char*); diff --git a/lib/makefile.gui_test b/lib/makefile.gui_test index e52eaf6a22..0d5c512985 100644 --- a/lib/makefile.gui_test +++ b/lib/makefile.gui_test @@ -1,2 +1,5 @@ +// uncomment the following for Solaris +//LIBS = -lnsl -lsocket + gui_test: gui_test.C gui_rpc_client.C gui_rpc_client.h - g++ -g -I../lib -o gui_test -lnsl -lsocket gui_test.C gui_rpc_client.C ../lib/libboinc.a + g++ -g -I../lib -o gui_test $(LIBS) gui_test.C gui_rpc_client.C ../lib/libboinc.a diff --git a/sched/sched_send.C b/sched/sched_send.C index db4127fa8f..e72269e7c0 100644 --- a/sched/sched_send.C +++ b/sched/sched_send.C @@ -136,26 +136,27 @@ const double HOST_ACTIVE_FRAC_MIN = 0.1; // // TODO: improve this. take memory bandwidth into account // -inline double estimate_cpu_duration(WORKUNIT& wu, HOST& host) { +static double estimate_cpu_duration(WORKUNIT& wu, HOST& host) { if (host.p_fpops <= 0) host.p_fpops = 1e9; if (wu.rsc_fpops_est <= 0) wu.rsc_fpops_est = 1e12; return wu.rsc_fpops_est/host.p_fpops; } -// estimate the amount of real time for this WU based on active_frac, -// and resource_share_fraction -inline double estimate_wallclock_duration( +// estimate the amount of real time to complete this WU, +// taking into account active_frac and resource_share_fraction +// +static double estimate_wallclock_duration( WORKUNIT& wu, HOST& host, double resource_share_fraction ) { return estimate_cpu_duration(wu, host) - / max(HOST_ACTIVE_FRAC_MIN, host.active_frac * resource_share_fraction) + / (max(HOST_ACTIVE_FRAC_MIN, host.active_frac)*resource_share_fraction) ; } // return false if the WU can't be executed on the host // because of insufficient memory, CPU speed, or resource share // -bool wu_is_feasible( +static bool wu_is_feasible( WORKUNIT& wu, HOST& host, WORK_REQ& wreq, double resource_share_fraction, double estimated_delay ) {