amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > speicherveluste beim starten von wb [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

15.07.2009, 10:29 Uhr

AGSzabo
Posts: 1663
Nutzer
hi,

wenn ich mein programm vom cli starte, geht alles gut. aber beim starten von wb (ueber icon) gibts beim beenden einen speicherverlust. warum? ist das betriebssystembedingt oder ist mein startupcode fehlerhaft? allerdings, wenn ich den aufruf des eigentlichen programms aus dem startupcode asuklammere, geht allein durch den startupcode kein speicher verloren! ich wüsste aber nicht, was ich im hauptcode habe, da es vom cli aus ohne verluste funktioniert!

code:
startup:
		pushm	d0/a0

		move.l	4.w,a6

		; get wbmsg

		sub.l   a1,a1
		jsr	_LVOFindTask(a6)
		lea	_task(pc),a0
		move.l	d0,(a0)
		move.l	d0,a4
		tst.l	pr_CLI(a4)
		bne.b	.fromcli
		lea	pr_MsgPort(a4),a0
		jsr	_LVOWaitPort(A6)
		lea	pr_MsgPort(a4),a0
		jsr	_LVOGetMsg(A6)
		lea	wbmsg(pc),a0
		move.l	d0,(a0)
		beq.b	.fromcli
		addq.l	#8,a7
	;	lea	defaultargs(pc),a2
	;	moveq	#2,d2
		bra.b	call

.fromcli	popm	d2/a2

		move.l	4.w,a6
		moveq	#39,d0
		lea	_dosname(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,_dosbase
		beq.b	replywbmsg

		move.l	d0,a6
		jsr	-492(a6)			; _LVOCli
		move.l	d0,a0
		move.l	cli_Module(a0),segment
		clr.l	cli_Module(a0)
		lea	proctags(pc),a0
		move.l	a0,d1
		jsr	-498(a6)	; _LVOCreateNewProc

		bra.b	ende

call		jsr	Program

		move.l	4.w,a6
		move.l	segment(pc),d0 
		beq.b	replywbmsg
		jsr	_LVOForbid(a6)
		move.l	segment(pc),d1
		move.l	_dosbase(pc),a6
		jsr	_LVOUnLoadSeg(a6)

		move.l	4.w,a6
		move.l	_dosbase(pc),d1
		beq.b	replywbmsg
		move.l	d1,a1
		jsr	_LVOCloseLibrary(a6)

replywbmsg	move.l	wbmsg(pc),d2
		beq.b   ende
		move.l	4.w,a6
		jsr	_LVOForbid(a6)
		move.l  d2,a1
		jsr	_LVOReplyMsg(a6)

ende		move.l	_errorcode(pc),d0
		rts

proctags	dc.l	NP_Entry,call
		dc.l	NP_Name,procname
		dc.l	TAG_END


ps: das detachen vom task vom cli-prozess hab ich von thomas' beispielseite!

pps: leider sind bei mir in den dos-includes (dos_lib.i) die neueren befehle nicht drin, obwohl ich das 3.9 ndk habe. wo sind die denn?

--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 15.07.2009 um 11:12 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 11:31 Uhr

thomas
Posts: 7718
Nutzer
@AGSzabo:

Du müßtest eigentlich ein Problem mit dem Stack-Pointer haben. Du schiebst am Anfang zwei Register auf den Stack, holst die aber nur zurück, wenn du vom CLI aufgerufen wurdest. Eigentlich müßtest du bei WB-Start am Ende immer abstürzen.

Im Übrigen hast du da einige unnötige Checks drin. Z.B. prüfst du am Anfang, ob du eine Message bekommen hast. Vorher rufst du aber WaitPort auf, das genau so lange wartet, bis eine Message kommt. Es kann also nicht passieren, daß keine kommt.

Das gleiche beim CloseLibrary, da prüfst du, ob DosBase gesetzt ist, hast sie aber genau davor für UnLoadSeg benutzt. Kann also nicht sein, daß sie an der Stelle nicht gesetzt ist, denn dann wäre UnLoadSeg schon abgestürzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 13:10 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:
> holst die aber nur zurück, wenn du vom CLI aufgerufen wurdest.

wenn es von der wb kommt ist da ein addq.l #8,a7


nochwas: nach dem unloadseg müsste eigentlich der rest des programms aus der speicherliste entfernt sein und frei gegeben sein, also evtl üeberschrieben! was meinst du?

--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 15.07.2009 um 13:14 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 14:46 Uhr

thomas
Posts: 7718
Nutzer
@AGSzabo:

Zitat:
wenn es von der wb kommt ist da ein addq.l #8,a7

Ups, das habe ich übersehen.

Zitat:
nochwas: nach dem unloadseg müsste eigentlich der rest des programms aus der speicherliste entfernt sein und frei gegeben sein, also evtl üeberschrieben! was meinst du?

Überschrieben kann es nur werden, wenn jemand da ist, der es überschreibt. Da du aber mit Forbid das Multitasking unterbunden hast, ist das eher unwahrscheinlich.

Daß es unter OS 4+ evtl. nicht läuft, weil freigegebener Speicher sofort ungültig wird, ist eine andere Sache. Anders ist es mit 68k-Mitteln aber meines Wissens nicht machbar.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 14:48 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

wie macht es denn os4/ppc?

meine librarys macht es auch nicht anders als das prog vorhin und die stürzt unter os4 nicht ab. wobei die lib KEIN Forbid() macht:

(code geht weiter nachdem freelibmem aufgerufen wurde)

code:
libExpunge	; a6 *xfrBase
		tst.w	LIB_OPENCNT(a6)
		beq.b	.doit
		bset	#LIBB_DELEXP,LIB_FLAGS(a6)
		bra.b	return_null

.doit		movem.l	d2/a5/a6,-(a7)
		move.l	a6,a5
		move.l	xuiB_sysbase(a5),a6
		move.l	seglist(pc),d2
		move.l	a5,a1
		jsr	_LVORemove(a6)
		bsr	FreeXUI
		bsr.b	freelibmem
		move.l	d2,d0
		movem.l	(a7)+,d2/a5/a6
		; return d0 *seglist of this library
		rts
libNull
return_null	moveq	#0,d0
		rts

freelibmem	moveq	#0,d0
		move.w	LIB_NEGSIZE(a5),d0
		move.l	a5,a1
		sub.l	d0,a1
		add.w	LIB_POSSIZE(a5),d0
		jmp	_LVOFreeMem(a6)


ps: darf ein task eine library 2 x öffnen? (mit 2 x schliessen)


--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 15.07.2009 um 15:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 15:07 Uhr

tboeckel
Posts: 124
Nutzer
Zitat:
Original von AGSzabo:
ps: darf ein task eine library 2 x öffnen? (mit 2 x schliessen)

Was spricht dagegen? Eine Library kann theoretisch 65535 mal geöffnet werden, egal von wem. Man muß beachten, daß unterschiedliche Tasks/Prozesse auch unterschiedliche Basisadressen bekommen können.

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 15:20 Uhr

thomas
Posts: 7718
Nutzer
@AGSzabo:

Zitat:
code geht weiter nachdem freelibmem aufgerufen wurde

Das FreeMem gibt aber auch nicht den Code frei, sondern nur die Library-Base. Auf die Base darfst du nach dem FreeMem nicht mehr zugreifen. So oder so.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

15.07.2009, 16:04 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
meine librarys macht es auch nicht anders als das prog vorhin und die stürzt unter os4 nicht ab. wobei die lib KEIN Forbid() macht:

libExpunge wird natürlich nur dann vom OS aufgerufen, wenn sichergestellt ist, dass keine Anwendung gleichzeitig versuchen kann, die gleiche Library zu öffnen, ob das über Forbid() oder eine Semaphore gemacht wird, ist Sache des OS, als für Dich egal.

Und eine andere Funktion kann nicht zur gleichen Zeit aufgerufen werden, da der Speicher nur dann freigegeben wird, wenn der OPENCNT 0 ist, also niemand mehr die Library geöffnet hat.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > speicherveluste beim starten von wb [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.