diff --git a/checkin_notes b/checkin_notes index 343f6cb12a..0044bc7728 100644 --- a/checkin_notes +++ b/checkin_notes @@ -400,3 +400,10 @@ David 17 July 2007 uppercase/ upper_case.C + +David 20 July 2007 + - example_app: #ifdef graphics stuff so we can use this in boinc/apps + + example_app/ + Makefile + uc2.C diff --git a/example_app/Makefile b/example_app/Makefile index 6a14e30af3..f8cbdcb094 100644 --- a/example_app/Makefile +++ b/example_app/Makefile @@ -10,6 +10,7 @@ BOINC_API_DIR = $(BOINC_DIR)/api BOINC_LIB_DIR = $(BOINC_DIR)/lib CXXFLAGS = -g \ + -DAPP_GRAPHICS \ -I$(BOINC_DIR) \ -I$(BOINC_LIB_DIR) \ -I$(BOINC_API_DIR) \ @@ -29,7 +30,7 @@ PROGS = uc2 uc2_graphics all: $(PROGS) clean: - rm $(PROGS) + /bin/rm -f $(PROGS) uc2: uc2.o $(BOINC_API_DIR)/libboinc_api.a $(BOINC_LIB_DIR)/libboinc.a $(CXX) $(CXXFLAGS) -o uc2 uc2.o libstdc++.a -pthread -lboinc_api -lboinc diff --git a/example_app/uc2.C b/example_app/uc2.C index 7f55afa4ed..c7307fe92f 100755 --- a/example_app/uc2.C +++ b/example_app/uc2.C @@ -1,257 +1,272 @@ -// Berkeley Open Infrastructure for Network Computing -// http://boinc.berkeley.edu -// Copyright (C) 2007 University of California -// -// This is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; -// either version 2.1 of the License, or (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU Lesser General Public License for more details. -// -// To view the GNU Lesser General Public License visit -// http://www.gnu.org/copyleft/lesser.html -// or write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -// This is the primary sample BOINC application; -// it shows most of the features of the BOINC API. -// -// read "in", convert to upper case, write to "out" -// -// command line options (use for debugging various scenarios): -// -run_slow: sleep 1 second after each character; useful for debugging -// -cpu_time N: use about N CPU seconds after copying files -// -early_exit: exit(10) after 30 chars -// -early_crash: crash after 30 chars -// - -#ifdef _WIN32 -#include "boinc_win.h" -#else -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#endif - -#include "str_util.h" -#include "util.h" -#include "filesys.h" -#include "boinc_api.h" -#include "mfile.h" -#include "graphics2.h" -#include "uc2.h" - -using std::string; - -#define CHECKPOINT_FILE "upper_case_state" -#define INPUT_FILENAME "in" -#define OUTPUT_FILENAME "out" - -bool run_slow = false; -bool early_exit = false; -bool early_crash = false; -bool early_sleep = false; -double cpu_time = 20; -UC_SHMEM* shmem; - -static void use_some_cpu() { - double j = 3.14159; - int i, n = 0; - for (i=0; i<20000000; i++) { - n++; - j *= n+j-3.14159; - j /= (float)n; - } -} - -int do_checkpoint(MFILE& mf, int nchars) { - int retval; - string resolved_name; - - FILE* f = fopen("temp", "w"); - if (!f) return 1; - fprintf(f, "%d", nchars); - fclose(f); - - fprintf(stderr, "APP: upper_case checkpointing\n"); - - retval = mf.flush(); - if (retval) return retval; - boinc_resolve_filename_s(CHECKPOINT_FILE, resolved_name); - retval = boinc_rename("temp", resolved_name.c_str()); - if (retval) return retval; - - //use_some_cpu(); - fprintf(stderr, "APP: upper_case checkpoint done\n"); - return 0; -} - -void update_shmem() { - if (!shmem) return; - shmem->fraction_done = boinc_get_fraction_done(); - shmem->cpu_time = boinc_worker_thread_cpu_time();; - shmem->update_time = dtime(); - boinc_get_status(&shmem->status); -} - -int main(int argc, char **argv) { - int i; - int c, nchars = 0, retval, n; - double fsize, fd; - char input_path[512], output_path[512], chkpt_path[512]; - MFILE out; - FILE* state, *infile; - - for (i=0; i30) { - exit(-10); - } - - if (early_crash && i>30) { - boinc_crash(); - } - if (early_sleep && i>30) { - g_sleep = true; - while (1) boinc_sleep(1); - } - - if (boinc_time_to_checkpoint()) { - retval = do_checkpoint(out, nchars); - if (retval) { - fprintf(stderr, "APP: upper_case checkpoint failed %d\n", retval); - exit(retval); - } - boinc_checkpoint_completed(); - } - - fd = nchars/fsize; - if (cpu_time) fd /= 2; - boinc_fraction_done(fd); - } - - retval = out.flush(); - if (retval) { - fprintf(stderr, "APP: upper_case flush failed %d\n", retval); - exit(1); - } - - // burn up some CPU time if needed - // - if (cpu_time) { - double start = dtime(); - while (1) { - double e = dtime()-start; - if (e > cpu_time) break; - fd = .5 + .5*(e/cpu_time); - boinc_fraction_done(fd); - - if (boinc_time_to_checkpoint()) { - retval = do_checkpoint(out, nchars); - if (retval) { - fprintf(stderr, "APP: upper_case checkpoint failed %d\n", retval); - exit(1); - } - boinc_checkpoint_completed(); - } - - use_some_cpu(); - } - } - boinc_fraction_done(1); - update_shmem(); - boinc_finish(0); -} - -#ifdef _WIN32 -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR Args, int WinMode) { - LPSTR command_line; - char* argv[100]; - int argc; - - command_line = GetCommandLine(); - argc = parse_command_line( command_line, argv ); - return main(argc, argv); -} -#endif - -const char *BOINC_RCSID_33ac47a071 = "$Id: upper_case.C 12135 2007-02-21 20:04:14Z davea $"; - +// Berkeley Open Infrastructure for Network Computing +// http://boinc.berkeley.edu +// Copyright (C) 2007 University of California +// +// This is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; +// either version 2.1 of the License, or (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// To view the GNU Lesser General Public License visit +// http://www.gnu.org/copyleft/lesser.html +// or write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +// NOTE: this file exists as both +// boinc/apps/upper_case.C +// and +// boinc_samples/example_app/uc2.C +// If you update one, please update the other! + +// This is the primary sample BOINC application; +// it shows most of the features of the BOINC API. +// +// read "in", convert to upper case, write to "out" +// +// command line options (use for debugging various scenarios): +// -run_slow: sleep 1 second after each character; useful for debugging +// -cpu_time N: use about N CPU seconds after copying files +// -early_exit: exit(10) after 30 chars +// -early_crash: crash after 30 chars +// + +#ifdef _WIN32 +#include "boinc_win.h" +#else +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "str_util.h" +#include "util.h" +#include "filesys.h" +#include "boinc_api.h" +#include "mfile.h" +#include "graphics2.h" + +#ifdef APP_GRAPHICS +#include "uc2.h" +UC_SHMEM* shmem; +#endif + +using std::string; + +#define CHECKPOINT_FILE "upper_case_state" +#define INPUT_FILENAME "in" +#define OUTPUT_FILENAME "out" + +bool run_slow = false; +bool early_exit = false; +bool early_crash = false; +bool early_sleep = false; +double cpu_time = 20; + +static void use_some_cpu() { + double j = 3.14159; + int i, n = 0; + for (i=0; i<20000000; i++) { + n++; + j *= n+j-3.14159; + j /= (float)n; + } +} + +int do_checkpoint(MFILE& mf, int nchars) { + int retval; + string resolved_name; + + FILE* f = fopen("temp", "w"); + if (!f) return 1; + fprintf(f, "%d", nchars); + fclose(f); + + fprintf(stderr, "APP: upper_case checkpointing\n"); + + retval = mf.flush(); + if (retval) return retval; + boinc_resolve_filename_s(CHECKPOINT_FILE, resolved_name); + retval = boinc_rename("temp", resolved_name.c_str()); + if (retval) return retval; + + //use_some_cpu(); + fprintf(stderr, "APP: upper_case checkpoint done\n"); + return 0; +} + +#ifdef APP_GRAPHICS +void update_shmem() { + if (!shmem) return; + shmem->fraction_done = boinc_get_fraction_done(); + shmem->cpu_time = boinc_worker_thread_cpu_time();; + shmem->update_time = dtime(); + boinc_get_status(&shmem->status); +} +#endif + +int main(int argc, char **argv) { + int i; + int c, nchars = 0, retval, n; + double fsize, fd; + char input_path[512], output_path[512], chkpt_path[512]; + MFILE out; + FILE* state, *infile; + + for (i=0; i30) { + exit(-10); + } + + if (early_crash && i>30) { + boinc_crash(); + } + if (early_sleep && i>30) { + g_sleep = true; + while (1) boinc_sleep(1); + } + + if (boinc_time_to_checkpoint()) { + retval = do_checkpoint(out, nchars); + if (retval) { + fprintf(stderr, "APP: upper_case checkpoint failed %d\n", retval); + exit(retval); + } + boinc_checkpoint_completed(); + } + + fd = nchars/fsize; + if (cpu_time) fd /= 2; + boinc_fraction_done(fd); + } + + retval = out.flush(); + if (retval) { + fprintf(stderr, "APP: upper_case flush failed %d\n", retval); + exit(1); + } + + // burn up some CPU time if needed + // + if (cpu_time) { + double start = dtime(); + while (1) { + double e = dtime()-start; + if (e > cpu_time) break; + fd = .5 + .5*(e/cpu_time); + boinc_fraction_done(fd); + + if (boinc_time_to_checkpoint()) { + retval = do_checkpoint(out, nchars); + if (retval) { + fprintf(stderr, "APP: upper_case checkpoint failed %d\n", retval); + exit(1); + } + boinc_checkpoint_completed(); + } + + use_some_cpu(); + } + } + boinc_fraction_done(1); +#ifdef APP_GRAPHICS + update_shmem(); +#endif + boinc_finish(0); +} + +#ifdef _WIN32 +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR Args, int WinMode) { + LPSTR command_line; + char* argv[100]; + int argc; + + command_line = GetCommandLine(); + argc = parse_command_line( command_line, argv ); + return main(argc, argv); +} +#endif + +const char *BOINC_RCSID_33ac47a071 = "$Id: upper_case.C 12135 2007-02-21 20:04:14Z davea $"; +