Hallo ! Am Montag, 5. Dezember 2005 09:40 schrieb Martin Langer:
Hallo Sascha,
Mit wait_event_interruptible_timeout() habe ich auch noch nicht gearbeitet, nur mit wait_event_interruptible(). Diese Funktion geht aber schlafen, BIS die Bedingung erfuellt ist und nicht solange die Bedingung erfuellt ist. Ich habe mir jetzt noch einmal alles in Ruhe im "Kernelbuch" durchgelesen und habe es jetzt auch so, wie Du es beschrieben hast, verstanden. Ich dachte dass wait_event_interruptible_timeout() sich ähnlich wie interruptible_sleep_on_timeout() verhält - also nur von AUSSEN (bzw. durch das Timeout) aufgeweckt wird und die Bedingung nur EINMAL (zur Sicherheit) überprüft wird. Da hab ich mich wohl etwas verwirren lassen ;-) Nun gut, das was wait_event_interruptible_timeout() macht, will ich (vorerst) nicht - ich verwende erstmal wieder interruptible_sleep_on_timeout(). Die Möglichkeit der Race-Condition ist bei mir praktisch nicht gegeben. Der Code, der zwischen der Bedingung und interruptible_sleep_on_timeout() steht, kann selbst auf einem alten Rechner im Normalfall bis zu 1000mal zwischen 2 Interrupts ausgeführt werden. Und wenn's doch Probleme gibt, gibt's ja immer noch das Timeout. Die Daten unterliegen keinen Echzeitanforderungen. In diesem Extremfall kann der Benutzer im Userspace auch 10 hundertstel Sekunden länger warten ;-)
Wie ist wait deklariert? Ich verwende DECLARE_WAIT_QUEUE_HEAD(). Nein, ich habe sie mit wait_queue_head_t wait deklariert und initialisiert mit init_waitqueue_head( &wait ) . (Ich glaube das ist egal.) ... PS. Ich wuerde ueberlegen, den Interrupthandler in einen Ringspeicher schreiben zu lassen, statt beim Lesen eine Schleife zu verwenden.-- ... Das mache ich auch. Der IRQ-Handler liest die Zeichen einzeln vom Gerät, schreibt sie in den Ringpuffer und weckt dann die Lese-Funktion, die diese Zeichen auswertet und in den Userspace transferiert. (Naja, letzlich befindet sich immer nur ein Zeichen im Ringspeicher)
Ich Danke Dir ! Habe mich da am Wochenende völlig festgebissen. Oftmals ist es wirklich besser, erstmal alles beiseite zu legen, eine Nacht drüber zu schlafen und es von jemand anderem nochmal erklärt zu bekommen. Gruß Sascha