[boinc] 01/03: Imported Upstream version 7.4.35+dfsg

Gianfranco Costamagna locutusofborg-guest at moszumanska.debian.org
Tue Dec 9 11:25:05 UTC 2014


This is an automated email from the git hooks/post-receive script.

locutusofborg-guest pushed a commit to branch experimental
in repository boinc.

commit f0ee18f45f21c2ea9b08ce85d4c4c7ac183f5166
Author: Gianfranco Costamagna <costamagnagianfranco at yahoo.it>
Date:   Tue Dec 9 11:44:32 2014 +0100

    Imported Upstream version 7.4.35+dfsg
---
 android/BOINC/AndroidManifest.xml |  4 +-
 client/client_state.cpp           | 15 ++----
 client/client_types.h             |  2 +-
 client/cpp.h                      |  5 ++
 client/cs_scheduler.cpp           |  2 +-
 client/cs_statefile.cpp           |  3 +-
 client/gpu_detect.cpp             | 31 +++++++++++--
 client/hostinfo_unix.cpp          | 97 +++++++++++++++++++++++++--------------
 client/hostinfo_win.cpp           | 10 ++--
 client/log_flags.cpp              | 18 ++++++--
 client/makefile_sim               |  2 +-
 client/result.h                   |  5 +-
 client/rr_sim.cpp                 | 15 ++++--
 client/sim.cpp                    | 10 ++--
 client/work_fetch.h               |  9 ++--
 clientgui/AdvancedFrame.cpp       | 68 ++++++++++++++-------------
 clientgui/AdvancedFrame.h         |  1 -
 clientgui/BOINCBaseView.cpp       | 69 ++++++++++++++++++++++++++++
 clientgui/BOINCBaseView.h         |  6 ++-
 clientgui/ProjectWelcomePage.cpp  | 14 +++---
 clientgui/ViewProjects.cpp        |  6 +++
 clientgui/ViewTransfers.cpp       |  7 +++
 clientgui/ViewWork.cpp            | 35 ++++++++++++++
 clientgui/WizardAttach.cpp        | 33 ++++++-------
 clientgui/WizardAttach.h          | 29 ++++++++++--
 clientgui/sg_BoincSimpleFrame.cpp | 30 +++++++++++-
 configure.ac                      |  2 +-
 doc/projects.inc                  |  3 +-
 lib/coproc.cpp                    |  1 +
 lib/coproc.h                      | 21 ++++++---
 lib/hostinfo.h                    |  6 ++-
 sched/handle_request.cpp          |  5 ++
 sched/sched_send.cpp              |  2 +-
 version.log                       |  2 +-
 34 files changed, 414 insertions(+), 154 deletions(-)

diff --git a/android/BOINC/AndroidManifest.xml b/android/BOINC/AndroidManifest.xml
index c31d591..0b5594d 100644
--- a/android/BOINC/AndroidManifest.xml
+++ b/android/BOINC/AndroidManifest.xml
@@ -20,8 +20,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="edu.berkeley.boinc"
     android:installLocation="internalOnly"
-    android:versionCode="104"
-    android:versionName="7.4.30" > <!-- installation on SD card would break boot receiver -->
+    android:versionCode="108"
+    android:versionName="7.4.35" > <!-- installation on SD card would break boot receiver -->
 
 
     <!-- Add Google Play store metadata informing the store we can run on tablets and other large screen devices -->
diff --git a/client/client_state.cpp b/client/client_state.cpp
index 16779b8..45bd9bd 100644
--- a/client/client_state.cpp
+++ b/client/client_state.cpp
@@ -418,12 +418,7 @@ int CLIENT_STATE::init() {
 
     // check for GPUs.
     //
-    for (int j=1; j<coprocs.n_rsc; j++) {
-        msg_printf(NULL, MSG_INFO, "Coprocessor specified in cc_config.xml: type %s count %d",
-            coprocs.coprocs[j].type,
-            coprocs.coprocs[j].count
-        );
-    }
+    coprocs.bound_counts();     // show GPUs described in cc_config.xml
     if (!cc_config.no_gpus
 #ifdef _WIN32
         && !executing_as_daemon
@@ -508,7 +503,7 @@ int CLIENT_STATE::init() {
     // this follows parse_state_file() since we need to have read
     // domain_name for Android
     //
-    host_info.get_host_info();
+    host_info.get_host_info(true);
     set_ncpus();
     show_host_info();
 
@@ -1156,8 +1151,6 @@ int CLIENT_STATE::link_file_info(PROJECT* p, FILE_INFO* fip) {
 
 int CLIENT_STATE::link_app_version(PROJECT* p, APP_VERSION* avp) {
     APP* app;
-    FILE_INFO* fip;
-    unsigned int i;
 
     avp->project = p;
     app = lookup_app(p, avp->app_name);
@@ -1185,9 +1178,9 @@ int CLIENT_STATE::link_app_version(PROJECT* p, APP_VERSION* avp) {
     strcpy(avp->graphics_exec_path, "");
     strcpy(avp->graphics_exec_file, "");
 
-    for (i=0; i<avp->app_files.size(); i++) {
+    for (unsigned int i=0; i<avp->app_files.size(); i++) {
         FILE_REF& file_ref = avp->app_files[i];
-        fip = lookup_file_info(p, file_ref.file_name);
+        FILE_INFO* fip = lookup_file_info(p, file_ref.file_name);
         if (!fip) {
             msg_printf(p, MSG_INTERNAL_ERROR,
                 "State file error: missing application file %s",
diff --git a/client/client_types.h b/client/client_types.h
index c7d753f..b299a7f 100644
--- a/client/client_types.h
+++ b/client/client_types.h
@@ -258,7 +258,7 @@ struct APP {
         // Can also specify in client_state.xml (for client emulator)
     int n_concurrent;
         // temp during job scheduling, to enforce max_concurrent
-    int non_excluded_instances[MAX_RSC];
+    COPROC_INSTANCE_BITMAP non_excluded_instances[MAX_RSC];
         // for each resource type, bitmap of the non-excluded instances
 #ifdef SIM
     double latency_bound;
diff --git a/client/cpp.h b/client/cpp.h
index e98abb4..aa02a51 100644
--- a/client/cpp.h
+++ b/client/cpp.h
@@ -15,6 +15,11 @@
 // You should have received a copy of the GNU Lesser General Public License
 // along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
 
+// Don't include config.h or C++ header files from here.
+// there are #defines that alter the behiour of the standard C and C++ headers.
+// In this case we need to use the "small files" environment on some unix
+// systems.  That can't be done if we include "cpp.h"
+
 #if defined(_WIN32) && !defined(__CYGWIN32__)
 
 #if defined(_WIN64) && (defined(_M_X64) || defined(__x86_64__))
diff --git a/client/cs_scheduler.cpp b/client/cs_scheduler.cpp
index f0e7b59..fb44134 100644
--- a/client/cs_scheduler.cpp
+++ b/client/cs_scheduler.cpp
@@ -210,7 +210,7 @@ int CLIENT_STATE::make_scheduler_request(PROJECT* p) {
 
     // update hardware info, and write host info
     //
-    host_info.get_host_info();
+    host_info.get_host_info(false);
     set_ncpus();
     host_info.write(mf, !cc_config.suppress_net_info, false);
 
diff --git a/client/cs_statefile.cpp b/client/cs_statefile.cpp
index 39c03d0..10c4c74 100644
--- a/client/cs_statefile.cpp
+++ b/client/cs_statefile.cpp
@@ -116,7 +116,6 @@ int CLIENT_STATE::parse_state_file() {
 int CLIENT_STATE::parse_state_file_aux(const char* fname) {
     PROJECT *project=NULL;
     int retval=0;
-    int failnum;
     string stemp;
 
     FILE* f = fopen(fname, "r");
@@ -224,6 +223,7 @@ int CLIENT_STATE::parse_state_file_aux(const char* fname) {
             // If the file had a failure before,
             // don't start another file transfer
             //
+            int failnum;
             if (fip->had_failure(failnum)) {
                 if (fip->pers_file_xfer) {
                     delete fip->pers_file_xfer;
@@ -402,6 +402,7 @@ int CLIENT_STATE::parse_state_file_aux(const char* fname) {
 #ifdef SIM
             retval = host_info.parse(xp, false);
             coprocs = host_info.coprocs;
+            coprocs.bound_counts();
 #else
             retval = host_info.parse(xp, true);
 #endif
diff --git a/client/gpu_detect.cpp b/client/gpu_detect.cpp
index 2d73b9c..0d6cb28 100644
--- a/client/gpu_detect.cpp
+++ b/client/gpu_detect.cpp
@@ -304,9 +304,11 @@ void COPROCS::correlate_gpus(
     cpu_opencls.clear();
 }
 
-// This is called from CLIENT_STATE::init() after adding NVIDIA, ATI and Intel GPUs
+// This is called from CLIENT_STATE::init()
+// after adding NVIDIA, ATI and Intel GPUs
 // If we don't care about the order of GPUs in COPROCS::coprocs[], 
 // this code could be included at the end of COPROCS::correlate_gpus().
+//
 int COPROCS::add_other_coproc_types() {
     int retval = 0;
     
@@ -318,8 +320,10 @@ int COPROCS::add_other_coproc_types() {
         }
         
         COPROC c;
-        // For other device types other than NVIDIA, ATI or Intel GPU coprocessor.
-        // we put each instance into a separate other_opencls element, so count=1.
+        // For device types other than NVIDIA, ATI or Intel GPU.
+        // we put each instance into a separate other_opencls element,
+        // so count=1.
+        //
         c.count = 1;
         c.opencl_device_count = 1;
         c.opencl_prop = other_opencls[i];
@@ -658,3 +662,24 @@ int COPROCS::launch_child_process_to_detect_gpus() {
 
     return 0;
 }
+
+// print descriptions of coprocs specified in cc_config.xml,
+// and make sure counts are <= 64
+//
+void COPROCS::bound_counts() {
+    for (int j=1; j<n_rsc; j++) {
+        msg_printf(NULL, MSG_INFO, "Coprocessor specified in cc_config.xml: type %s count %d",
+            coprocs[j].type,
+            coprocs[j].count
+        );
+        if (coprocs[j].count > MAX_COPROC_INSTANCES) {
+            msg_printf(NULL, MSG_USER_ALERT,
+                "%d instances of %s specified in cc_config.xml; max is %d",
+                coprocs[j].count,
+                coprocs[j].type,
+                MAX_COPROC_INSTANCES
+            );
+            coprocs[j].count = MAX_COPROC_INSTANCES;
+        }
+    }
+}
diff --git a/client/hostinfo_unix.cpp b/client/hostinfo_unix.cpp
index 8df69b6..bbac65c 100644
--- a/client/hostinfo_unix.cpp
+++ b/client/hostinfo_unix.cpp
@@ -15,11 +15,9 @@
 // You should have received a copy of the GNU Lesser General Public License
 // along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
 
-// There is a reason that having a file called "cpp.h" that includes config.h
-// and some of the C++ header files is bad.  That reason is because there are
-// #defines that alter the behiour of the standard C and C++ headers.  In
-// this case we need to use the "small files" environment on some unix
-// systems.  That can't be done if we include "cpp.h"
+// Functions to get host info (CPU, network, disk, mem) on unix-based systems.
+// Lots of this is system-dependent so lots of #ifdefs.
+// Try to keep this well-organized and not nested.
 
 #include "version.h"         // version numbers from autoconf
 
@@ -29,8 +27,10 @@
 #if !defined(_WIN32) || defined(__CYGWIN32__)
 
 // Access to binary files in /proc filesystem doesn't work in the 64bit
-// files environment on some systems.  None of the functions here need
-// 64bit file functions, so we'll undefine _FILE_OFFSET_BITS and _LARGE_FILES.
+// files environment on some systems.
+// None of the functions here need 64bit file functions,
+// so undefine _FILE_OFFSET_BITS and _LARGE_FILES.
+//
 #undef _FILE_OFFSET_BITS
 #undef _LARGE_FILES
 #undef _LARGEFILE_SOURCE
@@ -682,7 +682,7 @@ void use_cpuid(HOST_INFO& host) {
 #endif
 
 #ifdef __APPLE__
-static void get_cpu_info_maxosx(HOST_INFO& host) {
+static void get_cpu_info_mac(HOST_INFO& host) {
     int p_model_size = sizeof(host.p_model);
     size_t len;
 #if defined(__i386__) || defined(__x86_64__)
@@ -1254,30 +1254,13 @@ int HOST_INFO::get_virtualbox_version() {
     return 0;
 }
 
-
-// Rules:
-// - Keep code in the right place
-// - only one level of #if
+// get p_vendor, p_model, p_features
 //
-int HOST_INFO::get_host_info() {
-    int retval = get_filesystem_info(d_total, d_free);
-    if (retval) {
-        msg_printf(0, MSG_INTERNAL_ERROR,
-            "get_filesystem_info() failed: %s", boincerror(retval)
-        );
-    }
-    if (!cc_config.dont_use_vbox) {
-        get_virtualbox_version();
-    }
-
-///////////// p_vendor, p_model, p_features /////////////////
+int HOST_INFO::get_cpu_info() {
 #if LINUX_LIKE_SYSTEM
     parse_cpuinfo_linux(*this);
 #elif defined( __APPLE__)
-    int mib[2];
-    size_t len;
-
-    get_cpu_info_maxosx(*this);
+    get_cpu_info_mac(*this);
 #elif defined(__EMX__)
     CPU_INFO_t    cpuInfo;
     strlcpy( p_vendor, cpuInfo.vendor.company, sizeof(p_vendor));
@@ -1342,10 +1325,13 @@ int HOST_INFO::get_host_info() {
     use_cpuid(*this);
 #endif
 #endif
+    return 0;
+}
 
-///////////// p_ncpus /////////////////
+// get p_ncpus
+//
+int HOST_INFO::get_cpu_count() {
 
-// sysconf not working on OS2
 #if defined(ANDROID)
     // this should work on most devices
     p_ncpus = sysconf(_SC_NPROCESSORS_CONF);
@@ -1373,9 +1359,13 @@ int HOST_INFO::get_host_info() {
         p_ncpus = cpus_sys_path;
     }
 #elif defined(_SC_NPROCESSORS_ONLN) && !defined(__EMX__) && !defined(__APPLE__)
+    // sysconf not working on OS2
     p_ncpus = sysconf(_SC_NPROCESSORS_ONLN);
 #elif defined(HAVE_SYS_SYSCTL_H) && defined(CTL_HW) && defined(HW_NCPU)
     // Get number of CPUs
+    int mib[2];
+    size_t len;
+
     mib[0] = CTL_HW;
     mib[1] = HW_NCPU;
     len = sizeof(p_ncpus);
@@ -1388,8 +1378,12 @@ int HOST_INFO::get_host_info() {
 #error Need to specify a method to get number of processors
 #endif
 
-///////////// m_nbytes, m_swap /////////////////
+    return 0;
+}
 
+// get m_nbytes, m_swap
+//
+int HOST_INFO::get_memory_info() {
 #ifdef __EMX__
     {
         ULONG ulMem;
@@ -1517,11 +1511,12 @@ int HOST_INFO::get_host_info() {
 //#error Need to specify a method to obtain swap space
 #endif
 
-    get_local_network_info();
-
-    timezone = get_timezone();
+    return 0;
+}
 
-///////////// os_name, os_version /////////////////
+// get os_name, os_version
+//
+int HOST_INFO::get_os_info() {
 
 #if HAVE_SYS_UTSNAME_H
     struct utsname u;
@@ -1558,6 +1553,38 @@ int HOST_INFO::get_host_info() {
 #else
 #error Need to specify a method to obtain OS name/version
 #endif
+    return 0;
+}
+
+// This is called at startup with init=true
+// and before scheduler RPCs, with init=false.
+// In the latter case only get items that could change,
+// like disk usage and network info
+//
+int HOST_INFO::get_host_info(bool init) {
+    int retval = get_filesystem_info(d_total, d_free);
+    if (retval) {
+        msg_printf(0, MSG_INTERNAL_ERROR,
+            "get_filesystem_info() failed: %s", boincerror(retval)
+        );
+    }
+    get_local_network_info();
+
+    if (!init) return 0;
+
+    // everything after here is assumed not to change during
+    // a run of the client
+    //
+
+    if (!cc_config.dont_use_vbox) {
+        get_virtualbox_version();
+    }
+
+    get_cpu_info();
+    get_cpu_count();
+    get_memory_info();
+    timezone = get_timezone();
+    get_os_info();
 
     if (!strlen(host_cpid)) {
         generate_host_cpid();
diff --git a/client/hostinfo_win.cpp b/client/hostinfo_win.cpp
index b5cb29d..84b8332 100644
--- a/client/hostinfo_win.cpp
+++ b/client/hostinfo_win.cpp
@@ -1132,7 +1132,7 @@ int HOST_INFO::get_virtualbox_version() {
 
 // Gets host information; called on startup and before each sched RPC
 //
-int HOST_INFO::get_host_info() {
+int HOST_INFO::get_host_info(bool init) {
     get_timezone(timezone);
     int retval = get_filesystem_info(d_total, d_free);
     if (retval) {
@@ -1140,7 +1140,12 @@ int HOST_INFO::get_host_info() {
             "get_filesystem_info(): %s", boincerror(retval)
         );
     }
-    get_memory_info(m_nbytes, m_swap);
+
+    get_local_network_info();
+
+    if (!init) return 0;
+
+    ::get_memory_info(m_nbytes, m_swap);
     get_os_information(
         os_name, sizeof(os_name), os_version, sizeof(os_version)
     );
@@ -1154,7 +1159,6 @@ int HOST_INFO::get_host_info() {
         m_cache,
         p_ncpus
     );
-    get_local_network_info();
     if (!strlen(host_cpid)) {
         generate_host_cpid();
     }
diff --git a/client/log_flags.cpp b/client/log_flags.cpp
index 223176e..bcf5096 100644
--- a/client/log_flags.cpp
+++ b/client/log_flags.cpp
@@ -301,6 +301,7 @@ int CC_CONFIG::parse_options_client(XML_PARSER& xp) {
                 msg_printf_notice(NULL, false, NULL,
                     "Can't parse <coproc> element in cc_config.xml"
                 );
+                continue;
             }
             retval = config_coprocs.add(c);
             if (retval) {
@@ -592,7 +593,9 @@ void process_gpu_exclusions() {
         APP* app = gstate.apps[i];
         for (int k=1; k<coprocs.n_rsc; k++) {
             COPROC& cp = coprocs.coprocs[k];
-            app->non_excluded_instances[k] = (1<<cp.count)-1;  // all 1's
+            for (int h=0; h<cp.count; h++) {
+                app->non_excluded_instances[k] |= ((COPROC_INSTANCE_BITMAP)1)<<h;
+            }
         }
     }
 
@@ -600,18 +603,23 @@ void process_gpu_exclusions() {
         p = gstate.projects[i];
         for (int k=1; k<coprocs.n_rsc; k++) {
             COPROC& cp = coprocs.coprocs[k];
-            int all_instances = (1<<cp.count)-1;  // bitmap of 1 for all inst
+            COPROC_INSTANCE_BITMAP all_instances = 0;
+            // bitmap of 1 for all instances
+            //
+            for (int h=0; h<cp.count; h++) {
+                all_instances |= ((COPROC_INSTANCE_BITMAP)1)<<h;
+            }
             for (j=0; j<cc_config.exclude_gpus.size(); j++) {
                 EXCLUDE_GPU& eg = cc_config.exclude_gpus[j];
                 if (!eg.type.empty() && (eg.type != cp.type)) continue;
                 if (strcmp(eg.url.c_str(), p->master_url)) continue;
-                int mask;
+                COPROC_INSTANCE_BITMAP mask;
                 if (eg.device_num >= 0) {
                     int index = cp.device_num_index(eg.device_num);
                     // exclusion may refer to nonexistent GPU
                     //
                     if (index < 0) continue;
-                    mask = 1<<index;
+                    mask = ((COPROC_INSTANCE_BITMAP)1)<<index;
                 } else {
                     mask = all_instances;
                 }
@@ -652,7 +660,7 @@ void process_gpu_exclusions() {
             //
             p->rsc_pwf[k].ncoprocs_excluded = 0;
             for (int b=0; b<cp.count; b++) {
-                int mask = 1<<b;
+                COPROC_INSTANCE_BITMAP mask = ((COPROC_INSTANCE_BITMAP)1)<<b;
                 for (a=0; a<gstate.apps.size(); a++) {
                     APP* app = gstate.apps[a];
                     if (app->project != p) continue;
diff --git a/client/makefile_sim b/client/makefile_sim
index f504d9d..6af9d01 100644
--- a/client/makefile_sim
+++ b/client/makefile_sim
@@ -1,7 +1,7 @@
 # makefile for client simulator
 # DO MAKE CLEAN IN CLIENT/ and LIB/ FIRST
 
-CXXFLAGS = -g -DSIM \
+CXXFLAGS = -g -DSIM -Wall \
     -I ../lib \
     -I ..
 
diff --git a/client/result.h b/client/result.h
index 4239ab9..c96cddb 100644
--- a/client/result.h
+++ b/client/result.h
@@ -145,7 +145,10 @@ struct RESULT {
         return (avp->gpu_usage.rsc_type != 0);
     }
     inline bool uses_gpu() {
-        return coprocs.coprocs[avp->gpu_usage.rsc_type].is_gpu;
+        int rt = avp->gpu_usage.rsc_type;
+        if (!rt) return false;
+        if (coprocs.coprocs[rt].non_gpu) return false;
+        return true;
     }
     inline int resource_type() {
         return avp->gpu_usage.rsc_type;
diff --git a/client/rr_sim.cpp b/client/rr_sim.cpp
index 33a3fff..a8b7e66 100644
--- a/client/rr_sim.cpp
+++ b/client/rr_sim.cpp
@@ -64,12 +64,14 @@ inline void rsc_string(RESULT* rp, char* buf) {
 
 // set "nused" bits of the source bitmap in the dest bitmap
 //
-static inline void set_bits(int src, double nused, int& dst) {
+static inline void set_bits(
+    COPROC_INSTANCE_BITMAP src, double nused, COPROC_INSTANCE_BITMAP& dst
+) {
     // if all bits are already set, we're done
     //
     if ((src&dst) == src) return;
-    int bit = 1;
-    for (int i=0; i<32; i++) {
+    COPROC_INSTANCE_BITMAP bit = 1;
+    for (int i=0; i<MAX_COPROC_INSTANCES; i++) {
         if (nused <= 0) break;
         if (bit & src) {
             dst |= bit;
@@ -524,11 +526,14 @@ void RR_SIM::simulate() {
         RSC_WORK_FETCH& rwf = rsc_work_fetch[i];
         if (!rwf.has_exclusions) continue;
         COPROC& cp = coprocs.coprocs[i];
-        int mask = (1<<cp.count)-1;
+        COPROC_INSTANCE_BITMAP mask = 0;
+        for (int j=0; j<cp.count; j++) {
+            mask |= ((COPROC_INSTANCE_BITMAP)1)<<j;
+        }
         rwf.sim_excluded_instances = ~(rwf.sim_used_instances) & mask;
         if (log_flags.rrsim_detail) {
             msg_printf(0, MSG_INFO,
-                "[rrsim_detail] rsc %d: sim_used_inst %d mask %d sim_excluded_instances %d",
+                "[rrsim_detail] rsc %d: sim_used_inst %lld mask %lld sim_excluded_instances %lld",
                 i, rwf.sim_used_instances, mask, rwf.sim_excluded_instances
             );
         }
diff --git a/client/sim.cpp b/client/sim.cpp
index 0dab9d3..3e4e82f 100644
--- a/client/sim.cpp
+++ b/client/sim.cpp
@@ -342,7 +342,6 @@ double get_estimated_delay(RESULT* rp) {
 bool CLIENT_STATE::simulate_rpc(PROJECT* p) {
     char buf[256], buf2[256];
     vector<IP_RESULT> ip_results;
-    int infeasible_count = 0;
     vector<RESULT*> new_results;
 
     bool avail;
@@ -449,8 +448,8 @@ bool CLIENT_STATE::simulate_rpc(PROJECT* p) {
     }
 
     njobs += new_results.size();
-    msg_printf(0, MSG_INFO, "Got %d tasks", new_results.size());
-    sprintf(buf, "got %d tasks<br>", new_results.size());
+    msg_printf(0, MSG_INFO, "Got %lu tasks", new_results.size());
+    sprintf(buf, "got %lu tasks<br>", new_results.size());
     html_msg += buf;
 
     SCHEDULER_REPLY sr;
@@ -1092,7 +1091,7 @@ void simulate() {
         cc_config.rec_half_life
     );
     fprintf(summary_file, "Jobs\n");
-    for (int i=0; i<gstate.results.size(); i++) {
+    for (unsigned int i=0; i<gstate.results.size(); i++) {
         RESULT* rp = gstate.results[i];
         fprintf(summary_file,
             "   %s time left %s deadline %s\n",
@@ -1330,7 +1329,6 @@ void cull_projects() {
     for (i=0; i<gstate.app_versions.size(); i++) {
         APP_VERSION* avp = gstate.app_versions[i];
         if (avp->app->ignore) continue;
-        int rt = avp->gpu_usage.rsc_type;
     }
     for (i=0; i<gstate.apps.size(); i++) {
         APP* app = gstate.apps[i];
@@ -1527,7 +1525,7 @@ char* next_arg(int argc, char** argv, int& i) {
 }
 
 int main(int argc, char** argv) {
-    int i, retval;
+    int i;
     char buf[256];
 
     sim_results.clear();
diff --git a/client/work_fetch.h b/client/work_fetch.h
index 182820d..6c0ece6 100644
--- a/client/work_fetch.h
+++ b/client/work_fetch.h
@@ -61,6 +61,9 @@ struct RSC_WORK_FETCH;
 struct SCHEDULER_REPLY;
 struct APP_VERSION;
 
+typedef long long COPROC_INSTANCE_BITMAP;
+    // should be at least MAX_COPROC_INSTANCES (64) bits
+
 // state per (resource, project) pair
 //
 struct RSC_PROJECT_WORK_FETCH {
@@ -88,7 +91,7 @@ struct RSC_PROJECT_WORK_FETCH {
     double nused_total;     // sum of instances over all runnable jobs
     int ncoprocs_excluded;
         // number of excluded instances
-    int non_excluded_instances;
+    COPROC_INSTANCE_BITMAP non_excluded_instances;
         // bitmap of non-excluded instances
         // (i.e. instances this project's jobs can run on)
     int deadlines_missed;
@@ -200,10 +203,10 @@ struct RSC_WORK_FETCH {
         // seconds of idle instances between now and now+work_buf_total()
     double nidle_now;
     double sim_nused;
-    int sim_used_instances;
+    COPROC_INSTANCE_BITMAP sim_used_instances;
         // bitmap of instances used in simulation,
         // taking into account GPU exclusions
-    int sim_excluded_instances;
+    COPROC_INSTANCE_BITMAP sim_excluded_instances;
         // bitmap of instances not used (i.e. starved because of exclusion)
     double total_fetchable_share;
         // total RS of projects from which we could fetch jobs for this device
diff --git a/clientgui/AdvancedFrame.cpp b/clientgui/AdvancedFrame.cpp
index f6bcded..34d4dec 100644
--- a/clientgui/AdvancedFrame.cpp
+++ b/clientgui/AdvancedFrame.cpp
@@ -53,6 +53,7 @@
 #include "DlgDiagnosticLogFlags.h"
 #include "DlgGenericMessage.h"
 #include "DlgEventLog.h"
+#include "browser.h"
 #include "wizardex.h"
 #include "BOINCBaseWizard.h"
 #include "WizardAttach.h"
@@ -1541,37 +1542,6 @@ void CAdvancedFrame::OnLaunchNewInstance(wxCommandEvent& WXUNUSED(event)) {
 }
 
 
-void CAdvancedFrame::OnTest1ClickAttach(wxCommandEvent& WXUNUSED(event)) {
-    wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnTest1ClickAttach - Function Begin"));
-
-    CMainDocument* pDoc = wxGetApp().GetDocument();
-
-    wxASSERT(pDoc);
-    wxASSERT(wxDynamicCast(pDoc, CMainDocument));
-
-    // Stop all timers so that the wizard is the only thing doing anything
-    StopTimers();
-
-    CWizardAttach* pWizard = new CWizardAttach(this);
-
-    pWizard->RunSimpleProjectAttach();
-
-    if (pWizard)
-        pWizard->Destroy();
-
-    DeleteMenu();
-    CreateMenu();
-    pDoc->ForceCacheUpdate();
-    FireRefreshView();
-    ResetReminderTimers();
-
-    // Restart timers to continue normal operations.
-    StartTimers();
-
-    wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnTest1ClickAttach - Function End"));
-}
-
-
 void CAdvancedFrame::OnHelp(wxHelpEvent& event) {
     wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnHelpBOINCManager - Function Begin"));
 
@@ -1695,6 +1665,12 @@ void CAdvancedFrame::OnConnect(CFrameEvent& WXUNUSED(event)) {
     wxString strTeamName = wxEmptyString;
     wxString strDialogTitle = wxEmptyString;
     wxString strDialogDescription = wxEmptyString;
+    std::string strProjectName;
+    std::string strProjectURL;
+    std::string strProjectAuthenticator;
+    std::string strProjectInstitution;
+    std::string strProjectDescription;
+    std::string strProjectKnown;
     bool bCachedCredentials = false;
     ACCT_MGR_INFO ami;
     PROJECT_INIT_STATUS pis;
@@ -1752,7 +1728,35 @@ void CAdvancedFrame::OnConnect(CFrameEvent& WXUNUSED(event)) {
     pDoc->rpc.get_project_init_status(pis);
     pDoc->rpc.acct_mgr_info(ami);
 
-    if (ami.acct_mgr_url.size() && ami.have_credentials) {
+    if (detect_simple_account_credentials(
+            strProjectName, strProjectURL, strProjectAuthenticator, strProjectInstitution, strProjectDescription, strProjectKnown
+        )
+    ){
+        wasShown = IsShown();
+        Show();
+        wasVisible = wxGetApp().IsApplicationVisible();
+        if (!wasVisible) {
+            wxGetApp().ShowApplication(true);
+        }
+        
+        pWizard = new CWizardAttach(this);
+
+        if (pWizard->RunSimpleProjectAttach(
+                wxURI::Unescape(strProjectName),
+                wxURI::Unescape(strProjectURL),
+                wxURI::Unescape(strProjectAuthenticator),
+                wxURI::Unescape(strProjectInstitution),
+                wxURI::Unescape(strProjectDescription),
+                wxURI::Unescape(strProjectKnown)
+            )
+        ) {
+            // If successful, display the projects tab
+            m_pNotebook->SetSelection(ID_ADVTASKSVIEW - ID_ADVVIEWBASE);
+        } else {
+            // If failure, display the notices tab
+            m_pNotebook->SetSelection(ID_ADVNOTICESVIEW - ID_ADVVIEWBASE);
+        }
+    } else if (ami.acct_mgr_url.size() && ami.have_credentials) {
         // Fall through
         //
         // There isn't a need to bring up the attach wizard, the account manager will
diff --git a/clientgui/AdvancedFrame.h b/clientgui/AdvancedFrame.h
index 67b48dd..393e0d7 100644
--- a/clientgui/AdvancedFrame.h
+++ b/clientgui/AdvancedFrame.h
@@ -80,7 +80,6 @@ public:
     void OnReadConfig( wxCommandEvent& event );
     void OnEventLog( wxCommandEvent& event );
     void OnLaunchNewInstance( wxCommandEvent& event );
-    void OnTest1ClickAttach( wxCommandEvent& event );
 
     void OnHelp( wxHelpEvent& event );
     void OnHelpBOINC( wxCommandEvent& event );
diff --git a/clientgui/BOINCBaseView.cpp b/clientgui/BOINCBaseView.cpp
index 287577a..ebf6d33 100644
--- a/clientgui/BOINCBaseView.cpp
+++ b/clientgui/BOINCBaseView.cpp
@@ -316,6 +316,25 @@ bool CBOINCBaseView::OnSaveState(wxConfigBase* pConfig) {
         bReturnValue = false;
     }
 
+    // Save Column Order
+#ifdef wxHAS_LISTCTRL_COLUMN_ORDER
+    wxString strColumnOrder;
+    wxString strBuffer;
+    wxArrayInt aOrder(m_pListPane->GetColumnCount());
+
+    aOrder = m_pListPane->GetColumnsOrder();
+
+    strColumnOrder.Printf(wxT("%s"), m_aStdColNameOrder->Item(aOrder[0]));
+    
+    for (int i = 1; i < aOrder.Count(); ++i)
+    {
+        strBuffer.Printf(wxT(";%s"), m_aStdColNameOrder->Item(aOrder[i]));
+        strColumnOrder += strBuffer;
+    }
+
+    pConfig->Write(wxT("ColumnOrder"), strColumnOrder);
+#endif
+
     return bReturnValue;
 }
 
@@ -332,6 +351,16 @@ bool CBOINCBaseView::OnRestoreState(wxConfigBase* pConfig) {
     if (!m_pListPane->OnRestoreState(pConfig)) {
         return false;
     }
+
+    // Restore Column Order
+#ifdef wxHAS_LISTCTRL_COLUMN_ORDER
+    wxString strColumnOrder;
+
+    if (pConfig->Read(wxT("ColumnOrder"), &strColumnOrder)) {
+        SetListColumnOrder(strColumnOrder, ";");
+    }
+#endif
+
     return true;
 }
 
@@ -783,6 +812,46 @@ void CBOINCBaseView::RefreshTaskPane() {
 }
 
 
+void CBOINCBaseView::TokenizedStringToArray(wxString tokenized, char * delimiters, wxArrayString* array) {
+    wxString name;
+    
+    array->Clear();
+    wxStringTokenizer tok(tokenized, delimiters);
+    while (tok.HasMoreTokens())
+    {
+        name = tok.GetNextToken();
+        if (name.IsEmpty()) continue;
+        array->Add(name);
+    }
+}
+
+
+void CBOINCBaseView::SetListColumnOrder(wxString tokenized, char * delimiters) {
+#ifdef wxHAS_LISTCTRL_COLUMN_ORDER
+    wxArrayString orderArray;
+    int i, j, stdCount, orderCount;
+    int colCount = m_pListPane->GetColumnCount();
+    wxArrayInt aOrder(colCount);
+    
+    TokenizedStringToArray(tokenized, delimiters, &orderArray);
+    stdCount = m_aStdColNameOrder->GetCount();
+    wxASSERT(stdCount == colCount);
+    
+    orderCount = orderArray.GetCount();
+    wxASSERT(orderCount == colCount);   // Temporary until selective hiding implemented
+    
+    for (i=0; i<orderCount; ++i) {
+        for (j=0; j<stdCount; ++j) {
+            if (orderArray[i].IsSameAs(m_aStdColNameOrder->Item(j))) {
+                aOrder[i] = j;
+            }
+        }
+    }
+    m_pListPane->SetColumnsOrder(aOrder);
+#endif
+}
+
+
 #ifdef __WXMAC__
 // Fix Keyboard navigation on Mac
 //
diff --git a/clientgui/BOINCBaseView.h b/clientgui/BOINCBaseView.h
index 0b40d84..d837793 100644
--- a/clientgui/BOINCBaseView.h
+++ b/clientgui/BOINCBaseView.h
@@ -124,6 +124,9 @@ public:
 	void                    ClearSavedSelections();
 	void                    ClearSelections();
     void                    RefreshTaskPane();
+    
+    void                    TokenizedStringToArray(wxString tokenized, char * delimiters, wxArrayString* array);
+    void                    SetListColumnOrder(wxString tokenized, char * delimiters);
 
 #ifdef __WXMAC__
     CBOINCListCtrl*         GetListCtrl() { return m_pListPane; }
@@ -134,7 +137,8 @@ public:
 
     int                     m_iSortColumn;
     bool                    m_bReverseSort;
-
+    wxArrayString*          m_aStdColNameOrder;
+    
 private:
 
 	wxArrayString           m_arrSelectedKeys1;     //array for remembering the current selected rows by primary key column value
diff --git a/clientgui/ProjectWelcomePage.cpp b/clientgui/ProjectWelcomePage.cpp
index 24ae4ef..a9c8d7e 100644
--- a/clientgui/ProjectWelcomePage.cpp
+++ b/clientgui/ProjectWelcomePage.cpp
@@ -254,22 +254,22 @@ void CProjectWelcomePage::OnPageChanged( wxWizardExEvent& event ) {
     intro_ctrl->SetLabel(_("You have volunteered to compute for this project:"));
     project_name1_ctrl->SetLabel(_("Name:"));
     project_name2_ctrl->SetLabel(pWA->GetProjectName());
-    if (!pWA->project_inst.IsEmpty()) {
+    if (!pWA->GetProjectInstitution().IsEmpty()) {
         project_inst1_ctrl->SetLabel(_("Home:"));
-        project_inst2_ctrl->SetLabel(pWA->project_inst);
+        project_inst2_ctrl->SetLabel(pWA->GetProjectInstitution());
     }
-    if (!pWA->project_desc.IsEmpty()) {
+    if (!pWA->GetProjectDescription().IsEmpty()) {
         project_desc1_ctrl->SetLabel(_("Description:"));
-        project_desc2_ctrl->SetLabel(pWA->project_desc);
+        project_desc2_ctrl->SetLabel(pWA->GetProjectDescription());
     }
     project_url1_ctrl->SetLabel(_("URL:"));
     project_url2_ctrl->SetLabel(pWA->GetProjectURL());
-    if (!pWA->user_name.IsEmpty()) {
+    if (!pWA->GetProjectUserName().IsEmpty()) {
         user_name1_ctrl->SetLabel(_("User:"));
-        user_name2_ctrl->SetLabel(pWA->user_name);
+        user_name2_ctrl->SetLabel(pWA->GetProjectUserName());
     }
 
-    if (!pWA->known) {
+    if (!pWA->GetProjectKnown()) {
         warning_ctrl->SetLabel(_("WARNING: This project is not registered with BOINC.  Make sure you trust it before continuing."));
 
     }
diff --git a/clientgui/ViewProjects.cpp b/clientgui/ViewProjects.cpp
index f978343..f28a0fc 100644
--- a/clientgui/ViewProjects.cpp
+++ b/clientgui/ViewProjects.cpp
@@ -34,6 +34,9 @@
 
 #include "res/proj.xpm"
 
+// This string must contain internal (non-localized) column names
+// in standard order separated by a delimiter
+static char* default_column_names = "Project;Account;Team;Done;Average;Share;Status";
 
 #define COLUMN_PROJECT              0
 #define COLUMN_ACCOUNTNAME          1
@@ -220,6 +223,9 @@ CViewProjects::CViewProjects(wxNotebook* pNotebook) :
     // Create Task Pane Items
     m_pTaskPane->UpdateControls();
 
+    m_aStdColNameOrder = new wxArrayString;
+    TokenizedStringToArray(default_column_names, ";", m_aStdColNameOrder);
+    
     // Create List Pane Items
     m_pListPane->InsertColumn(COLUMN_PROJECT, _("Project"), wxLIST_FORMAT_LEFT, 150);
     m_pListPane->InsertColumn(COLUMN_ACCOUNTNAME, _("Account"), wxLIST_FORMAT_LEFT, 80);
diff --git a/clientgui/ViewTransfers.cpp b/clientgui/ViewTransfers.cpp
index 0737626..c578f41 100644
--- a/clientgui/ViewTransfers.cpp
+++ b/clientgui/ViewTransfers.cpp
@@ -34,6 +34,10 @@
 #include "res/xfer.xpm"
 
 
+// This string must contain internal (non-localized) column names
+// in standard order separated by a delimiter
+static char* default_column_names = "Project;File;Progress;Size;Elapsed;Speed;Status";
+
 #define COLUMN_PROJECT              0
 #define COLUMN_FILE                 1
 #define COLUMN_PROGRESS             2
@@ -183,6 +187,9 @@ CViewTransfers::CViewTransfers(wxNotebook* pNotebook) :
     // Create Task Pane Items
     m_pTaskPane->UpdateControls();
 
+    m_aStdColNameOrder = new wxArrayString;
+    TokenizedStringToArray(default_column_names, ";", m_aStdColNameOrder);
+    
     // Create List Pane Items
     m_pListPane->InsertColumn(COLUMN_PROJECT, _("Project"), wxLIST_FORMAT_LEFT, 125);
     m_pListPane->InsertColumn(COLUMN_FILE, _("File"), wxLIST_FORMAT_LEFT, 205);
diff --git a/clientgui/ViewWork.cpp b/clientgui/ViewWork.cpp
index 9905fd2..26eb9a9 100644
--- a/clientgui/ViewWork.cpp
+++ b/clientgui/ViewWork.cpp
@@ -36,6 +36,10 @@
 #include "res/result.xpm"
 
 
+// This string must contain internal (non-localized) column names
+// in standard order separated by a delimiter
+static char* default_column_names = "Project;Progress;Status;Elapsed;Remaining;Deadline;Application;Name";
+
 #define COLUMN_PROJECT              0
 #define COLUMN_PROGRESS             1
 #define COLUMN_STATUS               2
@@ -233,6 +237,9 @@ CViewWork::CViewWork(wxNotebook* pNotebook) :
     // Create Task Pane Items
     m_pTaskPane->UpdateControls();
 
+    m_aStdColNameOrder = new wxArrayString;
+    TokenizedStringToArray(default_column_names, ";", m_aStdColNameOrder);
+    
     // Create List Pane Items
     m_pListPane->InsertColumn(COLUMN_PROJECT, _("Project"), wxLIST_FORMAT_LEFT, 125);
     m_pListPane->InsertColumn(COLUMN_PROGRESS, _("Progress"), wxLIST_FORMAT_RIGHT, 60);
@@ -560,6 +567,25 @@ bool CViewWork::OnSaveState(wxConfigBase* pConfig) {
     pConfig->SetPath(strBaseConfigLocation);
     pConfig->Write(wxT("ActiveTasksOnly"), (pDoc->m_ActiveTasksOnly ? 1 : 0));
 
+    // Save Column Order
+#ifdef wxHAS_LISTCTRL_COLUMN_ORDER
+    wxString strColumnOrder;
+    wxString strBuffer;
+    wxArrayInt aOrder(m_pListPane->GetColumnCount());
+
+    aOrder = m_pListPane->GetColumnsOrder();
+
+    strColumnOrder.Printf(wxT("%s"), m_aStdColNameOrder->Item(aOrder[0]));
+    
+    for (int i = 1; i < aOrder.Count(); ++i)
+    {
+        strBuffer.Printf(wxT(";%s"), m_aStdColNameOrder->Item(aOrder[i]));
+        strColumnOrder += strBuffer;
+    }
+
+    pConfig->Write(wxT("ColumnOrder"), strColumnOrder);
+#endif
+
     return bReturnValue;
 }
 
@@ -587,6 +613,15 @@ bool CViewWork::OnRestoreState(wxConfigBase* pConfig) {
     pConfig->Read(wxT("ActiveTasksOnly"), &iTempValue, 0);
     pDoc->m_ActiveTasksOnly = (iTempValue != 0);
 
+    // Restore Column Order
+#ifdef wxHAS_LISTCTRL_COLUMN_ORDER
+    wxString strColumnOrder;
+
+    if (pConfig->Read(wxT("ColumnOrder"), &strColumnOrder)) {
+        SetListColumnOrder(strColumnOrder, ";");
+    }
+#endif
+
     return true;
 }
 
diff --git a/clientgui/WizardAttach.cpp b/clientgui/WizardAttach.cpp
index 6adc0df..7f5d67e 100644
--- a/clientgui/WizardAttach.cpp
+++ b/clientgui/WizardAttach.cpp
@@ -401,25 +401,22 @@ bool CWizardAttach::Run(
 /*!
  * Runs the wizard.
  */
-bool CWizardAttach::RunSimpleProjectAttach() {
-    std::string name, url, authenticator, institution, description, _known;
-    wxString strName, strURL, strAuthenticator;
-
-    if (detect_simple_account_credentials(name, url, authenticator, institution, description, _known)) {
-        strName = wxURI::Unescape(wxString(name.c_str(), wxConvUTF8));
-        strURL = wxURI::Unescape(wxString(url.c_str(), wxConvUTF8));
-        strAuthenticator = wxURI::Unescape(wxString(authenticator.c_str(), wxConvUTF8));
-
-        SetProjectName(strName);
-        SetProjectURL(strURL);
-        if (authenticator.size()) {
-            SetProjectAuthenticator(strAuthenticator);
-        }
-        project_inst = wxURI::Unescape(wxString(institution.c_str(), wxConvUTF8));
-        project_desc = wxURI::Unescape(wxString(description.c_str(), wxConvUTF8));
-
-        known = _known.length() > 0;
+bool CWizardAttach::RunSimpleProjectAttach(
+    wxString strName,
+    wxString strURL,
+    wxString strAuthenticator, 
+    wxString strInstitution,
+    wxString strDescription,
+    wxString strKnown
+) {
+    SetProjectName(strName);
+    SetProjectURL(strURL);
+    SetProjectInstitution(strInstitution);
+    SetProjectDescription(strDescription);
+    if (strAuthenticator.size()) {
+        SetProjectAuthenticator(strAuthenticator);
     }
+    SetProjectKnown(strKnown.length() > 0);
 
     return RunWizard(m_ProjectWelcomePage);
 }
diff --git a/clientgui/WizardAttach.h b/clientgui/WizardAttach.h
index 14ed1b4..3986f20 100644
--- a/clientgui/WizardAttach.h
+++ b/clientgui/WizardAttach.h
@@ -229,7 +229,14 @@ public:
     );
     
     /// Runs the wizard.
-    bool RunSimpleProjectAttach();
+    bool RunSimpleProjectAttach(
+        wxString strProjectName,
+        wxString strProjectURL,
+        wxString strAuthenticator, 
+        wxString strProjectInstitution,
+        wxString strProjectDescription,
+        wxString strKnown
+    );
     
     /// Synchronize to Account Manager
     bool SyncToAccountManager();
@@ -266,9 +273,21 @@ public:
     wxString GetProjectURL() const { return m_strProjectUrl ; }
     void SetProjectURL(wxString value) { m_strProjectUrl = value ; }
 
+    wxString GetProjectUserName() const { return m_strProjectUserName ; }
+    void SetProjectUserName(wxString value) { m_strProjectUserName = value ; }
+
     wxString GetProjectAuthenticator() const { return m_strProjectAuthenticator ; }
     void SetProjectAuthenticator(wxString value) { m_strProjectAuthenticator = value ; }
 
+    wxString GetProjectInstitution() const { return m_strProjectInstitution ; }
+    void SetProjectInstitution(wxString value) { m_strProjectInstitution = value ; }
+
+    wxString GetProjectDescription() const { return m_strProjectDescription ; }
+    void SetProjectDescription(wxString value) { m_strProjectDescription = value ; }
+
+    bool GetProjectKnown() const { return m_bProjectKnown ; }
+    void SetProjectKnown(bool value) { m_bProjectKnown = value ; }
+
     /// Should we show tooltips?
     static bool ShowToolTips();
 
@@ -319,10 +338,10 @@ public:
     wxString            m_strReturnURL;
     bool                m_bCookieRequired;
     wxString            m_strCookieFailureURL;
-    wxString            project_inst;   // institution
-    wxString            project_desc;   // description
-    wxString            user_name;
-    bool                known;
+    wxString            m_strProjectInstitution;
+    wxString            m_strProjectDescription;
+    wxString            m_strProjectUserName;
+    bool                m_bProjectKnown;
 };
 
 #endif // _WIZ_ATTACH_H_
diff --git a/clientgui/sg_BoincSimpleFrame.cpp b/clientgui/sg_BoincSimpleFrame.cpp
index 8c5e34e..1b37b5f 100755
--- a/clientgui/sg_BoincSimpleFrame.cpp
+++ b/clientgui/sg_BoincSimpleFrame.cpp
@@ -32,6 +32,7 @@
 #include "MainDocument.h"
 #include "Events.h"
 #include "BOINCBaseFrame.h"
+#include "browser.h"
 #include "wizardex.h"
 #include "BOINCBaseWizard.h"
 #include "WizardAttach.h"
@@ -678,6 +679,12 @@ void CSimpleFrame::OnConnect(CFrameEvent& WXUNUSED(event)) {
     wxString strName = wxEmptyString;
     wxString strURL = wxEmptyString;
     wxString strTeamName = wxEmptyString;
+    std::string strProjectName;
+    std::string strProjectURL;
+    std::string strProjectAuthenticator;
+    std::string strProjectInstitution;
+    std::string strProjectDescription;
+    std::string strProjectKnown;
     bool bCachedCredentials = false;
     ACCT_MGR_INFO ami;
     PROJECT_INIT_STATUS pis;
@@ -703,7 +710,28 @@ void CSimpleFrame::OnConnect(CFrameEvent& WXUNUSED(event)) {
     pDoc->rpc.get_project_init_status(pis);
     pDoc->rpc.acct_mgr_info(ami);
 
-    if (ami.acct_mgr_url.size() && ami.have_credentials) {
+    if (detect_simple_account_credentials(
+            strProjectName, strProjectURL, strProjectAuthenticator, strProjectInstitution, strProjectDescription, strProjectKnown
+        )
+    ){
+        wasShown = IsShown();
+        Show();
+        wasVisible = wxGetApp().IsApplicationVisible();
+        if (!wasVisible) {
+            wxGetApp().ShowApplication(true);
+        }
+        
+        pWizard = new CWizardAttach(this);
+
+        pWizard->RunSimpleProjectAttach(
+            wxURI::Unescape(strProjectName),
+            wxURI::Unescape(strProjectURL),
+            wxURI::Unescape(strProjectAuthenticator),
+            wxURI::Unescape(strProjectInstitution),
+            wxURI::Unescape(strProjectDescription),
+            wxURI::Unescape(strProjectKnown)
+        );
+    } else if (ami.acct_mgr_url.size() && ami.have_credentials) {
         // Fall through
         //
         // There isn't a need to bring up the attach wizard, the account manager will
diff --git a/configure.ac b/configure.ac
index 8105586..1bb4555 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ dnl not sure exactly what the minimum version is (but 2.13 wont work)
 AC_PREREQ(2.58)
 
 dnl Set the BOINC version here.  You can also use the set-version script.
-AC_INIT(BOINC, 7.4.30)
+AC_INIT(BOINC, 7.4.35)
 AC_CONFIG_MACRO_DIR([m4])
 LIBBOINC_VERSION=`echo ${PACKAGE_VERSION} | sed 's/\./:/g'`
 AC_SUBST([LIBBOINC_VERSION])
diff --git a/doc/projects.inc b/doc/projects.inc
index 0ee41e5..a4350c6 100644
--- a/doc/projects.inc
+++ b/doc/projects.inc
@@ -253,7 +253,8 @@ $astro_phys_chem = array(
             "http://pogs.theskynet.org/pogs/",
             "The International Centre for Radio Astronomy Research (Perth, Australia)",
             tra("Astronomy"),
-            tra("We will combine the spectral coverage of GALEX, Pan-STARRS1, and WISE to generate a multi-wavelength UV-optical-NIR galaxy atlas for the nearby Universe. We will measure physical parameters (such as stellar mass surface density, star formation rate surface density, attenuation, and first-order star formation history) on a resolved pixel-by-pixel basis using spectral energy distribution (SED) fitting techniques in a distributed computing mode."),
+            tra("TheSkyNet POGS is an astronomy project studying 16 different properties of galaxies, including brightness, mass, amount of dust and how fast stars are forming. We are using your processing power to conduct pixel-by-pixel calculations on multi-wavelength (ultraviolet, optical and near-infrared light) images of galaxies to produce an atlas that will help astronomers to better understand the distant universe."),
+
             "",
             "",
             "Analyze images of space"
diff --git a/lib/coproc.cpp b/lib/coproc.cpp
index 9f581f0..e017aa2 100644
--- a/lib/coproc.cpp
+++ b/lib/coproc.cpp
@@ -157,6 +157,7 @@ int COPROC::parse(XML_PARSER& xp) {
             }
             continue;
         }
+        if (xp.parse_bool("non_gpu", non_gpu)) continue;
     }
     return ERR_XML_PARSE;
 }
diff --git a/lib/coproc.h b/lib/coproc.h
index 941956c..b68c814 100644
--- a/lib/coproc.h
+++ b/lib/coproc.h
@@ -142,7 +142,7 @@ struct PCI_INFO {
 struct COPROC {
     char type[256];     // must be unique
     int count;          // how many are present
-    bool is_gpu;
+    bool non_gpu;       // coproc is not a GPU
     double peak_flops;
     double used;        // how many are in use (used by client)
     bool have_cuda;     // True if this GPU supports CUDA on this computer
@@ -198,7 +198,7 @@ struct COPROC {
         // can't just memcpy() - trashes vtable
         type[0] = 0;
         count = 0;
-        is_gpu = false;
+        non_gpu = false;
         peak_flops = 0;
         used = 0;
         have_cuda = false;
@@ -286,7 +286,6 @@ struct COPROC_NVIDIA : public COPROC {
 #endif
     COPROC_NVIDIA(): COPROC() {
         clear();
-        is_gpu = true;
     }
     void get(std::vector<std::string>& warnings);
     void correlate(
@@ -324,7 +323,6 @@ struct COPROC_ATI : public COPROC {
 #endif
     COPROC_ATI(): COPROC() {
         clear();
-        is_gpu = true;
     }
     void get(std::vector<std::string>& warnings);
     void correlate(
@@ -349,7 +347,6 @@ struct COPROC_INTEL : public COPROC {
 #endif
     COPROC_INTEL(): COPROC() {
         clear();
-        is_gpu = true;
     }
     void get(std::vector<std::string>& warnings);
     void correlate(
@@ -474,11 +471,23 @@ struct COPROCS {
         coprocs[n_rsc++] = c;
         return 0;
     }
-    COPROC* type_to_coproc(int t) {
+    void bound_counts();
+        // make sure instance counts are within legal range
+
+    COPROC* lookup_type(const char* t) {
+        for (int i=1; i<n_rsc; i++) {
+            if (!strcmp(t, coprocs[i].type)) {
+                return &coprocs[i];
+            }
+        }
+        return NULL;
+    }
+    COPROC* proc_type_to_coproc(int t) {
         switch(t) {
         case PROC_TYPE_NVIDIA_GPU: return &nvidia;
         case PROC_TYPE_AMD_GPU: return &ati;
         case PROC_TYPE_INTEL_GPU: return &intel_gpu;
+        case PROC_TYPE_MINER_ASIC: return lookup_type("miner_asic");
         }
         return NULL;
     }
diff --git a/lib/hostinfo.h b/lib/hostinfo.h
index 38d8df5..a04d08e 100644
--- a/lib/hostinfo.h
+++ b/lib/hostinfo.h
@@ -88,7 +88,11 @@ public:
 #else
     bool users_idle(bool check_all_logins, double idle_time_to_run);
 #endif
-    int get_host_info();
+    int get_host_info(bool init);
+    int get_cpu_info();
+    int get_cpu_count();
+    int get_memory_info();
+    int get_os_info();
     int get_host_battery_charge();
     int get_host_battery_state();
     int get_local_network_info();
diff --git a/sched/handle_request.cpp b/sched/handle_request.cpp
index 8a1f93b..d357791 100644
--- a/sched/handle_request.cpp
+++ b/sched/handle_request.cpp
@@ -1311,6 +1311,11 @@ void process_request(char* code_sign_key) {
             && !g_request->results_truncated
         ) {
             if (resend_lost_work()) {
+                if (config.debug_send) {
+                    log_messages.printf(MSG_NORMAL,
+                        "[send] Resent lost jobs, don't send more\n"
+                    );
+                }
                 ok_to_send_work = false;
             }
         }
diff --git a/sched/sched_send.cpp b/sched/sched_send.cpp
index 5961461..bda585f 100644
--- a/sched/sched_send.cpp
+++ b/sched/sched_send.cpp
@@ -855,7 +855,7 @@ bool work_needed(bool locality_sched) {
     if (config.debug_send) {
         char buf[256], buf2[256];
         strcpy(buf, "");
-        for (int i=1; i<NPROC_TYPES; i++) {
+        for (int i=0; i<NPROC_TYPES; i++) {
             sprintf(buf2, " %s (%.2f, %.2f)",
                 proc_type_name(i),
                 g_wreq->req_secs[i],
diff --git a/version.log b/version.log
index f794ca5..b0a6b9a 100644
--- a/version.log
+++ b/version.log
@@ -1 +1 @@
-7.4.30
+7.4.35

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-boinc/boinc.git



More information about the pkg-boinc-commits mailing list