directWriteFn

Begonnen von herrmannj, 07 März 2016, 21:34:22

Vorheriges Thema - Nächstes Thema

herrmannj

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

herrmannj

als die directWriteFn wird dann ohne Unterbrechung immer sofort und dauernd vom select aufgerufen, das select wartet also auf nichts anderes mehr.

vg
jeorg

rudolfkoenig

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.

herrmannj

ja, so mach ichs auch auktuell (temporär setzen).

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

vg
joerg