Gleichzeitiges Lesen mehrer IOWs ohne polling

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Gleichzeitiges Lesen mehrer IOWs ohne polling

Post by hiasl »

Hallo,

ich habe mir die Schnittstellen zum iowkit angesehen und festgestellt, dass die Bibliothek zwar mehrere IoWarriors handhaben, aber nicht gleichzeitig von allen wartend Lesen kann.

Zumindest unter Linux ist es möglich - sofern man direkt über die devices zugreift - mittels select() auf eine/mehrere Veränderungen zu warten. Ist das unter Windows auch möglich und könnte man nicht die API entsprechend erweitern? Für jeden IoWarrior einen extra Thread aufzusetzen ist zwar möglich, aber...

Ciao
Hiasl
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo hiasl,

ja wenn es unter Vista endlich ein select() geben würde, könnte man sich das Upgrade von XP glatt überlegen :-)

Mit der Funktion IowKit.ReadNonBlocking() kommt man aber eigentlich auch ganz gut zurecht.
Ein einzelner Thread fragt alle IOWarrior nach neuen Daten ab, wenn man bei keinem der Geräte etwas lesen konnte, legt man den Thread für einige Zeit schlafen.
Die minimale Zeitspanne zwischen 2 Reports vom IOWarrior ist festgelegt(8ms Iow24/40 ; 1ms Iow56). Weiterhin werden 128 Reports gepuffert. Wenn man also nicht darauf angewiesen ist extrem schnell auf Reports zu reagieren, könnte man den Thread durchaus mal 100ms schlafen legen.

Eberhard
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Post by hiasl »

Nunja, zu Vista schweige ich lieber mal ;)

Könnte das nicht die Bibliothek OS-abhängig übernehmen? Im Falle Linux (und Mac? Ist doch bestimmt Posix) select() und bei Windows ein interner Thread, der fröhlich pollt. "IowKitMultiRead" klingt doch toll, oder? :) Liefert einfach ein handle + Report und die Sache passt.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Eine solche Funktion in einer eigenen Anwendung zu implementieren ist eigentlich auch nicht so schwierig
Als Parameter
Ein Array von Handles für die IOWarrior,
Zeiger auf ein Handle für den IOWarrior von dem evtl.gelesen wurde,
Zeiger auf einen Datenpuffer in den evtl. neue Daten geschrieben werden
Return true wenn was gelesen wurde.
In der Funktion auf alle Handle ReadNonBlocking machen.

OS-Unabhängig ist immer schwierig.
wenn man z.B. feststellen will ob ein IOWarrior eingesteckt oder entfernt wurde ist das unter Linux (dank udev) ein Klacks. Unter windows muß man da einige Klimmzüge machen.

Eberhard
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Post by hiasl »

Du hast recht, das ist nicht wirklich schwer zu implementieren.
Nach meinem Verständnis ist das halt eigentlich Treibersache. Zumal es sonst ja jeder implementieren muss, der mehrere IOWs am Start hat (und pollen für ungünstig hält). Und die Kaskadierbarkeit von bis zu 8/16(?) Geräten ist doch gerade ein besonderes Merkmal.

Aber kein Problem, vielleicht bastle ich selber an der lib rum...
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

hiasl wrote:Aber kein Problem, vielleicht bastle ich selber an der lib rum...
Genau dafuer ist die Lib auch gedacht. Als Beispiel wie man es machen koennte, um eigene Implementierungen anzuregen.

Die Iowkit-1.x-Library wird bestimmt nicht in diese Richtung weiterentwickelt.
Die 2.0 Library hhingegen wird Callbacks bei eintreffenden Daten haben und braucht daher man kein MultiRead. Intern wird das mit zwei Lesethreads pro IO-Warrior erreicht. Es wird allerdings noch bis weit ins naechste Jahr dauern bis da etwas fertig ist.
Post Reply