diff --git a/api/boinc_api.C b/api/boinc_api.C index 8a7bde0e6a..9a2c2258c9 100644 --- a/api/boinc_api.C +++ b/api/boinc_api.C @@ -100,11 +100,82 @@ HANDLE worker_thread_handle; static MMRESULT timer_id; #endif -static int setup_shared_mem(); -static int update_app_progress(double cpu_t, double cp_cpu_t, double ws_t); static BOINC_OPTIONS options; static volatile BOINC_STATUS boinc_status; +static int setup_shared_mem() { + if (standalone) { + fprintf(stderr, "Standalone mode, so not using shared memory.\n"); + return 0; + } + app_client_shm = new APP_CLIENT_SHM; + +#ifdef _WIN32 + char buf[256]; + sprintf(buf, "%s%s", SHM_PREFIX, aid.shmem_seg_name); + hSharedMem = attach_shmem(buf, (void**)&app_client_shm->shm); + if (hSharedMem == NULL) { + delete app_client_shm; + app_client_shm = NULL; + } +#else + if (attach_shmem(aid.shmem_seg_name, (void**)&app_client_shm->shm)) { + delete app_client_shm; + app_client_shm = NULL; + } +#endif + if (app_client_shm == NULL) return -1; + return 0; +} + + +static int boinc_worker_thread_cpu_time(double& cpu) { +#ifdef _WIN32 + if (boinc_thread_cpu_time(worker_thread_handle, cpu)) { + cpu = nrunning_ticks * TIMER_PERIOD; // for Win9x + } + return 0; +#else + // no CPU time calls in pthreads - return process total + // + return boinc_calling_thread_cpu_time(cpu); +#endif +} + +// communicate to the core client (via shared mem) +// the current CPU time and fraction done +// +static int update_app_progress( + double cpu_t, double cp_cpu_t, double /*ws_t*/ +) { + char msg_buf[MSG_CHANNEL_SIZE], buf[256]; + double vm, rs; + + if (!app_client_shm) return 0; + + sprintf(msg_buf, + "%10.4f\n" + "%.15e\n", + cpu_t, cp_cpu_t + ); + if (fraction_done >= 0) { + double range = aid.fraction_done_end - aid.fraction_done_start; + double fdone = aid.fraction_done_start + fraction_done*range; + sprintf(buf, "%2.8f\n", fdone); + strcat(msg_buf, buf); + } + if (!mem_usage(vm, rs)) { + sprintf(buf, + "%f\n" + "%flu\n", + vm, rs + ); + strcat(msg_buf, buf); + } + app_client_shm->shm->app_status.send_msg(msg_buf); + return 0; +} + // the following 2 functions are used when there's no graphics // int boinc_init() { @@ -197,8 +268,8 @@ static void send_trickle_up_msg() { // int boinc_finish(int status) { if (options.send_status_msgs) { - boinc_calling_thread_cpu_time(last_checkpoint_cpu_time); - last_checkpoint_cpu_time += aid.wu_cpu_time; + boinc_worker_thread_cpu_time(last_checkpoint_cpu_time); + last_checkpoint_cpu_time += initial_wu_cpu_time; update_app_progress(last_checkpoint_cpu_time, last_checkpoint_cpu_time, 0); } if (options.handle_trickle_ups) { @@ -308,40 +379,6 @@ int boinc_report_app_status( return 0; } -// communicate to the core client (via shared mem) -// the current CPU time and fraction done -// -static int update_app_progress( - double cpu_t, double cp_cpu_t, double /*ws_t*/ -) { - char msg_buf[MSG_CHANNEL_SIZE], buf[256]; - double vm, rs; - - if (!app_client_shm) return 0; - - sprintf(msg_buf, - "%10.4f\n" - "%.15e\n", - cpu_t, cp_cpu_t - ); - if (fraction_done >= 0) { - double range = aid.fraction_done_end - aid.fraction_done_start; - double fdone = aid.fraction_done_start + fraction_done*range; - sprintf(buf, "%2.8f\n", fdone); - strcat(msg_buf, buf); - } - if (!mem_usage(vm, rs)) { - sprintf(buf, - "%f\n" - "%flu\n", - vm, rs - ); - strcat(msg_buf, buf); - } - app_client_shm->shm->app_status.send_msg(msg_buf); - return 0; -} - int boinc_get_init_data(APP_INIT_DATA& app_init_data) { app_init_data = aid; return 0; @@ -355,23 +392,6 @@ int boinc_wu_cpu_time(double& cpu_t) { return 0; } -#ifdef _WIN32 - -int boinc_worker_thread_cpu_time(double& cpu) { - if (boinc_thread_cpu_time(worker_thread_handle, cpu)) { - cpu = nrunning_ticks * TIMER_PERIOD; // for Win9x - } - return 0; -} - -#else - -int boinc_worker_thread_cpu_time(double& cpu) { - return boinc_calling_thread_cpu_time(cpu); -} - -#endif // _WIN32 - static void handle_heartbeat_msg() { char buf[MSG_CHANNEL_SIZE]; if (app_client_shm->shm->heartbeat.get_msg(buf)) { @@ -559,31 +579,6 @@ int set_worker_timer() { return retval; } -static int setup_shared_mem() { - if (standalone) { - fprintf(stderr, "Standalone mode, so not using shared memory.\n"); - return 0; - } - app_client_shm = new APP_CLIENT_SHM; - -#ifdef _WIN32 - char buf[256]; - sprintf(buf, "%s%s", SHM_PREFIX, aid.shmem_seg_name); - hSharedMem = attach_shmem(buf, (void**)&app_client_shm->shm); - if (hSharedMem == NULL) { - delete app_client_shm; - app_client_shm = NULL; - } -#else - if (attach_shmem(aid.shmem_seg_name, (void**)&app_client_shm->shm)) { - delete app_client_shm; - app_client_shm = NULL; - } -#endif - if (app_client_shm == NULL) return -1; - return 0; -} - int boinc_send_trickle_up(char* variety, char* p) { if (!options.handle_trickle_ups) return ERR_NO_OPTION; FILE* f = boinc_fopen(TRICKLE_UP_FILENAME, "wb"); diff --git a/checkin_notes b/checkin_notes index e7158c165b..497ee776d3 100755 --- a/checkin_notes +++ b/checkin_notes @@ -25557,7 +25557,7 @@ Rom 5 Mar 2005 client_state.C David 5 Mar 2005 - - initial support for GUI RPC protection + - initial support for GUI RPC authentication If the core client finds a file called "gui_rpc_auth.cfg", it reads a password from it, and all GUI RPC requests must authenticate using a challenge/response sequence, @@ -26260,3 +26260,18 @@ David 29 Mar 2005 lib/ shmem.C + +David 29 Mar 2005 + - API: in boinc_finish(), + call boinc_worker_thread_cpu_time() instead of + boinc_calling_thread_cpu_time() + (since the graphics thread can call boinc_finish()). + Also, offset CPU time by initial_wu_cpu_time + instead of aid.wu_cpu_time + + This may help "zero CPU time" problems, but I doubt it + + api/ + boinc_api.C + lib/ + util.C diff --git a/doc/docutil.php b/doc/docutil.php index 2420a05461..d333ae29ab 100644 --- a/doc/docutil.php +++ b/doc/docutil.php @@ -24,14 +24,14 @@ function page_head($title) { Last modified $d -
+
"; } function page_tail() { $y = date("Y "); echo " -
+

Return to BOINC main page

diff --git a/lib/util.C b/lib/util.C index c3a0d1ec20..d7e4d6f348 100755 --- a/lib/util.C +++ b/lib/util.C @@ -728,15 +728,18 @@ int boinc_calling_thread_cpu_time(double& cpu) { #else +// Unix: pthreads doesn't seem to provide an API for getting +// per-thread CPU time. So just get the process's CPU time +// int boinc_calling_thread_cpu_time(double &cpu_t) { int retval; struct rusage ru; retval = getrusage(RUSAGE_SELF, &ru); if (retval) { - fprintf(stderr, "error: could not get CPU time\n"); return ERR_GETRUSAGE; } - // Sum the user and system time spent in this process + // Sum the user and system time + // cpu_t = (double)ru.ru_utime.tv_sec + (((double)ru.ru_utime.tv_usec) / ((double)1000000.0)); cpu_t += (double)ru.ru_stime.tv_sec + (((double)ru.ru_stime.tv_usec) / ((double)1000000.0)); return 0;