From: Marc M. <ma...@me...> - 2010-08-04 06:40:08
|
Submitted. On Fri, Jul 30, 2010 at 08:18:50PM -0700, Marc MERLIN wrote: > Since I asked a few times how a module could die from time to time (there > are valid reasons to do so) without being ejected from the main loop, I > looked at the code in bin/mh, and modified it as such: > > I'll be submitting if I don't get negative reviews and no one finds problems > with this approach (I tried to not change the existing behaviour, just extend what > can be done). > > Changes are: > - new show_all_errors variable so that you get to see the full error each > time it happens (by default mh only shows you the error in details the > first time, for _any_ module and then that's it). > > - show how many times an error was triggered > > - add a module_allowed_errors variable to allow each module to set > how many times they can error out before they get kicked out of the main > loop (default was and still is 10, but not it's actually clear what's > going on). > For instance, I have: > omnistat_allowed_errors = 999999999999 > hvac_allowed_errors = 999999999999 > > Now, you get: > 30/07/2010 20:14:28 MS5 inactive 1 hour > Error found in user code file: /var/local/src/misterhouse/data/mh_temp.user_code (error_count 1) > > Display call with tk disabled (-tk 0). Text=Error found in user code file: /var/local/src/misterhouse/data/mh_temp.user_code (error_count 1) > > 30/07/2010 20:14:28 : I die here at (eval 897) line 6774. > Line 6769: > Line 6770: #if(time_now "07:16 PM") { > Line 6771: # $fmr_light->set(OFF); > Line 6772: #} > Line 6773: > Line 6774: die "I die here"; > Line 6775: $Benchmark_Members{'test'} += &get_tickcount - $benchmark_tickcount if $benchmark_tickcount and $Benchmark_Members{on_off_flag}; > Line 6776: > Line 6777: } # End of test#------------------------------------------------- > Line 6778: > Line 6779: sub triggers_table_loopcode { > 0 > Can not speak for engine=MS: Phrase=Error found in user code. Check the error log. > Error logged to: /var/local/src/misterhouse/data/error.log > 30/07/2010 20:14:29 [Insteon_PLM] Parsing serial data: 026211e19d0f190006025011e19d129dfb2b0000 > 30/07/2010 20:14:29 [Insteon_PLM] Processing message for $mbr_kpl > 30/07/2010 20:14:29 [Insteon_Device] received status request report for $mbr_kpl with on-level: 0%, hops left: 2 > Display call with tk disabled (-tk 0). Text=3 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > 30/07/2010 20:14:29 [Insteon_PLM] Parsing serial data: 02620fb7050f190006 > 30/07/2010 20:14:29 MYLOG6: mbr_kpl turned off, unsetting master timer for mbr_kpl > Display call with tk disabled (-tk 0). Text=4 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=5 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=6 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=7 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=8 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > 30/07/2010 20:14:29 [Insteon_PLM] Parsing serial data: 02620f6ec20f190006 > Display call with tk disabled (-tk 0). Text=9 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=10 eval errors in test out of 10 allowed before disable > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > Display call with tk disabled (-tk 0). Text=Multiple eval errors in test. Code was disabled 0 > Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time): > I die here at (eval 897) line 6774. > 30/07/2010 20:14:29 [Insteon_PLM] Parsing serial data: 1515 > > So there you go, you can see my test code being run 10 times and disabled. > Had I wanted to, I could have gotten the loop to run it as many times > as defined in mh.private.ini before having it be disabled. > > Looks good? > > Marc > -- > "A mouse is a device used to point at the xterm you want to type in" - A.S.R. > Microsoft is to operating systems & security .... > .... what McDonalds is to gourmet cooking > Home page: http://marc.merlins.org/ > Index: ../mh/bin/mh > =================================================================== > --- ../mh/bin/mh (revision 1724) > +++ ../mh/bin/mh (working copy) > @@ -121,7 +121,7 @@ > my (@Requested_Files, @Print_Log, @Display_Log, @Speak_Log, @Error_Log); > > my ($exit_flag, $xcmd_file, %file_code_times, %file_code_times2, %file_change_times); > -my (@Loop_Code, @Sub_Code, %Sub_Code, %Run_Members, %Benchmark_Members, @Item_Code, @Item_Code_Objects); > +my (@Loop_Code, @Sub_Code, %Sub_Code, %Run_Members, %Run_Members_Error_Count, %Benchmark_Members, @Item_Code, @Item_Code_Objects); > my %custom_child_windows; #subs by window_name, display sub checks and calls sub to create window > my ($user_code, $user_code_last_good); > my (%objects_by_object_name, %file_by_object_name, %files_by_webname); > @@ -2866,12 +2866,12 @@ > eval "&loop_code"; # Not too much slower ... catches more errors > if ($@) { > # Display usercode errors only once > - if ($usercode_error_flag) { > - print "Error in user code: $@"; > + if ($usercode_error_flag and not $main::config_parms{"show_all_errors"} eq "yes") { > + print "Error in user code shown in short form (set show_all_errors=yes in mh.private.init to get in full form each time):\n$@"; > } > else { > $usercode_error_flag++; > - my $error = "Error found in user code file: $config_parms{data_dir}/mh_temp.user_code\n\n"; > + my $error = "Error found in user code file: $config_parms{data_dir}/mh_temp.user_code (error_count $usercode_error_flag)\n\n"; > $error .= &eval_user_code_error($@, $user_code); > print $error; > > @@ -4964,14 +4964,26 @@ > sub read_user_code_loopcode { > my ($member_name, $code) = @_; > my $sub_name = "${member_name}_loopcode"; > + my $allowed_errors; > + > + # Allows to set omnistat_allowed_errors = 1000000 in config file to keep running despite errors > + $allowed_errors = $main::config_parms{${member_name}."_allowed_errors"}; > + if (not defined $allowed_errors) { > + $allowed_errors = 10; > + } else { > + print_log "$member_name has $allowed_errors allowed errors before being disabled"; > + } > $sub_name =~ s/[- ]/_/g; # Legalize sub name > my $debug_print = ''; > $debug_print = "print ' $member_name' if \$Debug{user_code};\n"; > return ($sub_name, "#-------------------------------------------------\n\n" . > "sub $sub_name {\n $debug_print" . > - " if (\$Run_Members{'$member_name'} > 10) { # Check for too many eval errors\n" . > + " if (\$Run_Members{'$member_name'} > $allowed_errors) { # Check for too many eval errors\n" . > " display('Multiple eval errors in $member_name. Code was disabled', 0);" . > - " \$Run_Members{'$member_name'} = 0; return;\n }\n" . > + " \$Run_Members{'$member_name'} = 0; return;\n }". > + " elsif (\$Run_Members{'$member_name'} > 2 and \$Run_Members{'$member_name'} != \$Run_Members_Error_Count{$member_name} ) {\n". > + " display(\$Run_Members{'$member_name'}.' eval errors in $member_name out of $allowed_errors allowed before disable') }\n". > + " \$Run_Members_Error_Count{$member_name} = \$Run_Members{'$member_name'};\n". > " my \$benchmark_tickcount = &get_tickcount if \$Benchmark_Members{on_off_flag};\n" . > # " print \"db rl=\$Reload m=$member_name\n\" if \$Reload;\n" . > $code . > ------------------------------------------------------------------------------ > The Palm PDK Hot Apps Program offers developers who use the > Plug-In Development Kit to bring their C/C++ apps to Palm for a share > of $1 Million in cash or HP Products. Visit us here for more details: > http://p.sf.net/sfu/dev2dev-palm > ________________________________________________________ > To unsubscribe from this list, go to: http://sourceforge.net/mail/?group_id=1365 > -- "A mouse is a device used to point at the xterm you want to type in" - A.S.R. Microsoft is to operating systems & security .... .... what McDonalds is to gourmet cooking Home page: http://marc.merlins.org/ |