*** empty log message ***

svn path=/trunk/boinc/; revision=12187
This commit is contained in:
David Anderson 2007-03-04 20:52:31 +00:00
parent 975268f84d
commit 87fbd47b75
3 changed files with 55 additions and 13 deletions

View File

@ -93,7 +93,6 @@ static volatile int time_until_fraction_done_update;
static volatile double fraction_done; static volatile double fraction_done;
static volatile double last_checkpoint_cpu_time; static volatile double last_checkpoint_cpu_time;
static volatile bool ready_to_checkpoint = false; static volatile bool ready_to_checkpoint = false;
static volatile bool in_critical_section = false;
static volatile double last_wu_cpu_time; static volatile double last_wu_cpu_time;
static volatile bool standalone = false; static volatile bool standalone = false;
static volatile double initial_wu_cpu_time; static volatile double initial_wu_cpu_time;
@ -135,9 +134,11 @@ bool g_sleep = false;
static HANDLE hSharedMem; static HANDLE hSharedMem;
HANDLE worker_thread_handle; HANDLE worker_thread_handle;
// used to suspend worker thread, and to measure its CPU time // used to suspend worker thread, and to measure its CPU time
HANDLE suspend_mutex;
#else #else
static pthread_t timer_thread_handle; static pthread_t timer_thread_handle;
static struct rusage worker_thread_ru; static struct rusage worker_thread_ru;
static pthread_mutex_t suspend_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif #endif
static BOINC_OPTIONS options; static BOINC_OPTIONS options;
@ -306,6 +307,10 @@ int boinc_init_options_general(BOINC_OPTIONS& opt) {
} }
} }
#ifdef _WIN32
suspend_mutex = CreateMutex(NULL, FALSE, NULL);
#endif
retval = boinc_parse_init_data_file(); retval = boinc_parse_init_data_file();
if (retval) { if (retval) {
standalone = true; standalone = true;
@ -606,7 +611,7 @@ static void handle_heartbeat_msg() {
} }
static void handle_upload_file_status() { static void handle_upload_file_status() {
char path[256], buf[256], log_name[256]; char path[256], buf[256], log_name[256], *p;
std::string filename; std::string filename;
int status; int status;
@ -621,9 +626,9 @@ static void handle_upload_file_status() {
fprintf(stderr, "handle_file_upload_status: can't open %s\n", filename.c_str()); fprintf(stderr, "handle_file_upload_status: can't open %s\n", filename.c_str());
continue; continue;
} }
fgets(buf, 256, f); p = fgets(buf, 256, f);
fclose(f); fclose(f);
if (parse_int(buf, "<status>", status)) { if (p && parse_int(buf, "<status>", status)) {
UPLOAD_FILE_STATUS uf; UPLOAD_FILE_STATUS uf;
uf.name = std::string(log_name); uf.name = std::string(log_name);
uf.status = status; uf.status = status;
@ -703,7 +708,6 @@ static void worker_timer(int /*a*/) {
} }
} }
//fprintf(stderr, "worker_timer: in_critical_section %d\n", in_critical_section);
// handle messages from the core client // handle messages from the core client
// //
if (app_client_shm) { if (app_client_shm) {
@ -713,16 +717,19 @@ static void worker_timer(int /*a*/) {
if (options.handle_trickle_downs) { if (options.handle_trickle_downs) {
handle_trickle_down_msg(); handle_trickle_down_msg();
} }
if (!in_critical_section && options.handle_process_control) { if (options.handle_process_control) {
handle_process_control_msg(); if (boinc_try_critical_section()) {
handle_process_control_msg();
boinc_end_critical_section();
}
} }
} }
// see if the core client has died, which means we need to die too // see if the core client has died, which means we need to die too
// (unless we're in a critical section) // (unless we're in a critical section)
// //
if (!in_critical_section && options.check_heartbeat && heartbeat_active) { if (options.check_heartbeat && heartbeat_active && (heartbeat_giveup_time < interrupt_count)) {
if (heartbeat_giveup_time < interrupt_count) { if (boinc_try_critical_section()) {
fprintf(stderr, fprintf(stderr,
"No heartbeat from core client for %d sec - exiting\n", "No heartbeat from core client for %d sec - exiting\n",
interrupt_count - (heartbeat_giveup_time - HEARTBEAT_GIVEUP_PERIOD) interrupt_count - (heartbeat_giveup_time - HEARTBEAT_GIVEUP_PERIOD)
@ -732,6 +739,7 @@ static void worker_timer(int /*a*/) {
} else { } else {
boinc_status.no_heartbeat = true; boinc_status.no_heartbeat = true;
} }
boinc_end_critical_section();
} }
} }
@ -915,7 +923,7 @@ int boinc_send_trickle_up(char* variety, char* p) {
// //
int boinc_time_to_checkpoint() { int boinc_time_to_checkpoint() {
if (ready_to_checkpoint) { if (ready_to_checkpoint) {
in_critical_section = true; boinc_begin_critical_section();
return 1; return 1;
} }
return 0; return 0;
@ -928,17 +936,41 @@ int boinc_checkpoint_completed() {
last_checkpoint_cpu_time = last_wu_cpu_time; last_checkpoint_cpu_time = last_wu_cpu_time;
update_app_progress(last_checkpoint_cpu_time, last_checkpoint_cpu_time); update_app_progress(last_checkpoint_cpu_time, last_checkpoint_cpu_time);
time_until_checkpoint = (int)aid.checkpoint_period; time_until_checkpoint = (int)aid.checkpoint_period;
in_critical_section = false; boinc_end_critical_section();
ready_to_checkpoint = false; ready_to_checkpoint = false;
return 0; return 0;
} }
int boinc_try_critical_section() {
#ifdef _WIN32
if (WaitForSingleObject(suspend_mutex, 0L) == WAIT_OBJECT_0) {
return 1;
}
return 0;
#else
if (pthread_mutex_trylock(&suspend_mutex) == 0) {
return 1;
} else {
return 0;
}
#endif
}
void boinc_begin_critical_section() { void boinc_begin_critical_section() {
in_critical_section = true; #ifdef _WIN32
WaitForSingleObject(suspend_mutex, INFINITE);
#else
pthread_mutex_lock(&suspend_mutex);
#endif
} }
void boinc_end_critical_section() { void boinc_end_critical_section() {
in_critical_section = false; #ifdef _WIN32
ReleaseMutex(suspend_mutex);
#else
pthread_mutex_unlock(&suspend_mutex);
#endif
} }
int boinc_fraction_done(double x) { int boinc_fraction_done(double x) {

View File

@ -79,6 +79,7 @@ extern int boinc_resume_other_activities(void);
extern int boinc_report_app_status(double, double, double); extern int boinc_report_app_status(double, double, double);
extern int boinc_time_to_checkpoint(); extern int boinc_time_to_checkpoint();
extern void boinc_begin_critical_section(); extern void boinc_begin_critical_section();
extern int boinc_try_critical_section();
extern void boinc_end_critical_section(); extern void boinc_end_critical_section();
extern void boinc_need_network(); extern void boinc_need_network();
extern int boinc_network_poll(); extern int boinc_network_poll();

View File

@ -2137,3 +2137,12 @@ David 3 Mar 2007
sim.C sim.C
html/inc/ html/inc/
stats_sites.inc stats_sites.inc
David 4 Mar 2007
- API: use a mutex instead of a boolean variable for
mutual exclusion during checkpoint.
This should fix a race condition that can result in
applications being suspended and not responding to resume messages
api/
boinc_api.C,h