mirror of https://github.com/BOINC/boinc.git
*** empty log message ***
svn path=/trunk/boinc/; revision=12187
This commit is contained in:
parent
975268f84d
commit
87fbd47b75
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue