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;