use iterator

svn path=/trunk/boinc/; revision=948
This commit is contained in:
David Anderson 2003-02-20 00:06:07 +00:00
parent 45edb85cab
commit cea4b691d9
3 changed files with 42 additions and 43 deletions

View File

@ -293,10 +293,11 @@ int ACTIVE_TASK::start(bool first_time) {
char *errorargs[] = {app_version->app_name,"","","",""};
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, win_error, 0, (LPTSTR)&lpMsgBuf, 0, errorargs);
NULL, win_error, 0, (LPTSTR)&lpMsgBuf, 0, errorargs
);
// check for an error; if there is one, set error information for the currect result
if(win_error) {
if (win_error) {
gstate.report_project_error(*result, win_error, (LPTSTR)&lpMsgBuf);
LocalFree(lpMsgBuf);
return -1;
@ -304,7 +305,7 @@ int ACTIVE_TASK::start(bool first_time) {
fprintf(stdout, "CreateProcess: %s\n", (LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
pid = process_info.dwProcessId;
pid = process_info.dwProcessId;
pid_handle = process_info.hProcess;
thread_handle = process_info.hThread;
#else
@ -413,16 +414,20 @@ bool ACTIVE_TASK_SET::poll() {
if (atp->state == PROCESS_ABORT_PENDING) {
atp->state = PROCESS_ABORTED;
atp->result->active_task_state = PROCESS_ABORTED;
gstate.report_project_error(*(atp->result), 0, "process was aborted\n");
gstate.report_project_error(
*(atp->result), 0, "process was aborted\n"
);
} else {
atp->state = PROCESS_EXITED;
atp->exit_status = exit_code;
atp->result->exit_status = atp->exit_status;
atp->result->active_task_state = PROCESS_EXITED;
//if a nonzero error code, then report it
if(exit_code) {
gstate.report_project_error(*(atp->result),0,
"process exited with a non zero exit code\n");
if (exit_code) {
gstate.report_project_error(
*(atp->result), 0,
"process exited with a non zero exit code\n"
);
}
}
CloseHandle(atp->pid_handle);
@ -451,7 +456,9 @@ bool ACTIVE_TASK_SET::poll() {
if (atp->state == PROCESS_ABORT_PENDING) {
atp->state = PROCESS_ABORTED;
atp->result->active_task_state = PROCESS_ABORTED;
gstate.report_project_error(*(atp->result),0,"process was aborted\n");
gstate.report_project_error(
*(atp->result), 0, "process was aborted\n"
);
} else {
if (WIFEXITED(stat)) {
atp->state = PROCESS_EXITED;
@ -461,8 +468,10 @@ bool ACTIVE_TASK_SET::poll() {
// If exit_status != 0, then we don't need to upload the
// files for the result of this app
if(atp->exit_status) {
gstate.report_project_error(*(atp->result),0,
"process exited with a nonzero exit code\n");
gstate.report_project_error(
*(atp->result), 0,
"process exited with a nonzero exit code\n"
);
}
if (log_flags.task_debug) printf("process exited: status %d\n", atp->exit_status);
} else if (WIFSIGNALED(stat)) {
@ -470,11 +479,13 @@ bool ACTIVE_TASK_SET::poll() {
atp->signal = WTERMSIG(stat);
atp->result->signal = atp->signal;
atp->result->active_task_state = PROCESS_WAS_SIGNALED;
gstate.report_project_error(*(atp->result),0,"process was signaled\n");
gstate.report_project_error(
*(atp->result), 0, "process was signaled\n"
);
if (log_flags.task_debug) printf("process was signaled: %d\n", atp->signal);
} else {
atp->state = PROCESS_EXIT_UNKNOWN;
atp->result->state = PROCESS_EXIT_UNKNOWN;
atp->result->state = PROCESS_EXIT_UNKNOWN;
}
}
@ -517,7 +528,7 @@ bool ACTIVE_TASK::read_stderr_file() {
n = fread(result->stderr_out, 1, sizeof(result->stderr_out), f);
result->stderr_out[n] = 0;
fclose(f);
return true;
return true;
}
return false;
}
@ -634,7 +645,10 @@ int ACTIVE_TASK_SET::restart_tasks() {
if (retval) {
fprintf(stderr, "ACTIVE_TASKS::restart_tasks(); restart failed: %d\n", retval);
atp->result->active_task_state = PROCESS_COULDNT_START;
gstate.report_project_error(*(atp->result),retval,"Couldn't restart the app for this result.\n");
gstate.report_project_error(
*(atp->result), retval,
"Couldn't restart the app for this result.\n"
);
active_tasks.erase(iter);
} else {
iter++;

View File

@ -104,26 +104,22 @@ bool CLIENT_STATE::handle_pers_file_xfers() {
bool action = false;
int retval;
// Look for FILE_INFOs for which we should start a transfer,
// and make PERS_FILE_XFERs for them
//
for (i=0; i<file_infos.size(); i++) {
fip = file_infos[i];
pfx = fip->pers_file_xfer;
if (pfx) continue;
if (!fip->generated_locally && fip->status == FILE_NOT_PRESENT) {
// Set up the persistent file transfer object.
// This will start the download when there is available bandwidth
//
pfx = new PERS_FILE_XFER;
pfx->init(fip, false);
fip->pers_file_xfer = pfx;
retval = pers_xfers->insert(fip->pers_file_xfer);
//if (retval) gstate.report_project_error( *fip->result, retval, "" ); // *******
// TODO: return error?
action = true;
} else if (fip->upload_when_present && fip->status == FILE_PRESENT && !fip->uploaded) {
// Set up the persistent file transfer object.
// This will start the upload when there is available bandwidth
//
pfx = new PERS_FILE_XFER;
pfx->init(fip, true);
fip->pers_file_xfer = pfx;
@ -132,17 +128,21 @@ bool CLIENT_STATE::handle_pers_file_xfers() {
}
}
for (i=0; i<pers_xfers->pers_file_xfers.size(); i++) {
pfx = pers_xfers->pers_file_xfers[i];
// Scan existing PERS_FILE_XFERs, looking for those that are done,
// and deleting them
//
vector<PERS_FILE_XFER*>::iterator iter;
iter = pers_xfers->pers_file_xfers.begin();
while (iter != pers_xfers->pers_file_xfers.end()) {
pfx = *iter;
// If the transfer finished, remove the PERS_FILE_XFER object
// from the set and delete it
//
if (pfx->xfer_done) {
pfx->fip->pers_file_xfer = NULL;
pers_xfers->remove(pfx);
iter = pers_xfers->pers_file_xfers.erase(iter);
delete pfx;
i--;
action = true;
}
}

19
todo
View File

@ -1,21 +1,6 @@
-----------------------
BUGS (arranged from high to low priority)
-----------------------
- Allow change of email address, with verification
proposed scheme:
user enters new email address X
system generates random string Y,
changes user email address to @X_Y
syntactically invalid; can distinguish
must make sure that this isn't displayed on web site
emails message to X containing Y
at web site, user enters Y
system verifies that email address is of form @X_Y;
changes email address to X
Use this same scheme on account creation:
email is initially @X_Y; on first login, change to X
- multiple preference sets
- Test suspend/resume functionality on Windows,
no way to suspend/resume on UNIX
@ -30,8 +15,6 @@ BUGS (arranged from high to low priority)
should there be a user control for this?
- Client treats URL "maggie/ap/" different than URL "maggie/ap",
though this isn't really a bug it might be good to fix anyway
- verify that if file xfer is interrupted, it resumes at right place
(and progress bar is correct)
- make pie chart colors/labels easier to understand
- need a way to refresh prefs from client
- Client should display "Upload failed" and "Download failed" when failure occurs
@ -60,6 +43,8 @@ Messages from core client
-----------------------
THINGS TO TEST (preferably with test scripts)
-----------------------
- verify that if file xfer is interrupted, it resumes at right place
(and progress bar is correct)
- result reissue
- WU failure: too many errors
- WU failure: too many good results