Share

sweb

Tracker: Bugs

5 FDs werden nicht aus global_fd entfernt... - ID: 1874499
Last Update: Settings changed ( aniederl )

Post from Markus Steinberger:

Hi,
Falls es noch jemanden da draußen gibt, der bei seinen Tests viele Files
erzeugt/aufmacht und wieder zumacht und dann irgendwann einen random
PageFault erhält, der sei gewarnt!

Denn die File Descriptoren werden nicht aus global_fd entfernt, nachdem sie
gelöscht wurden! Somit zeigt der Pointer ins Leere! Beim Durchsuchen der
global_fd Liste wird dann eine Methode auf einen Pointer ins Leere
aufgerufen. Man kann sich vorstellen, dass das vielleicht irgendwann einmal
zu einem Fehler führt, der genau alle 50 bis 100 Versuche auftritt und
SEHR lustig zum debuggen ist.

Nach 10h Suchen, großem Wundern und Durchforsten des ganzen FS Gewirrs
kommt man dann drauf, dass eine kleine Zeile in allen SuperBlock
Implementierungen unter removeFD auskommentiert ist:

//global_fd.remove(fd);

So einfach, nur leider schreit diese Zeile nicht:

"IM SWEB FS IST DER WURM DRIN UND NIRGENDS IST EIN KOMMENTAR, DASS DA WAS
NICHT STIMMT, ALSO SCHAU DIR ALLES DURCH, NACH AUSKOMMENTIERTEN ZEILEN!"

Ist es so schwer ein TODO oder ein ATTENTION rein zu schreiben?

*Frust abgelassen hab*

Weiter in der Geschichte:

Kommentiert man diese Zeile ein, kommt es zu noch schnellerem Chaos! - Was
wohl auch der Grund ist, warum diese Zeile auskommentiert ist!


Kleine Nachforschungen und Herumprobieren später:

In PointList.h, PointList<ContentType>::remove
verursacht die Zeile

element = find ( entry );

das Problem. Woran das liegt, weiß ich leider nicht. Naiver Weise rate ich
mal und sage, dass irgendwas mit der globalen Variable nicht richtig
hinhaut. Entweder beim Kompilieren oder bei BOCHS. Denn wenn die PointList
als Member verwendet wird geht alles ( z.B. SuperBlock::s_files_).

So ein schneller Fix sieht wie folgt aus (einfach das find in die Methode
remove kopieren:

//element = find ( entry );
//copy begin
if ( first_ == 0 )
return -1;

element = first_;
bool found = false;
do
{
if ( element->getItem() == entry )
{
found = true;
break;
}
}
while ( element != last_ && (element = element->getNext()) );
if(!found)
return -1;
//copyend


lg,
Markus Steinberger


B.Tittelbach ( btittelbach ) - 2008-01-18 10:19

5

Closed

Fixed

daniel_u

filesystem

None

Public


Comments ( 2 )




Date: 2009-10-18 15:47
Sender: aniederlProject Admin

Apparently fixed in 7036c6d2046860c38ea37c7565925cf561ebe62e

Closing.


Date: 2009-10-18 15:44
Sender: aniederlProject Admin

Is this still an issue?


Log in to comment.

Attached File

No Files Currently Attached

Changes ( 3 )

Field Old Value Date By
status_id Open 2009-10-18 15:47 aniederl
resolution_id None 2009-10-18 15:47 aniederl
close_date - 2009-10-18 15:47 aniederl