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: Ups, das habe ich übersehen. Zitat: Ü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: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: 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: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. |