Threadsafe Funktionen in Single-Thread-Programmen

(2011-04-27)

i3status ist ein Programm, welches Systeminformationen wie die aktuelle IP-Adresse, freien Speicherplatz und auch die Uhrzeit ausgibt. Merovius bemerkte vor einer Weile den Bug, dass die Uhrzeit unter bestimmten Umständen doppelt ausgegeben wird. Das lag daran, dass die Uhrzeit zuletzt ausgegeben wurde (also nachdem alle anderen Systeminformationen ermittelt wurden). Wenn diese Ermittlung zu lange dauert, resultiert das in einer falschen Zeitausgabe. Behoben wurde dieser Fehler also, indem man die Uhrzeit als allererstes speichert und dann später ausgibt.

Mit der neuen Version zeigte sich allerdings ein neuer Fehler: Die Uhr sprang alle paar Sekunden einfach so mal vor, mal zurück. Außerdem ging sie um wenige Stunden (!) falsch. Es stellt sich heraus: Wenn kein Netzteil am Computer angeschlossen war (er also auf Akku lief), wurde statt der Uhrzeit der Zeitpunkt angezeigt, an welchem der Akku leer ist. Das liegt daran, dass beide Ausgaben die Funktion localtime(3) nutzen, welche einen Pointer auf eine statisch allokierte struct tm zurückgibt. Der zweite Aufruf überschrieb daher die Uhrzeit des ersten Aufrufs, weswegen zweimal der Zeitpunkt des leeren Akkus angezeigt wurde.

Die Lösung war also, die threadsafe-Variante localtime_r zu benutzen – obwohl in i3status garkeine Threads verwendet werden :-).