2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

fhem.pl: EXCEPT_FD bugfix

git-svn-id: https://svn.fhem.de/fhem/trunk@4188 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2013-11-09 13:45:34 +00:00
parent 6f5d7a5431
commit e2737c0e80

View File

@ -200,6 +200,7 @@ my $namedef =
"- a range separated by dash (-)\n"; "- a range separated by dash (-)\n";
my @cmdList; # Remaining commands in a chain. Used by sleep my @cmdList; # Remaining commands in a chain. Used by sleep
my $evalSpecials; # Used by EvalSpecials->AnalyzeCommand parameter passing my $evalSpecials; # Used by EvalSpecials->AnalyzeCommand parameter passing
my $wbName = ".WRITEBUFFER";
$init_done = 0; $init_done = 0;
@ -455,17 +456,23 @@ sub MAIN {MAIN:}; #Dummy
my $errcount= 0; my $errcount= 0;
while (1) { while (1) {
my ($rout, $rin) = ('', ''); my ($rout,$rin, $wout,$win, $eout,$ein) = ('','', '','', '','');
my $timeout = HandleTimeout(); my $timeout = HandleTimeout();
foreach my $p (keys %selectlist) { foreach my $p (keys %selectlist) {
vec($rin, $selectlist{$p}{FD}, 1) = 1; my $hash = $selectlist{$p};
vec($rin, $hash->{FD}, 1) = 1
if($hash->{FD});
vec($win, $hash->{FD}, 1) = 1
if($hash->{FD} && defined($hash->{$wbName}));
vec($ein, $hash->{EXCEPT_FD}, 1) = 1
if(defined($hash->{"EXCEPT_FD"}));
} }
$timeout = $readytimeout if(keys(%readyfnlist) && $timeout = $readytimeout if(keys(%readyfnlist) &&
(!defined($timeout) || $timeout > $readytimeout)); (!defined($timeout) || $timeout > $readytimeout));
$timeout = 5 if $winService->{AsAService} && $timeout > 5; $timeout = 5 if $winService->{AsAService} && $timeout > 5;
my $nfound = select($rout=$rin, undef, undef, $timeout); my $nfound = select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
$winService->{serviceCheck}->() if($winService->{serviceCheck}); $winService->{serviceCheck}->() if($winService->{serviceCheck});
CommandShutdown(undef, undef) if($sig_term); CommandShutdown(undef, undef) if($sig_term);
@ -503,11 +510,32 @@ while (1) {
# reported by select, but is used by unix too, to check if the device is # reported by select, but is used by unix too, to check if the device is
# attached again. # attached again.
foreach my $p (keys %selectlist) { foreach my $p (keys %selectlist) {
next if(!$selectlist{$p} || !$selectlist{$p}{NAME}); # due to rereadcfg/del my $hash = $selectlist{$p};
next if(!$hash || !$hash->{NAME}); # due to rereadcfg/del
CallFn($selectlist{$p}{NAME}, "ReadFn", $selectlist{$p}) CallFn($hash->{NAME}, "ReadFn", $hash)
if(vec($rout, $selectlist{$p}{FD}, 1)); if(vec($rout, $hash->{FD}, 1));
my $wb = $hash->{$wbName};
if(defined($wb) && vec($wout, $hash->{FD}, 1)) {
my $ret = syswrite($hash->{CD}, $wb);
if(!$ret || $ret < 0) {
Log 4, "Write error to $p, deleting $hash->{NAME}";
CommandDelete(undef, $hash->{NAME});
} else {
if($ret == length($wb)) {
delete($hash->{$wbName});
} else {
$hash->{$wbName} = substr($wb, $ret);
}
}
}
if(defined($hash->{"EXCEPT_FD"}) && vec($eout, $hash->{EXCEPT_FD}, 1)) {
CallFn($hash->{NAME}, "ExceptFn", $hash);
}
} }
foreach my $p (keys %readyfnlist) { foreach my $p (keys %readyfnlist) {
next if(!$readyfnlist{$p}); # due to rereadcfg / delete next if(!$readyfnlist{$p}); # due to rereadcfg / delete
@ -1528,7 +1556,7 @@ CommandDeleteAttr($$)
$a[0] = $sdev; $a[0] = $sdev;
if($a[1] eq "userReadings") { if($a[1] && $a[1] eq "userReadings") {
delete($defs{$sdev}{'.userReadings'}); delete($defs{$sdev}{'.userReadings'});
} }
@ -2534,7 +2562,8 @@ DoTrigger($$@)
if($hash->{CHANGED}) { # It gets deleted sometimes (?) if($hash->{CHANGED}) { # It gets deleted sometimes (?)
$max = int(@{$hash->{CHANGED}}); # can be enriched in the notifies $max = int(@{$hash->{CHANGED}}); # can be enriched in the notifies
foreach my $c (keys %inform) { foreach my $c (keys %inform) {
if(!$defs{$c} || $defs{$c}{NR} != $inform{$c}{NR}) { my $dc = $defs{$c};
if(!$dc || $dc->{NR} != $inform{$c}{NR}) {
delete($inform{$c}); delete($inform{$c});
next; next;
} }
@ -2548,9 +2577,8 @@ DoTrigger($$@)
for(my $i = 0; $i < $max; $i++) { for(my $i = 0; $i < $max; $i++) {
my $state = $hash->{CHANGED}[$i]; my $state = $hash->{CHANGED}[$i];
next if($re && !($dev =~ m/$re/ || "$dev:$state" =~ m/$re/)); next if($re && !($dev =~ m/$re/ || "$dev:$state" =~ m/$re/));
syswrite($defs{$c}{CD}, addToWritebuffer($dc,($inform{$c}{type} eq "timer" ? "$tn " : "").
($inform{$c}{type} eq "timer" ? "$tn " : "") . "$hash->{TYPE} $dev $state\n");
"$hash->{TYPE} $dev $state\n");
} }
} }
} }
@ -3558,4 +3586,16 @@ Debug($) {
Log 1, "DEBUG>" . $msg; Log 1, "DEBUG>" . $msg;
} }
sub
addToWritebuffer($$)
{
my ($hash, $txt) = @_;
if(!$hash->{$wbName}) {
$hash->{$wbName} = $txt;
} elsif(length($hash->{$wbName}) < 102400) {
$hash->{$wbName} .= $txt;
}
}
1; 1;