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

amiga-news.de Forum > Programmierung > CreateNewProcTags & MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

13.07.2004, 11:26 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Findet hier jemand einen Fehler, der CreateMsgPoster() hindern würde zurückzukehren?, die letzte Ausgabe die Kommt lautet "CMP: MainTask", folglich kehrt CreateNewProcTags() nicht zurück, der Stack ist Sicherheits halber sehr hoch.

Wenn der SubProzess gestartet worden wäre würde, müsste wenigstens noch die Ausgabe "PF: Start" kommen, welche aber nicht kommt.

Nunja, dieser Fehler kommt bei 68K Systemen nicht vor, scheinbar nur bei MOS, aber auch nicht überall.

in der PostFunction() wurde alles überflüssige entfernet, d.h. u.a. die Definitionen, nur die ersten zwei Code Zeilen, also nicht wundern.

code:
__saveds void PostFunction() {

    ...
    ...
    ...
   DEBUG_OUT_STRING("        PF: Start"); LF();
   TimePort = CreateMsgPort();
    ...
    ...
    ...
    ...
}


void RemoveMsgPoster() {
   if(PostTask && PosterCreated) SendSetupMsg(SETUP_EXIT, 0);

   while(FindTask(PostName)) Delay(10);

   if (SetupReplyPort) DeleteMsgPort(SetupReplyPort);
   if (PostPort) DeleteMsgPort(PostPort);
   PostTask = NULL;
   SetupReplyPort = NULL;
   PostPort = NULL;
   PosterCreated = FALSE;
}

BOOL CreateMsgPoster() {

   BOOL  ok;

   PostSignal = -1;
   PostStart =- -1;
   PostPort = NULL;
   SetupReplyPort = NULL;
   PosterCreated  =	 FALSE;
   ok = FALSE;
   SetupReplyPort = CreateMsgPort();
   if (SetupReplyPort) {
      DEBUG_OUT_STRING("CMP: SetupReplyPort created"); LF();
      PostStart = SetupReplyPort->mp_SigBit;
   	  PostPort = CreateMsgPort();
          if (PostPort) {
            DEBUG_OUT_STRING("CMP: PostPort"); LF();
      	    PostSignal = PostPort->mp_SigBit;
   	    MainTask = FindTask(NULL);
            DEBUG_OUT_STRING("CMP: MainTask"); LF();
            PostTask = (struct Task *) CreateNewProcTags(NP_Entry, (ULONG) PostFunction, NP_StackSize, 65536, NP_Name, (ULONG) PostName, NP_Priority, 1, TAG_DONE);
         if (PostTask) {
            DEBUG_OUT_STRING("CMP: PostTask"); LF();
            //DEBUG_OUT_STRING("CMP: wait until MP is launched"); LF();
            Wait(1 << PostStart);
            DEBUG_OUT_STRING("CMP: wait"); LF();
         	ok = PosterCreated;
         } else {
            DEBUG_OUT_STRING("CMP: PostTask failed"); LF();
         }
      }
   }
   return	ok;
}


[ - Antworten - Zitieren - Direktlink - ]

13.07.2004, 12:30 Uhr

Holger
Posts: 8116
Nutzer
Auf was greift Dein DEBUG_OUT_STRING Makro zurück?
C-stdio ist nicht unbedingt thread-safe, d.h. man sollte es vermeiden, insb. da diese C-Funktionen nichts von AmigaOS-API Funktionen, die neue Prozesse erzeugen, wissen.

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

[ Dieser Beitrag wurde von Holger am 13.07.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.07.2004, 20:49 Uhr

Georg
Posts: 107
Nutzer
Versuch' mal

NP_CodeType, CODETYPE_PPC

zusätzlich als Tags an CreateNewProcTags() zu übergeben.

[ - Antworten - Zitieren - Direktlink - ]

13.07.2004, 23:35 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
@Holger

Es ist schon stdio (CON: oder FileSystem) und ich weiss nicht ob das daran liegen kann, da es ja sonst damit auch überall läuft. Und ob mit oder ohne die Ausgabe, bleibt es hier hängen, zumindestens kehrt CreateMsgPoster auch nicht zurück, wenn ich in PostFunction() alle DEBUG_OUT aufrufe entferne.

@Georg

Denke ich nicht, da es ja keine PPC Application ist, nichtmal eine für MOS, somit denke ich das es auch laufen müsste, tut's aber auf MOS kaum. Ich habe ein Stack Problem gehabt (zuwenig eingestellt), aber die Erhöhung auf 65536 hatte des Problem auch nicht behoben. Nunja, ich dachte MOS wäre OS3.1 Kompatibel und da ich keine Hacks im Programm habe, verstehe ich die Probleme mit MOS nicht.

[ - Antworten - Zitieren - Direktlink - ]

14.07.2004, 09:16 Uhr

gni
Posts: 1106
Nutzer
Zitat:
DariusBrewka:
Und ob mit oder ohne die Ausgabe, bleibt es hier hängen, zumindestens kehrt CreateMsgPoster auch nicht zurück, wenn ich in PostFunction() alle DEBUG_OUT aufrufe entferne.

Wird der neue Task erzeugt? Auf welche Signale wartet Main? Was passiert wenn Du mit einem Systemmonitor das Signal auf das Main wartet schickst?

[ - Antworten - Zitieren - Direktlink - ]

14.07.2004, 12:55 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
@gni

Habe mich verschrieben, CreateNewProcTags() kehrt nicht zurück, somit kann CreateMSGPoster() auch auf keine Signale empfangen. Ich benutze kein MOS, sodass ich das auch sehr schwer testen kann, allerdings würde das doch schon einiges erleichtern.

Das ganze Problem existiert auch nur, weil ich diesen MSGPoster einbauen musste, da mir die Signale ausgegangen sind, bzw. vieleicht könnte ich einen Port für verschiedene Sachen nutzen, d.h. für DosNotify, Arexx, ScreenNotify, etc. für AREXX gäbe es ja IsRexxMsg (oder so ähnlich), für die anderen Msgs kenne ich Entsprechendes nicht und kann folglich nicht annehmen, bzw. mutmaßen ob ich die an einen CommonMSG Port senden lassen kann.
Bitte nicht fragen, warum 16 Signale nicht reichen, aber es ist so und mein MSGPoster, nimmt einige der MSGs dem HauptProgramm ab, und sendet Nachrichten an das HauptProgramm, welches dafür nur einen Port braucht, womit man sich Probleme (Siehe DeadLock Problem Thread) einfängt aber auch Vorteile hat.

gruss

Darius

[ - Antworten - Zitieren - Direktlink - ]

14.07.2004, 13:03 Uhr

gni
Posts: 1106
Nutzer
Zitat:
DariusBrewka:
Habe mich verschrieben, CreateNewProcTags() kehrt nicht zurück

Muß der neue Prozess eine größere Priorität als Main haben?
Zitat:
Bitte nicht fragen, warum 16 Signale nicht reichen, aber es ist so
Das sich Intuition-Fenster einen MsgPort teilen können, weißt Du? Eventuell kann Dir auch SIGB_SINGLE helfen.

[ - Antworten - Zitieren - Direktlink - ]

14.07.2004, 23:10 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Muß der neue Prozess eine größere Priorität als Main haben?

Da der Prozess eigentlich ehe nur schläft, sollte das nicht schaden, nur sollte er wenn er aufwacht schnell reagieren. Daran dürfte es also nicht liegen.

Zitat:
Das sich Intuition-Fenster einen MsgPort teilen können, weißt Du? Eventuell kann Dir auch SIGB_SINGLE helfen.

mache ich auch, wenn du z.B. aber für die Fenster auch AppWindow Fähigkeiten brauchst kommt noch eines hinzu, dann gibt's noch MUI (die Applikation selber benötigt kein MUI, aber der eingebaute Voreinsteller, dafür auch noch AppWindow Fähigkeiten -> insgesamt 3 Signale, wenn da noch Filerequester aufgehen in den Einstellern kommt noch eines hinzu, bzw. wenn ich keines mehr frei hatte waren die Requester tot, AREXX, ScreenNotify, DOSNotify, Commodities, Ports, um mit externen Modulen zu kommunizieren, etc. Es kommt schon so einiges zusammen.


[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > CreateNewProcTags & MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]


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