Schleimproduktion eingestellt


Thomas Wölfer
Thomas Wölfer

25. April 2006


Nachdem ich mich fast die gesamte letzte Woche eigentlich nur mit der Produktion von Schleim befasst habe, bin ich nun so langsam wieder auf dem damm - und wollte von einem "netten" bug berichten, der mich heute einige stunden gekostet hat.

Im Faltwerksprogramm gibt es ein Modell, das es erlaubt, beliebige Eigenschaften von beliebien Objekten zu beliebigen Zeitpunkten zu verändern. Dazu gibt es in jedem Objekt eine Liste von "Clients" - diesen Clients wird mitgeteilt, wenn es eine Änderung an einer Eigenschaft eines Objektes gab. Das kann man dann z.b. benutzen, um die Darstellung des Objektes anzupassen und ähnliches.

Wird ein Objekt gelöscht, dann wird die Liste der Clients geleert. Bis vor kurzen sah der Code dazu wie folgt aus:

while( clients.Count > 0) { clients[0].Disconnect(); }

Im Zuge des Disconnect() trägt sich der Client aus der Liste "clients" aus. Aus Performance-Gründen hatten wir diese Code wie folgt abgeändert:

while( clients.Count > 0) { clients[clients.Count-1].Disconnect(); } Resultat: Sehr merkwürdige Abstürze an unerwarteten Stellen. Was war passiert?

Man sollte meinen, das die vorgenommene Änderung keinerlei Auswirkungen haben kann - eben bis auf den Performance-Gewinn. Doch leider: Diese Änderung verändert tatsächlich die Semantik der ganzen Client/Server beziehung: Plötzlich bekommen die zuletzt erzeugten Clients Ihre "Disconnect()" Nachricht, bevor die ersten Clients die bekommen.

Schon komisch, wie sich eine Menge Arbeit hinter minimalen Änderungen verstecken kann.