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

amiga-news.de Forum > Programmierung > RemPort vor DeleteMsgPort? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

07.12.2009, 11:48 Uhr

MaikG
Posts: 5172
Nutzer
Ich experimentiere etwas mit PatchWork rum um evtl. Fehler in
Programmen zu finden.
Und bekam die Ausgabe das DeleteMsgPort aufgerufen wurde, wärend
noch Messages vorlagen. Lt. Guide soll RemPort() davor benutzt werden.
Ist das richtig?
Das sind nur Ports z.b. für Audio und Seriell und darauf wird nie was wie GetMSG/ReplyMSG verwendet.

[ Dieser Beitrag wurde von MaikG am 07.12.2009 um 11:49 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.12.2009, 13:29 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von MaikG:
Das sind nur Ports z.b. für Audio und Seriell und darauf wird nie was wie GetMSG/ReplyMSG verwendet.


Und was bitte macht Audio und Seriell, wenn nicht GetMsg und ReplyMsg ?

Zitat:
Ist das richtig?


Vor DeleteMsgPort mußt du dafür sorgen, daß 1. keine Messages mer auf dem Port sind und 2. daß auch keine mehr dazukommen können. D.h. du muß allen anderen Tasks, die diesen Port benutzen, mitteilen, daß der Port nicht mehr existiert und natürlich alle bereits vorliegenden Messages bearbeiten.

Wenn es ein öffentlicher Port ist, also wenn er mit Namen versehen und mit AddPort veröffentlicht wurde, dann sollest du zuallererst RemPort machen, damit keiner mehr den Port finden kann.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.12.2009, 15:08 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:

Und was bitte macht Audio und Seriell, wenn nicht GetMsg und ReplyMsg ?



Also im Audio beispiel wovon ich immer ausgehe steht
drin:

' Note - we know we have no outstanding audio requests */


Seriell geht etwa so

(öffnen)
port& = CreateMsgPort&()
SerIO&=CreateIORequest&(port&,IOExtSer_sizeof%)
Serdevice& = OpenDevice&(SADD(dev$), Unit&, SerIO&, NULL&)


(Lesen)
POKEW(SerIO&+IORequestio_Command%),CMD_READ&
POKEL(SerIO&+IOStdReqio_Length%) ,in&
POKEL(SerIO&+IOStdReqio_Data%) ,SADD(incoming$)
DoIO&(SerIO&)


(schreiben)

POKEW(SerIO&+IORequestio_Command%), CMD_WRITE&
POKEL(SerIO&+IOStdReqio_Length%),laenge&
POKEL(SerIO&+IOStdReqio_Data%), Adresse&
DoIO&(SerIO&)

(schliessen)
AbortIO&(SerIO&)
junk&=WaitIO&(SerIO&)
CloseDevice SerIO&
DeleteIORequest SerIO&
DeleteMsgPort(port&)


dazwischen wird port& überhaupt gar nicht benutzt, es ist
nur für CreateIORequest().



>Vor DeleteMsgPort mußt du dafür sorgen, daß 1. keine Messages mer
>auf dem Port sind und 2. daß auch keine mehr dazukommen können.
>D.h. du muß allen anderen Tasks, die diesen Port benutzen, mitteilen,
>daß der Port nicht mehr existiert und natürlich alle bereits
>vorliegenden Messages bearbeiten.

Es gibt nur das eine Programm, keine anderen die was mit diesem
Audio oder Seriell port tun.
Woher jetzt Messages kommen könnten weiss ich nicht, da alles
beim schliessen schon abgeschlossen ist.


>Wenn es ein öffentlicher Port ist, also wenn er mit Namen versehen
>und mit AddPort veröffentlicht wurde, dann sollest du zuallererst
>RemPort machen, damit keiner mehr den Port finden kann.

Ist kein öffentlicher Port.


[ - Antworten - Zitieren - Direktlink - ]

07.12.2009, 15:31 Uhr

thomas
Posts: 7717
Nutzer
@MaikG:

Wenn du dir den struct IOExtSer mal anschaust, wirst du sehen, daß da vorne ein struct IORequest drin ist und der wiederum hat am Anfang ein struct Message. Der Port, denn du bei CreateIORequest angibst, wird in die struct Message als mn_ReplyPort eingetragen.

DoIO macht nichts anderes, als die Message an den Port des Device zu schicken und am ReplyPort zu warten, bis die Antwort zurückkommt. Dein Port wird also durchaus für Messages benutzt. Die kommen immer dann an, wenn ein IO-Request beendet ist und werden von DoIO automatisch abgeholt.

Kritischer wäre es, wenn du asynchron mit SendIO und WaitIO arbeiten würdest. Dann müßtest du sicherstellen, daß zu jedem SendIO ein WaitIO existiert.

Ansonsten ist die Befehlsfolge in Ordnung, bis auf das AbortIO/WaitIO am Ende. AbortIO sollte nur aufgerufen werden, wenn es tatsächlich etwas abzubrechen gibt, also wenn ein Request mit SendIO abgeschickt wurde und noch nicht zuende ist. Da du nur DoIO benutzt, kannst du die beiden Zeilen weg machen.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

07.12.2009, 18:32 Uhr

MaikG
Posts: 5172
Nutzer
>Ansonsten ist die Befehlsfolge in Ordnung, bis auf das AbortIO/WaitIO >am Ende. AbortIO sollte nur aufgerufen werden, wenn es tatsächlich >etwas abzubrechen gibt, also wenn ein Request mit SendIO abgeschickt >wurde und noch nicht zuende ist. Da du nur DoIO benutzt, kannst du die >beiden Zeilen weg machen.

AbortIO und WaitIO sind da weil es mit einer Turbokarte im A4000 sonst
reproduzierbare abstürze gab. Auf dem A1200 nicht, etwas seltsam.

Okay, also kann man der behauptung das Messages da waren nicht wirklich trauen. War auch nur ein geringer fehler welcher nicht zu abstürzen
führen kann, sondern nur zu nicht freigegebenen Speicher.

Danke.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > RemPort vor DeleteMsgPort? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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