Here is a diff adding a "VerboseLevel" option to parcellfun. It is against the most current svn snapshot, as of about 15 minutes ago at least ;)
Anyway, it may seem like a dumb thing, but I really need to be able to suppress the output to keep track of what is going on at higher levels (some using the backspace trick for 'counter' output). It also allows cranking up the verbosity level, which for a function like this (and many others) can be very helpful debugging. If anyone has a suggestion of a favored --diff-cmd option (less verbose or at least treating whitespace a bit more intelligently), it would be appreciated for future reference. PS: parcellfun from general 1.1.3 tar.gz posted on octave-forge breaks in an unhappy core-dump way for me (fresh octave 3.2.0 install from source on ubuntu jaunty). --- parcellfun.m (revision 5947) +++ parcellfun.m (working copy) @@ -1,17 +1,17 @@ ## Copyright (C) 2009 VZLU Prague, a.s., Czech Republic ## ## Author: Jaroslav Hajek -## +## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 3 of the License, or ## (at your option) any later version. -## +## ## This program 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 General Public License for more details. -## +## ## You should have received a copy of the GNU General Public License ## along with this program; see the file COPYING. If not, see ## <http://www.gnu.org/licenses/>. @@ -22,16 +22,17 @@ ## @deftypefnx{Function File} parcellfun (nproc, fun, @dots{}, "ErrorHandler", @var{errfunc}) ## Evaluates a function for multiple argument sets using multiple processes. ## @var{nproc} should specify the number of processes. A maximum recommended value is -## equal to number of CPUs on your machine or one less. +## equal to number of CPUs on your machine or one less. ## @var{fun} is a function handle pointing to the requested evaluating function. ## @var{a1}, @var{a2} etc. should be cell arrays of equal size. ## @var{o1}, @var{o2} etc. will be set to corresponding output arguments. ## ## The UniformOutput and ErrorHandler options are supported with meaning identical ## to @dfn{cellfun}. +## A VerboseLevel option is supported controlling level of output. 0 implies quiet and 1 is default. ## ## NOTE: this function is implemented using "fork" and a number of pipes for IPC. -## Suitable for systems with an efficient "fork" implementation (such as GNU/Linux), +## Suitable for systems with an efficient "fork" implementation (such as GNU/Linux), ## on other systems (Windows) it should be used with caution. ## Also, if you use a multithreaded BLAS, it may be wise to turn off multi-threading ## when using this function. @@ -41,11 +42,11 @@ ## especially if unhandled errors occur. Under GNU and compatible systems, the following ## shell command may be used to display orphaned Octave processes: ## ps --ppid 1 | grep octave -## +## ## @end deftypefn function varargout = parcellfun (nproc, fun, varargin) - + if (nargin < 3 || ! isscalar (nproc) || nproc <= 0) print_usage (); endif @@ -58,6 +59,7 @@ uniform_output = true; error_handler = []; + verbose_level = 1; # controls verbosity of terminal output args = varargin; nargs = length (varargin); @@ -75,12 +77,17 @@ nargs -= 2; continue; endif + if (strcmp (args{nargs-1}, "VerboseLevel")) + verbose_level = args{nargs}; + nargs -= 2; + continue; + endif break; until (nargs < 2); endif args = args(1:nargs); - + if (length (args) == 0) print_usage (); elseif (length (args) > 1 && ! size_equal (args{:})) @@ -124,6 +131,10 @@ ## parent process. fork succeded. nsuc ++; pids(i) = pid; + if( verbose_level > 1 ) + fprintf(stderr,'parcellfun: child processes %d created\n', pids(i)); + fflush (stderr); + endif elseif (pid == 0) ## child process. iproc = i; @@ -250,7 +261,7 @@ end_unwind_protect else - ## parent process. + ## parent process. njobs = numel (varargin{1}); res = cell (nargout, njobs); @@ -296,11 +307,15 @@ ## clear pending state pending(isubp) = 0; endif - fprintf (stderr, "\rparcellfun: %d/%d jobs done", pjobs - sum (pending != 0), njobs); + if( verbose_level > 0 ) + fprintf (stderr, "\rparcellfun: %d/%d jobs done", pjobs - sum (pending != 0), njobs); + fflush (stderr); + endif + endwhile + if( verbose_level > 0 ) + fputs (stderr, "\n"); fflush (stderr); - endwhile - fputs (stderr, "\n"); - fflush (stderr); + endif unwind_protect_cleanup @@ -314,6 +329,10 @@ ## close all pipe ends fclose (statr); for i = 1:nproc + if( verbose_level > 1 ) + fprintf(stderr,'parcellfun: waiting for child processes %d to close\n', pids(i)); + fflush (stderr); + end fclose (resr(i)); endfor @@ -333,7 +352,7 @@ varargout{i} = cell2mat (varargout{i}); endif endfor - + endif endfunction ------------------------------------------------------------------------------ Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensing option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment. http://p.sf.net/sfu/businessobjects _______________________________________________ Octave-dev mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/octave-dev
