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:
parent
6f5d7a5431
commit
e2737c0e80
62
fhem/fhem.pl
62
fhem/fhem.pl
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user