fhem.pl: preparing for nonblocking Http

git-svn-id: https://svn.fhem.de/fhem/trunk@4501 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig
2013-12-29 17:59:52 +00:00
parent 2b5c0334ce
commit 7f8f0f75f3

View File

@@ -462,10 +462,12 @@ while (1) {
foreach my $p (keys %selectlist) { foreach my $p (keys %selectlist) {
my $hash = $selectlist{$p}; my $hash = $selectlist{$p};
vec($rin, $hash->{FD}, 1) = 1 if(defined($hash->{FD})) {
if(defined($hash->{FD})); vec($rin, $hash->{FD}, 1) = 1
vec($win, $hash->{FD}, 1) = 1 if(!defined($hash->{directWriteFn}));
if(defined($hash->{FD}) && defined($hash->{$wbName})); vec($win, $hash->{FD}, 1) = 1
if(defined($hash->{directWriteFn}) || defined($hash->{$wbName}));
}
vec($ein, $hash->{EXCEPT_FD}, 1) = 1 vec($ein, $hash->{EXCEPT_FD}, 1) = 1
if(defined($hash->{"EXCEPT_FD"})); if(defined($hash->{"EXCEPT_FD"}));
} }
@@ -511,23 +513,36 @@ while (1) {
# attached again. # attached again.
foreach my $p (keys %selectlist) { foreach my $p (keys %selectlist) {
my $hash = $selectlist{$p}; my $hash = $selectlist{$p};
next if(!$hash || !$hash->{NAME} || !$defs{$hash->{NAME}}); # due to delete my $isDev = ($hash && $hash->{NAME} && $defs{$hash->{NAME}});
my $isDirect = ($hash && ($hash->{directReadFn} || $hash->{directWriteFn}));
next if(!$isDev && !$isDirect);
CallFn($hash->{NAME}, "ReadFn", $hash) if(defined($hash->{FD}) && vec($rout, $hash->{FD}, 1)) {
if(defined($hash->{FD}) && vec($rout, $hash->{FD}, 1)); if($hash->{directReadFn}) {
$hash->{directReadFn}($hash);
my $wb = $hash->{$wbName};
if(defined($wb) && defined($hash->{FD}) && 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 { } else {
if($ret == length($wb)) { CallFn($hash->{NAME}, "ReadFn", $hash);
delete($hash->{$wbName}); }
}
if((defined($hash->{$wbName}) || defined($hash->{directWriteFn})) &&
defined($hash->{FD}) && vec($wout, $hash->{FD}, 1)) {
if($hash->{directWriteFn}) {
$hash->{directWriteFn}($hash);
} else {
my $wb = $hash->{$wbName};
my $ret = syswrite($hash->{CD}, $wb);
if(!$ret || $ret < 0) {
Log 4, "Write error to $p, deleting $hash->{NAME}";
CommandDelete(undef, $hash->{NAME});
} else { } else {
$hash->{$wbName} = substr($wb, $ret); if($ret == length($wb)) {
delete($hash->{$wbName});
} else {
$hash->{$wbName} = substr($wb, $ret);
}
} }
} }
} }