Speicherleck bei Threaded GC

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

kog

Betreff: Speicherleck bei Threaded GC

BeitragFr, Apr 13, 2012 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag Zusammen

Aktuell Programmiere ich mal wieder mit Blitzmax

Nun fand ich bei meinem aktuellen Projekt heraus, das sich der Speicherbedarf meines Programms immer erhöht, immer mal wieder um ca. 100 Bytes.,
jedoch versuchte ich alle Variabeln wieder frei zu geben usw., lasse ich das Programm ohne Threaded Mode laufen, gibt es kein Leck.

Eine Ahnung woran es liegen könnte?

Freundliche Grüsse

k.o.g.

ZEVS

BeitragFr, Apr 13, 2012 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Threaded ist Beta. Ein Auszug aus BRL.LinkedList:
BlitzMax: [AUSKLAPPEN]
Type TList
'...
?Not Threaded
Method Delete()
Clear
_head._value=Null
_head._succ=Null
_head._pred=Null
End Method
?

Delete räumt ordentlich auf und sorgt so dafür, dass GC den Speicher freigeben kann.
Das ganze scheint so aber im Threaded build nicht zu klappen, deswegen hat BRL das Memory-Leak wahrscheinlich in Kauf genommen.

ZEVS

kog

BeitragFr, Apr 13, 2012 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm eigentlich kommt aktuell so beim Testcode Linkedlist nicht vor.

Es tut aktuell nur etwas per UDP Versenden:

BlitzMax: [AUSKLAPPEN]
	Method Send:Int(ip:Int=-1,port:Short=-1,imp:Byte=False)
If ip=-1 ip=2130706433
If port=-1 port=3333


Self.stream.SetRemoteIp(ip)
Self.stream.setremoteport(port)

If imp
Self.stream.WriteByte(PACKET_IMP)
Else
Self.stream.WriteByte(PACKET_NORMAL)
EndIf

Self.stream.WriteShort(Self.buffer.length)
Self.stream.writebytes(Self.buffer,Self.buffer.length)

MemFree(Self.buffer)
Self.buffer=Null

Return Self.stream.sendmsg()
End Method


BlitzMax: [AUSKLAPPEN]
	lib.header(1)
'lib.wbyte(1)
'lib.wint(5)
'lib.wfloat(1000.0)
lib.send(-1,lib.getPort(),True)


Noch eine andere vermutung oder meinst du BRL hat dies in allen seinen Modulen so gemacht?

ZEVS

BeitragFr, Apr 13, 2012 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
meinst du BRL hat dies in allen seinen Modulen so gemacht?

Nur noch in BRL.map. Aber bei Threaded wird ein anderer GC importiert:
BRL.blitz:
BlitzMax: [AUSKLAPPEN]
?Threaded
Import "blitz_gc_ms.c"
?Not Threaded
Import "blitz_gc_rc.c"
?


Eine andere Idee habe ich nicht.

ZEVS

kog

BeitragSa, Apr 14, 2012 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm Komisch,

einen Tag Später, System Neustart und neu Kompilierung funktioniert alles so wie es soll...
Und es laufen auch nur 2 Threads... gestern liefen mehr obwohl das eigentlich keinen Sinn machte :/?


Einen schönen Tag noch

Markus2

BeitragSa, Apr 14, 2012 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Lief die EXE vieleicht noch das der Compiler die nicht überschreiben konnte?
Hätte man aber im Output Fenster sehen können.

kog

BeitragSa, Apr 14, 2012 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein sie wurde jedesmal neu erstellt ohne Fehlermeldung.

aufjedenfall läuft momentan mein Netzwerk test, hier ein beispiel Code falls sich jemand genaueres dafür interessiert:

BlitzMax: [AUSKLAPPEN]

Global Lib:NetWorklib=(New Networklib).Init()
lib.SetPort()
lib.SetKey([243,123,22,34])
lib.startRecv()
lib.setprint(Print)

Repeat
Local p:TPacket=lib.NextPacket()
While p

Print(p.rbyte())
p.Clear()
p=lib.NextPacket()
Wend

lib.header(2)
lib.wbyte(Rand(0,254))
lib.send(-1,lib.getPort(),True)
Delay 5
Forever

lib.stopRecv()

mpmxyz

BeitragSa, Apr 14, 2012 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Um noch eine Sache klarzustellen:
Der im Threaded-Modus "ausgeklammerte" Code bei TMap und TList ist nicht nötig, weil BlitzMax - wie ZEVS erwähnt hat - nicht mehr den selben Garbage Collector nutzt. Der Not Threaded-Modus zählt nur Referenzen und hat daher Probleme mit Zyklen. (Das wird mit dem zu sehenden Code verhindert.)
Im Threaded Modus hat man damit keine Probleme, weil er dann nach einem Prinzip arbeitet, das die Erreichbarkeit eines Objektes beachtet.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Markus2

BeitragSo, Apr 15, 2012 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich behaupte mal das diese Zeile p.Clear() weg kann weil Du
eine Zeile drunter ein Objekt zuweist p=lib.NextPacket()

Diese While P sieht komisch aus und du nutzt NextPacket() zweimal.

Außer mit Print sehe ich nicht das Du die Pakete verarbeitest.

Code: [AUSKLAPPEN]

Local p:TPacket
Repeat
    p=lib.NextPacket()
    If p=Null Then Exit
    Print(p.rbyte())
    ...
Forever

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group