Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GEOS-InfoBase-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Mittwoch, 4. Februar 2015, 17:25

Handle-Fresser - und (bald) wieder Ausspucker

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
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

2

Mittwoch, 4. Februar 2015, 19:53

Nachtrag: Entgegen meinen ersten Test kann das gleiche Problem auch bei FileDelete auftreten. Deswegen habe ich den HandesChecker bei jedem Aufruf von irgendwelchen File~ Routinen, die etwas am Dateisystem ändern, nachgerüstet.

Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Ähnliche Themen

Thema bewerten