FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: herrmannj am 07 März 2016, 21:34:22

Titel: directWriteFn
Beitrag von: herrmannj am 07 März 2016, 21:34:22
Hallo,

in fhem.pl in der main loop, beim setzen von $win für das select: (ab #588)
  foreach my $p (keys %selectlist) {
    my $hash = $selectlist{$p};
    if(defined($hash->{FD})) {
      vec($rin, $hash->{FD}, 1) = 1
        if(!defined($hash->{directWriteFn}) && !$hash->{wantWrite} );
      vec($win, $hash->{FD}, 1) = 1
        if( (defined($hash->{directWriteFn}) ||
             defined($hash->{$wbName}) ||
             $hash->{wantWrite} ) && !$hash->{wantRead} );
    }


wird $win auf den FD gesetzt sobald eine directWriteFn vorhanden ist: (#594)
if( (defined($hash->{directWriteFn}) ||

Das ist mMn nicht korrekt da es dazu führt das die zugehörige directWriteFn ständig aufgerufen wird, egal ob "Schreibbedarf" besteht oder nicht.

Die setzen von $win zwei Zeilen tiefer (  $hash->{wantWrite} ) sollte imho reichen. Ich bin bin mir sicher ob ich alle use-case durchschaue sehe allerdings keinen vernünftigen Weg die directWriteFn so zu benutzen

Darf ich einen patch erstellen um die directWriteFn in Zeile 594 zu entfernen ?

Danke und Grüße
Jörg
Titel: Antw:directWriteFn
Beitrag von: herrmannj am 07 März 2016, 21:48:46
als die directWriteFn wird dann ohne Unterbrechung immer sofort und dauernd vom select aufgerufen, das select wartet also auf nichts anderes mehr.

vg
jeorg
Titel: Antw:directWriteFn
Beitrag von: rudolfkoenig am 08 März 2016, 09:43:07
directWriteFn wird z.Zt. nur vom HttpUtils.pm aufgerufen, und da ist sie einem temporaeren Funktion zugewiesen. Wenn das Schreiben erledigt ist, wird der Hash-Eintrag entfernt. Nach deinem Aenderungsvorschlag wuerde HTTP nonblocking nicht mehr funktionieren. Achtung: wantWrite hat mit directWriteFn nichts zu tun, das kommt aus der SSL-Ecke.

Wenn man directWriteFn verwenden will, dann setzt man den Hash-Eintrag solange man was zu schreiben hat, und danach loescht man es.
Titel: Antw:directWriteFn
Beitrag von: herrmannj am 08 März 2016, 10:09:59
ja, so mach ichs auch auktuell (temporär setzen).

Dann passt das, Danke für Erklärung.

vg
joerg