*** empty log message ***

svn path=/trunk/boinc/; revision=12167
This commit is contained in:
Charlie Fenton 2007-02-28 08:34:54 +00:00
parent 2ce4a496dc
commit cde884d781
3 changed files with 64 additions and 16 deletions

View File

@ -2087,3 +2087,21 @@ Bruce 27 Feb 2007
sched/
server_types.C
Charlie 28 Feb 2007
Mac: The Mac screensaver launches the core client if not already running.
In this case, it used to kill the cc when screensaver was dismissed.
But Mac OS X dismisses screensavers when energy saver puts displays
to sleep, so we want cc to then continue running. New code launches
cc with -saver flag, lets cc run when saver quits. New logic in cc
quits if (launched by screensaver) and (recent user activity) and
(parent [screensaver] has exited). This takes into account that if
user invoked screensaver by moving mouse into "hot corner" there will
be recent user activity. Added logic to screensaver to relaunch cc in
case of certain race conditions (e.g., screensaver started, dismissed,
restarted in rapid succession.)
client/
cs_prefs.C
clientgui/
mac/
mac_saver_module.cpp

View File

@ -129,7 +129,9 @@ inline bool now_between_two_hours(int start_hour, int end_hour) {
//
void CLIENT_STATE::check_suspend_activities(int& reason) {
reason = 0;
#ifdef __APPLE__
double idletime;
#endif
// Don't work while we're running CPU benchmarks
//
if (are_cpu_benchmarks_running()) {
@ -140,11 +142,25 @@ void CLIENT_STATE::check_suspend_activities(int& reason) {
bool old_user_active = user_active;
user_active = !host_info.users_idle(
check_all_logins, global_prefs.idle_time_to_run
#ifdef __APPLE__
, &idletime
#endif
);
if (user_active != old_user_active) {
request_schedule_cpus("Idle state change");
}
#ifdef __APPLE__
// Mac screensaver launches client if not already running. OS X
// quits screensaver when energy saver puts display to sleep, but
// we want to keep crunching. Also, user can start Mac screensaver
// by putting cursor in "hot corner" so idletime may be very small
// initially. If screensaver started client, this code tells client
// to exit when user becomes active, accounting for all these factors.
if (started_by_screensaver && (idletime < 30) &&
(getppid() == 1) ) // true if parent has exited
gstate.requested_exit = true;
#endif
switch(run_mode.get_current()) {
case RUN_MODE_ALWAYS: break;

View File

@ -145,7 +145,7 @@ const char * BOINCNoProjectsDetectedMsg = "BOINC is not attached to any project
const char * BOINCNoGraphicAppsExecutingMsg = "Project does not support screensaver graphics: ";
const char * BOINCNoGraphicsSupportedMsg = "This BOINC installation does not support screensaver graphics: ";
const char * BOINCUnrecoverableErrorMsg = "Sorry, an unrecoverable error occurred";
const char * BOINCTestmodeMg = "This BOINC screensaver does not support Test mode";
const char * BOINCTestmodeMg = "BOINC screensaver is running, but cannot display graphics in test mode.";
//const char * BOINCExitedSaverMode = "BOINC is no longer in screensaver mode.";
@ -216,7 +216,8 @@ OSStatus initBOINCApp() {
pid_t myPid;
int status;
OSStatus err;
static int retryCount = 0;
saverState = SaverState_CantLaunchCoreClient;
CoreClientPID = FindProcessPID("boinc", 0);
@ -226,6 +227,11 @@ OSStatus initBOINCApp() {
return noErr;
}
wasAlreadyRunning = false;
if (++retryCount > 3)
return -1;
err = GetpathToBOINCManagerApp(boincPath, sizeof(boincPath));
if (err) { // If we couldn't find BOINCManager.app, try default path
strcpy(boincPath, "/Applications/");
@ -257,7 +263,7 @@ OSStatus initBOINCApp() {
_exit(status);
}
status = execl(boincPath, boincPath, "-redirectio", (char *) 0);
status = execl(boincPath, boincPath, "-redirectio", "-saver", (char *) 0);
fflush(NULL);
_exit(127); // execl error (execl should never return)
} else {
@ -430,17 +436,21 @@ void closeBOINCSaver() {
setBannerText(0, NULL);
// Kill core client if we launched it
if (!wasAlreadyRunning)
#if 0 // OS X quits screensaver when energy saver puts display to
// sleep, but we want to keep crunching. So don't kill it.
// Code in core client now quits on user activity if screen
// saver launched it (2/28/07).
if (CoreClientPID)
{
kill(CoreClientPID, SIGTERM);
kill(CoreClientPID, SIGTERM); // Kill core client if we launched it
}
CoreClientPID = 0;
gQuitCounter = 0;
wasAlreadyRunning = false;
gQuitRPCThread = false;
saverState = SaverState_Idle;
#endif
CoreClientPID = 0;
gQuitCounter = 0;
wasAlreadyRunning = false;
gQuitRPCThread = false;
saverState = SaverState_Idle;
}
@ -480,9 +490,10 @@ OSStatus RPCThread(void* param) {
if (val == noErr)
break;
// Attempt to reinitialize the RPC client and state
// Attempt to restart BOINC Client if needed, reinitialize the RPC client and state
rpc->close();
rpc->init(NULL);
initBOINCApp();
MPExit(noErr); // Exit the thread
// Error message after timeout?
}
@ -499,9 +510,10 @@ OSStatus RPCThread(void* param) {
val = rpc->get_screensaver_mode(gClientSaverStatus);
if (val) {
// Attempt to reinitialize the RPC client and state
// Attempt to restart BOINC Client if needed, reinitialize the RPC client and state
rpc->close();
rpc->init(NULL);
initBOINCApp();
MPExit(noErr); // Exit the thread
// Error message after timeout?
}
@ -550,8 +562,10 @@ OSStatus RPCThread(void* param) {
} // end for() loop
gStatusMessageUpdated = true;
} else { // rpc call returned error
// Attempt to restart BOINC Client if needed, reinitialize the RPC client and state
rpc->close();
rpc->init(NULL);
initBOINCApp();
MPExit(noErr); // Exit the thread
} // end if (rpc.get_results(results) {} else {}
} // end if (! gStatusMessageUpdated)