Hallo,
Das Update für den Uni-Installer war nötig weil er bei mir große Pakte (BASIC ..) fast nicht mehr ohne Absturz installiert hat. Der Grund ist völlig unerwartet .... natürlich liegt es an den Handles ... aber eben mal anders .....
Um die Dateien zu Installieren muss ich in folgende die Sequenz ausführen
FileOpen / FileCreate
evt. noch mal FileClose und wider FileOpen
FileWrite
FileSetAttributes / ExtendedAttributes
FileClose
Jeder dieser Befehle (außer FileWrite) verbraucht kurzzeitig 10 bis 15 Handles. Da die Handles gleich wieder freigegeben werden ist das im Normalfall egal. Nur ist gleich eben nicht sofort. Das heißt, der Kernel gibt die Handles erst kurze Zeit nachdem der Befehl erledigt ist wieder frei. Wenn man aber wie ich die obige Sequenz in einer Schleife 50 Mal druchrödelt kommt es offenbar auf einigen Systemen dazu, dass die Handles schneller angefordert werden, als sie vom Kernel wieder freigegeben werden. dann geht die Handeszahl in den Keller. Die Lösung ist genauso trivial wie unschön. Ich frage am Beginn der Schleife die Anzahl der Handles ab und wenn es ca 400 weniger geworden sind schicke ich die Schleife für ne viertel Sekunde schlafen. Dann hat der Kernel Zeit die Handles freizugeben.
|
Quellcode
|
1
2
3
4
5
6
7
8
|
if ( SysGetInfo(SGIT_NUMBER_OF_FREE_HANDLES) < hanLimit ) {
// Jetzt dem System Zeit geben: 0,25 sek.
TimerSleep(15);
if ( SysGetInfo(SGIT_NUMBER_OF_FREE_HANDLES) < (hanLimit + HANDLE_EATER_LIMIT/2) ) {
// Wenn das nicht gereicht hat: nachlegen, aber richtig
TimerSleep(60); // Eine Sekunde. Das stockt jetzt schon ...
}
}
|
Wann "Auf einigen Systemen" zutrifft ist mir nicht klar. Fakt ist dass es unter swat in der VirtualBox keine Probleme gibt, unter der DOS-Box aber schon. Vielleicht hängt es von der Systemgeschwindigkeit ab?
Gruß
Rainer