From e5f1f2f9cb72d4a88fb338a1a3c709768fdfba0a Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 22 Feb 2008 22:21:00 +0000 Subject: [PATCH] - scheduler: code cleanup: use global var for SCHED_SHMEM instead of passing it around as argument (should do same for request and reply at some point) svn path=/trunk/boinc/; revision=14781 --- checkin_notes | 7 ++++++ sched/handle_request.C | 27 +++++++++------------ sched/handle_request.h | 2 +- sched/main.C | 6 ++--- sched/sched_array.C | 18 +++++++------- sched/sched_array.h | 4 +--- sched/sched_assign.C | 2 +- sched/sched_locality.C | 53 ++++++++++++++++++------------------------ sched/sched_locality.h | 4 +--- sched/sched_resend.C | 6 ++--- sched/sched_resend.h | 4 +--- sched/sched_send.C | 27 ++++++++++----------- sched/sched_send.h | 9 +++---- sched/transitioner.C | 2 +- 14 files changed, 74 insertions(+), 97 deletions(-) diff --git a/checkin_notes b/checkin_notes index dc285a887d..d88824ba06 100644 --- a/checkin_notes +++ b/checkin_notes @@ -1575,3 +1575,10 @@ Charlie Feb 22 2008 clientscr/ mac_saver_module.cpp Mac_Saver_ModuleView.m + +David Feb 22 2008 + - scheduler: code cleanup: use global var for SCHED_SHMEM + instead of passing it around as argument + (should do same for request and reply at some point) + + sched/sched_* diff --git a/sched/handle_request.C b/sched/handle_request.C index f479b4a292..dfd96489d8 100644 --- a/sched/handle_request.C +++ b/sched/handle_request.C @@ -578,9 +578,7 @@ static int update_host_record(HOST& initial_host, HOST& xhost, USER& user) { // Figure out which of the results the host currently has // should be aborted outright, or aborted if not started yet // -int send_result_abort( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& -) { +int send_result_abort( SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) { int aborts_sent = 0; int retval = 0; DB_IN_PROGRESS_RESULT result; @@ -1000,8 +998,7 @@ void handle_msgs_to_host(SCHEDULER_REPLY& reply) { } void process_request( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss, - char* code_sign_key + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, char* code_sign_key ) { PLATFORM* platform; int retval; @@ -1038,7 +1035,7 @@ void process_request( have_no_work = false; } else { lock_sema(); - have_no_work = ss.no_work(g_pid); + have_no_work = ssp->no_work(g_pid); unlock_sema(); } @@ -1152,10 +1149,10 @@ void process_request( // look up the client's platform(s) in the DB // - platform = ss.lookup_platform(sreq.platform.name); + platform = ssp->lookup_platform(sreq.platform.name); if (platform) sreq.platforms.list.push_back(platform); for (i=0; ilookup_platform(sreq.alt_platforms[i].name); if (platform) sreq.platforms.list.push_back(platform); } if (sreq.platforms.list.size() == 0) { @@ -1177,12 +1174,12 @@ void process_request( reply.wreq.nresults_on_host = sreq.other_results.size(); if (sreq.have_other_results_list) { if (config.resend_lost_results) { - if (resend_lost_work(sreq, reply, ss)) { + if (resend_lost_work(sreq, reply)) { ok_to_send_work = false; } } if (config.send_result_abort) { - send_result_abort(sreq, reply, ss); + send_result_abort(sreq, reply); } } @@ -1209,7 +1206,7 @@ void process_request( } } if (ok_to_send_work) { - send_work(sreq, reply, ss); + send_work(sreq, reply); } } @@ -1224,13 +1221,11 @@ void process_request( leave: if (!have_no_work) { - ss.restore_work(g_pid); + ssp->restore_work(g_pid); } } -void handle_request( - FILE* fin, FILE* fout, SCHED_SHMEM& ss, char* code_sign_key -) { +void handle_request(FILE* fin, FILE* fout, char* code_sign_key) { SCHEDULER_REQUEST sreq; SCHEDULER_REPLY sreply; @@ -1248,7 +1243,7 @@ void handle_request( sreq.core_client_release, (int)sreq.work_req_seconds ); - process_request(sreq, sreply, ss, code_sign_key); + process_request(sreq, sreply, code_sign_key); #ifdef _USING_FCGI_ log_messages.set_indent_level(2); diff --git a/sched/handle_request.h b/sched/handle_request.h index 342323002c..5385a96c98 100644 --- a/sched/handle_request.h +++ b/sched/handle_request.h @@ -23,5 +23,5 @@ #include "server_types.h" extern void handle_request( - FILE* fin, FILE* fout, SCHED_SHMEM&, char* code_sign_key + FILE* fin, FILE* fout, char* code_sign_key ); diff --git a/sched/main.C b/sched/main.C index c9dcfc475c..1f4528a0ea 100644 --- a/sched/main.C +++ b/sched/main.C @@ -458,7 +458,7 @@ int main(int argc, char** argv) { exit(1); } - handle_request(fin, fout, *ssp, code_sign_key); + handle_request(fin, fout, code_sign_key); fclose(fin); fclose(fout); fin = fopen(reply_path, "r"); @@ -480,12 +480,12 @@ int main(int argc, char** argv) { #ifndef _USING_FCGI_ } else if (batch) { while (!feof(stdin)) { - handle_request(stdin, stdout, *ssp, code_sign_key); + handle_request(stdin, stdout, code_sign_key); fflush(stdout); } #endif } else { - handle_request(stdin, stdout, *ssp, code_sign_key); + handle_request(stdin, stdout, code_sign_key); } done: #ifdef _USING_FCGI_ diff --git a/sched/sched_array.C b/sched/sched_array.C index f1b3c83829..c0c73204da 100644 --- a/sched/sched_array.C +++ b/sched/sched_array.C @@ -43,9 +43,7 @@ // If reply.wreq.infeasible_only is true, // send only results that were previously infeasible for some host // -void scan_work_array( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss -) { +void scan_work_array(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) { int i, j, retval, n, rnd_off; WORKUNIT wu; DB_RESULT result; @@ -56,12 +54,12 @@ void scan_work_array( lock_sema(); - rnd_off = rand() % ss.max_wu_results; - for (j=0; jmax_wu_results; + for (j=0; jmax_wu_results; j++) { + i = (j+rnd_off) % ssp->max_wu_results; if (!reply.work_needed()) break; - WU_RESULT& wu_result = ss.wu_results[i]; + WU_RESULT& wu_result = ssp->wu_results[i]; // do fast checks on this wu_result; // i.e. ones that don't require DB access @@ -74,7 +72,7 @@ void scan_work_array( // If we are looking for beta results and result is not a beta result // then move on // - app = ss.lookup_app(wu_result.workunit.appid); + app = ssp->lookup_app(wu_result.workunit.appid); if (app == NULL) continue; // this should never happen if (reply.wreq.beta_only) { if (!app->beta) { @@ -125,14 +123,14 @@ void scan_work_array( // If none, treat the WU as infeasible // if (anonymous(sreq.platforms.list[0])) { - app = ss.lookup_app(wu.appid); + app = ssp->lookup_app(wu.appid); found = sreq.has_version(*app); if (!found) { continue; } avp = NULL; } else { - found = find_app_version(sreq, reply.wreq, wu, ss, app, avp); + found = find_app_version(sreq, reply.wreq, wu, app, avp); if (!found) { continue; } diff --git a/sched/sched_array.h b/sched/sched_array.h index d11b959e53..9e09aabc00 100644 --- a/sched/sched_array.h +++ b/sched/sched_array.h @@ -1,3 +1 @@ -extern void scan_work_array( - SCHEDULER_REQUEST&, SCHEDULER_REPLY&, SCHED_SHMEM& -); +extern void scan_work_array(SCHEDULER_REQUEST&, SCHEDULER_REPLY&); diff --git a/sched/sched_assign.C b/sched/sched_assign.C index 55c2803de1..502281e556 100644 --- a/sched/sched_assign.C +++ b/sched/sched_assign.C @@ -61,7 +61,7 @@ static int send_assigned_job( log_messages.printf(MSG_CRITICAL, "ERROR: APP NOT FOUND\n"); return ERR_NOT_FOUND; } - bool found = find_app_version(request, reply.wreq, wu, *ssp, app, avp); + bool found = find_app_version(request, reply.wreq, wu, app, avp); if (!found) { log_messages.printf(MSG_CRITICAL, "ERROR: APP VERSION NOT FOUND\n"); return ERR_NOT_FOUND; diff --git a/sched/sched_locality.C b/sched/sched_locality.C index 6dba44a441..8fef3f7d77 100644 --- a/sched/sched_locality.C +++ b/sched/sched_locality.C @@ -269,7 +269,7 @@ int decrement_disk_space_locality( // static int possibly_send_result( DB_RESULT& result, - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { DB_WORKUNIT wu; DB_RESULT result2; @@ -281,7 +281,7 @@ static int possibly_send_result( retval = wu.lookup_id(result.workunitid); if (retval) return ERR_DB_NOT_FOUND; - retval = get_app_version(wu, app, avp, sreq, reply, ss); + retval = get_app_version(wu, app, avp, sreq, reply); if (retval==ERR_NO_APP_VERSION && anonymous(sreq.platforms.list[0])) { char help_msg_buf[512]; @@ -482,7 +482,6 @@ static int send_results_for_file( char* filename, int& nsent, SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss, bool /*in_working_set*/ ) { DB_RESULT result, prev_result; @@ -636,7 +635,7 @@ static int send_results_for_file( // we found an unsent result, so try sending it. // This *should* always work. // - retval_send = possibly_send_result(result, sreq, reply, ss); + retval_send = possibly_send_result(result, sreq, reply); boinc_db.commit_transaction(); // if no app version or not enough resources, give up completely @@ -700,7 +699,7 @@ static int send_results_for_file( // static int send_new_file_work_deterministic_seeded( SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss, int& nsent, const char *start_f, const char *end_f + int& nsent, const char *start_f, const char *end_f ) { DB_RESULT result; char filename[256], min_resultname[256], query[1024]; @@ -739,9 +738,7 @@ static int send_new_file_work_deterministic_seeded( "send_new_file_work_deterministic will try filename %s\n", filename ); - retval = send_results_for_file( - filename, nsent, sreq, reply, ss, false - ); + retval = send_results_for_file(filename, nsent, sreq, reply, false); if (retval==ERR_NO_APP_VERSION || retval==ERR_INSUFFICIENT_RESOURCE) return retval; @@ -777,7 +774,7 @@ static bool is_host_slow(SCHEDULER_REQUEST& sreq) { // if it has not sent any new work. // static int send_new_file_work_deterministic( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { char start_filename[256]; int getfile_retval, nsent=0; @@ -791,7 +788,7 @@ static int send_new_file_work_deterministic( // start deterministic search with randomly chosen filename, go to // lexical maximum - send_new_file_work_deterministic_seeded(sreq, reply, ss, nsent, start_filename, NULL); + send_new_file_work_deterministic_seeded(sreq, reply, nsent, start_filename, NULL); if (nsent) { return 0; } @@ -800,7 +797,7 @@ static int send_new_file_work_deterministic( // filename, continue to randomly choosen one if (!getfile_retval && reply.work_needed(true)) { send_new_file_work_deterministic_seeded( - sreq, reply, ss, nsent, "", start_filename + sreq, reply, nsent, "", start_filename ); if (nsent) { return 0; @@ -812,7 +809,7 @@ static int send_new_file_work_deterministic( static int send_new_file_work_working_set( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { char filename[256]; int retval, nsent; @@ -824,22 +821,19 @@ static int send_new_file_work_working_set( "send_new_file_working_set will try filename %s\n", filename ); - return send_results_for_file( - filename, nsent, sreq, reply, ss, true - ); + return send_results_for_file(filename, nsent, sreq, reply, true); } // prototype static int send_old_work( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss, int t_min, int t_max + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, int t_min, int t_max ); // The host doesn't have any files for which work is available. // Pick new file to send. Returns nonzero if no work is available. // static int send_new_file_work( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { while (reply.work_needed(true)) { @@ -860,7 +854,7 @@ static int send_new_file_work( "send_new_file_work(): try to send old work\n" ); - retval_sow=send_old_work(sreq, reply, ss, start, end); + retval_sow=send_old_work(sreq, reply, start, end); if (retval_sow==ERR_NO_APP_VERSION || retval_sow==ERR_INSUFFICIENT_RESOURCE) return retval_sow; @@ -870,7 +864,7 @@ static int send_new_file_work( "send_new_file_work(%d): try to send from working set\n", retry ); retry++; - retval_snfwws=send_new_file_work_working_set(sreq, reply, ss); + retval_snfwws=send_new_file_work_working_set(sreq, reply); if (retval_snfwws==ERR_NO_APP_VERSION || retval_snfwws==ERR_INSUFFICIENT_RESOURCE) return retval_snfwws; } @@ -879,7 +873,7 @@ static int send_new_file_work( log_messages.printf(MSG_DEBUG, "send_new_file_work(): try deterministic method\n" ); - if (send_new_file_work_deterministic(sreq, reply, ss)) { + if (send_new_file_work_deterministic(sreq, reply)) { // if no work remains at all, // we learn it here and return nonzero. // @@ -899,8 +893,7 @@ static int send_new_file_work( // t_min=INT_MIN if you wish to leave off the left constraint. // static int send_old_work( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss, int t_min, int t_max + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, int t_min, int t_max ) { char buf[1024], filename[256]; int retval, extract_retval, nsent; @@ -927,7 +920,7 @@ static int send_old_work( retval = result.lookup(buf); if (!retval) { - retval = possibly_send_result(result, sreq, reply, ss); + retval = possibly_send_result(result, sreq, reply); boinc_db.commit_transaction(); if (!retval) { double age=(now-result.create_time)/3600.0; @@ -936,9 +929,7 @@ static int send_old_work( ); extract_retval=extract_filename(result.name, filename); if (!extract_retval) { - send_results_for_file( - filename, nsent, sreq, reply, ss, false - ); + send_results_for_file(filename, nsent, sreq, reply, false); } else { // David, is this right? Is this the only place in // the locality scheduler that non-locality work // @@ -985,7 +976,7 @@ bool file_info_order(const FILE_INFO& fi1, const FILE_INFO& fi2) { } void send_work_locality( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { int i, nsent, nfiles, j; @@ -1068,7 +1059,7 @@ void send_work_locality( // if (config.locality_scheduling_send_timeout && sreq.host.n_bwdown>100000) { int until=time(0)-config.locality_scheduling_send_timeout; - int retval_sow=send_old_work(sreq, reply, ss, INT_MIN, until); + int retval_sow=send_old_work(sreq, reply, INT_MIN, until); if (retval_sow==ERR_NO_APP_VERSION || retval_sow==ERR_INSUFFICIENT_RESOURCE) return; } @@ -1081,7 +1072,7 @@ void send_work_locality( if (!reply.work_needed(true)) break; FILE_INFO& fi = sreq.file_infos[k]; retval_srff=send_results_for_file( - fi.name, nsent, sreq, reply, ss, false + fi.name, nsent, sreq, reply, false ); if (retval_srff==ERR_NO_APP_VERSION || retval_srff==ERR_INSUFFICIENT_RESOURCE) return; @@ -1116,7 +1107,7 @@ void send_work_locality( // send new files if needed // if (reply.work_needed(true)) { - send_new_file_work(sreq, reply, ss); + send_new_file_work(sreq, reply); } } diff --git a/sched/sched_locality.h b/sched/sched_locality.h index f2775e274d..73fd9682d7 100644 --- a/sched/sched_locality.h +++ b/sched/sched_locality.h @@ -17,9 +17,7 @@ // or write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -extern void send_work_locality( - SCHEDULER_REQUEST&, SCHEDULER_REPLY&, SCHED_SHMEM& -); +extern void send_work_locality(SCHEDULER_REQUEST&, SCHEDULER_REPLY&); extern int decrement_disk_space_locality( WORKUNIT& wu, SCHEDULER_REQUEST& request, SCHEDULER_REPLY& reply diff --git a/sched/sched_resend.C b/sched/sched_resend.C index 0ef4a4f2c5..b879ab7355 100644 --- a/sched/sched_resend.C +++ b/sched/sched_resend.C @@ -92,9 +92,7 @@ static int possibly_give_result_new_deadline( // 3) aren't present on the host // Return true if there were any such jobs // -bool resend_lost_work( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss -) { +bool resend_lost_work(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) { DB_RESULT result; std::vectorresults; unsigned int i; @@ -140,7 +138,7 @@ bool resend_lost_work( reply.wreq.core_client_version = sreq.core_client_major_version*100 + sreq.core_client_minor_version; - retval = get_app_version(wu, app, avp, sreq, reply, ss); + retval = get_app_version(wu, app, avp, sreq, reply); if (retval) { log_messages.printf(MSG_CRITICAL, "[HOST#%d] no app version [RESULT#%d]\n", diff --git a/sched/sched_resend.h b/sched/sched_resend.h index 6ec2f60614..8392f9159a 100644 --- a/sched/sched_resend.h +++ b/sched/sched_resend.h @@ -1,4 +1,2 @@ -extern bool resend_lost_work( - SCHEDULER_REQUEST&, SCHEDULER_REPLY&, SCHED_SHMEM& -); +extern bool resend_lost_work(SCHEDULER_REQUEST&, SCHEDULER_REPLY&); diff --git a/sched/sched_send.C b/sched/sched_send.C index f72e5ed20b..c87dbb96b9 100644 --- a/sched/sched_send.C +++ b/sched/sched_send.C @@ -103,12 +103,11 @@ bool SCHEDULER_REQUEST::has_version(APP& app) { // int get_app_version( WORKUNIT& wu, APP* &app, APP_VERSION* &avp, - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ) { bool found; if (anonymous(sreq.platforms.list[0])) { - app = ss.lookup_app(wu.appid); + app = ssp->lookup_app(wu.appid); found = sreq.has_version(*app); if (!found) { log_messages.printf(MSG_DEBUG, @@ -118,7 +117,7 @@ int get_app_version( } avp = NULL; } else { - found = find_app_version(sreq, reply.wreq, wu, ss, app, avp); + found = find_app_version(sreq, reply.wreq, wu, app, avp); if (!found) { log_messages.printf(MSG_DEBUG, "Didn't find app version\n"); return ERR_NO_APP_VERSION; @@ -551,10 +550,10 @@ int insert_wu_tags(WORKUNIT& wu, APP& app) { // return false if none // bool find_app_version( - SCHEDULER_REQUEST& sreq, WORK_REQ& wreq, WORKUNIT& wu, SCHED_SHMEM& ss, + SCHEDULER_REQUEST& sreq, WORK_REQ& wreq, WORKUNIT& wu, APP*& app, APP_VERSION*& avp ) { - app = ss.lookup_app(wu.appid); + app = ssp->lookup_app(wu.appid); if (!app) { log_messages.printf(MSG_CRITICAL, "Can't find APP#%d\n", wu.appid @@ -564,7 +563,7 @@ bool find_app_version( unsigned int i; for (i=0; iid, p->id, app->min_version); + avp = ssp->lookup_app_version(app->id, p->id, app->min_version); if (avp) return true; } log_messages.printf(MSG_DEBUG, @@ -908,9 +907,7 @@ int add_result_to_reply( return 0; } -void send_work( - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, SCHED_SHMEM& ss -) { +void send_work(SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply) { char helpful[512]; reply.wreq.disk_available = max_allowable_disk(sreq, reply); @@ -954,14 +951,14 @@ void send_work( if (config.locality_scheduling) { reply.wreq.infeasible_only = false; - send_work_locality(sreq, reply, ss); + send_work_locality(sreq, reply); } else { // give top priority to results that require a 'reliable host' // if (reply.wreq.host_info.reliable) { reply.wreq.reliable_only = true; reply.wreq.infeasible_only = false; - scan_work_array(sreq, reply, ss); + scan_work_array(sreq, reply); } reply.wreq.reliable_only = false; @@ -975,17 +972,17 @@ void send_work( "[HOST#%d] will accept beta work. Scanning for beta work.\n", reply.host.id ); - scan_work_array(sreq, reply, ss); + scan_work_array(sreq, reply); } reply.wreq.beta_only = false; // give next priority to results that were infeasible for some other host // reply.wreq.infeasible_only = true; - scan_work_array(sreq, reply, ss); + scan_work_array(sreq, reply); reply.wreq.infeasible_only = false; - scan_work_array(sreq, reply, ss); + scan_work_array(sreq, reply); } log_messages.printf(MSG_NORMAL, diff --git a/sched/sched_send.h b/sched/sched_send.h index 8949b59f0f..63b709893f 100644 --- a/sched/sched_send.h +++ b/sched/sched_send.h @@ -19,13 +19,10 @@ extern int get_app_version( WORKUNIT& wu, APP* &app, APP_VERSION* &avp, - SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply, - SCHED_SHMEM& ss + SCHEDULER_REQUEST& sreq, SCHEDULER_REPLY& reply ); -extern void send_work( - SCHEDULER_REQUEST&, SCHEDULER_REPLY&, SCHED_SHMEM& -); +extern void send_work(SCHEDULER_REQUEST&, SCHEDULER_REPLY&); extern int add_result_to_reply( DB_RESULT& result, WORKUNIT& wu, SCHEDULER_REQUEST&, SCHEDULER_REPLY&, @@ -35,7 +32,7 @@ extern int add_result_to_reply( extern bool anonymous(PLATFORM*); extern bool find_app_version( - SCHEDULER_REQUEST&, WORK_REQ& wreq, WORKUNIT& wu, SCHED_SHMEM& ss, + SCHEDULER_REQUEST&, WORK_REQ& wreq, WORKUNIT& wu, APP*& app, APP_VERSION*& avp ); diff --git a/sched/transitioner.C b/sched/transitioner.C index edb87c977e..c2ecd929da 100644 --- a/sched/transitioner.C +++ b/sched/transitioner.C @@ -262,7 +262,7 @@ int handle_wu( // if WU has results with errors and no success yet, // reset homogeneous redundancy class to give other platforms a try // - if (nerrors & !(nsuccess | ninprogress)) { + if (nerrors & !(nsuccess || ninprogress)) { wu_item.hr_class = 0; }