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

amiga-news.de Forum > Programmierung > Etwas nach Programmende im Speicher behalten... ? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

22.01.2012, 21:52 Uhr

AGSzabo
Posts: 1663
Nutzer
Hi, ich schreibe einen Patch für die ASL library, der bewirken soll, dass stattdessen mein eigener Filerequester benutzt werden soll. Bis auf weiteres (commodity?) soll ein Shellprogramm beim ersten Aufruf den Patch insatllieren und beim zweiten Aufruf wieder heraus nehmen. Dazu müsste ich zwischendurch etwas im Speicher behalten, nämlich den Zeiger auf die geöffnete ASL library und meine eigenen library und dazu auch die Zeiger auf die alten, von mir gepatchten Funktionen der ASL library. Mit welcher Methodik kann ich mir diese Daten zwischen den zwei Starts des Patchprogrammes merken?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

22.01.2012, 22:15 Uhr

NoImag
Posts: 1050
Nutzer
@AGSzabo:
Dein Programm muss im Hintergrund weiterlaufen.

Tschüß


[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 09:44 Uhr

DrNOP
Posts: 4118
Nutzer
@AGSzabo:
In einer (zwei, drei ...) Env-Variable?
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 11:33 Uhr

o1i
Posts: 42
Nutzer
@AGSzabo:

http://aminet.net/package/util/misc/SaferPatches

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 12:07 Uhr

akl
Posts: 265
Nutzer
@AGSzabo:
Semaphore?

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 13:04 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Dein Programm muss im Speicher bleiben.

Sonst ist ja auch der Code weg.


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 16:11 Uhr

Thore
Posts: 2266
Nutzer
Durch ne Semaphore, einen Port oder durch einen eindeutigen Tasknamen kannst Du prüfen, ob das Programm bereits gestartet wurde. Aber wie die anderen schon sagten, das Programm muss laufen, wenn du diese Funktionalität willst.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 16:44 Uhr

AGSzabo
Posts: 1663
Nutzer
Anfangs dachte ich, es würde genügen, wenn ich die Pointer umbiege. Dann hätte eine Semafore genügt, um die alten Pointer zu merken, Aber dann bin ich dahinter gekommen dass ich einen Abfang-code brauche, der evtl auf das normale ASL zurückfällt, wenn etwas anderes als der Filerequester gewünscht ist.

Ich habe es jetzt über einen neuen Prozess gelöst, der gestartet wird und dann wartet bis ihm das Signal gegeben wird, um sich zu beenden und den Patch rückgängig zu machen. Es funktioniert!
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 23.01.2012 um 16:46 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 16:46 Uhr

Thore
Posts: 2266
Nutzer
> Ich habe es jetzt über einen neuen Prozess gelöst, der gestartet wird und dann wartet bis ihm das Signal gegeben wird, um sich zu beenden.

Das ist eine saubere Lösung :)

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 18:06 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Jetzt müsste mein Patch noch irgendwie warten, bis der User den letzten allokierten Filerequester geschlossen und freigegeben hat... auch darf man den Patch nicht starten, wenn schon jemand einen FileRequester allokiert oder gar offen hat.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 19:27 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Jetzt müsste mein Patch noch irgendwie warten, bis der User den letzten allokierten Filerequester geschlossen und freigegeben hat... auch darf man den Patch nicht starten, wenn schon jemand einen FileRequester allokiert oder gar offen hat.

Nö, Du musst nur einen Mechanismus einbauen, um eigene Requester von originalen unterscheiden zu können. Dann kannst Du die alten an die ursprüngliche Routine weiterleiten.

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

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 19:30 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Achso ja stimmt. Hab ich auch schon so gemacht. Denkfehler. :)
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 19:46 Uhr

AGSzabo
Posts: 1663
Nutzer
Weiss zufällich jemand warum mein Patch unter OS 4.1 garnichts tut? Trotz Patch kommt immer wieder der originale ASL requester. Keine Abstürze...
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 20:29 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Weiss zufällich jemand warum mein Patch unter OS 4.1 garnichts tut? Trotz Patch kommt immer wieder der originale ASL requester. Keine Abstürze...

Weil Du nur die 68k-Stubs patchst und nicht die echte ppc-Library?

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

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 22:02 Uhr

AGSzabo
Posts: 1663
Nutzer
Wenn gerade einer von meinen Requestern offen ist und währenddessen jemand dem patch rückgängig macht, gibts nen guru.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 22:13 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> Weil Du nur die 68k-Stubs patchst und nicht die echte ppc-Library?

Geht das überhaupt, was ich da vor habe oder kann man keinen 68k code aus einer echten ppc library aufrufen? Wenn doch, wie denn?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 22:38 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von AGSzabo:
Wenn gerade einer von meinen Requestern offen ist und währenddessen jemand dem patch rückgängig macht, gibts nen guru.


Das glaube ich nicht. Der Guru kommt, weil du den Programmcode frei gibst, während das Programm noch läuft. Du musst zuerst die Library-Vektoren wieder zurücksetzen, dann warten bis alle Requester geschlossen sind und erst dann das Programm bzw. den Prozess verlassen.

Außerdem solltest du dir darüber im Klaren sein, dass du die Library-Vektoren nicht einfach so zurücksetzen darfst, sondern du musst zuerst prüfen, ob jemand anders sie nach die verändert hat und wenn ja, darauf warten, dass der andere sie wieder auf deine setzt. Erst dann darfst du sie auf deine Vorgänger zurücksetzen.


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

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 22:44 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

> Du musst zuerst die Library-Vektoren wieder zurücksetzen, dann warten bis alle Requester geschlossen sind und erst dann das Programm bzw. den Prozess verlassen.

Das glaube ich nicht. Wenn ich die Vektoren zuerst zurück setze, dann wird ein gerade offner Requester meiner Art mit dem normalen ASL code geschlossen. Das kann nicht gut gehen. Und wie soll ich warten? Delay() und gucken?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 23.01.2012 um 22:44 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.01.2012, 10:19 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Geht das überhaupt, was ich da vor habe oder kann man keinen 68k code aus einer echten ppc library aufrufen? Wenn doch, wie denn?

Man kann 68k-Code von ppc-code aus aufrufen. Das heißt aber noch lange nicht, dass Du eine ppc-Library von 68k-Code aus umbiegen kannst.

Es gibt für Libraries auf NG-Amigas mindestens zwei Szenarien:
  • Es gibt eine ppc-Library, die auch von 68k-Programmen aufgerufen werden kann, sofern eine 68k-Stub-Library existiert
  • Es gibt eine 68k-Library ohne ppc-Code, die von ppc-Programmen aufgerufen wird. Die nötigen Stubs werden für dieses Szenario afaik automatisch generiert, weshalb die meisten User zu der Fehlannahme verführt werden, man könne 68k- und ppc-Code beliebig mischen

    Da die asl.library zum OS gehört, liegt sie bei AOS4 in ppc-Form vor. Das heißt, ppc-Programme verwenden die ppc-Library direkt und interessieren sich nicht für die Stub-Lib, die Dein 68k-Programm vorgesetzt bekommt. Um die Aufrufe von ppc-Programmen auf Deine 68k-Routine umzubiegen, müsstest Du die ppc-Version patchen und auf eine Stub-Routine umbiegen, die (äquivalent zum Aufruf einer 68k-Library durch ein ppc-Programm) Deinen 68k-Code aufruft.

    Zitat:
    Original von AGSzabo:
    Das glaube ich nicht. Wenn ich die Vektoren zuerst zurück setze, dann wird ein gerade offner Requester meiner Art mit dem normalen ASL code geschlossen. Das kann nicht gut gehen. Und wie soll ich warten? Delay() und gucken?

    Nein.
    Du setzt zuerst die Vektoren der Funktionen zurück, die neue Requester anlegen. Dann wartest Du, bis der letzte Deiner speziellen Requester geschlossen wurde. Dann setzt Du die anderen Vektoren zurück.

    Dan heißt aber noch lange nicht, dass kein Programm mehr Deine Vektoren kennt. Es gibt keine definierte Haltbarkeitsdauer für Vektoren. Die sauberste Variante ist deshalb, danach zu warten, bis auch das letzte Programm die Library geschlossen hat, bevor man den Code freigibt.

    Oder man verwendet von vornherein eine zweite Library. Dann hat man nämlich den Überblick darüber, wie viele Programme die ungepatchte und wieviele die gepatchte Version geöffnet haben. Dann kann man auch die gepatchte Version automatisch freigeben lassen, sobald sie von niemanden mehr verwender wird.

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

    [ - Antworten - Zitieren - Direktlink - ]

  • 24.01.2012, 11:27 Uhr

    thomas
    Posts: 7717
    Nutzer
    Zitat:
    Original von Holger:
  • Es gibt eine ppc-Library, die auch von 68k-Programmen aufgerufen werden kann, sofern eine 68k-Stub-Library existiert
  • Es gibt eine 68k-Library ohne ppc-Code, die von ppc-Programmen aufgerufen wird. Die nötigen Stubs werden für dieses Szenario afaik automatisch generiert, weshalb die meisten User zu der Fehlannahme verführt werden, man könne 68k- und ppc-Code beliebig mischen

  • Es ist genau umgekehrt. Eine native PPC-Library kann eine 68k-Sprungtabelle enthalten. Die Vektoren zeigen auf PPC-Code, was von der Emulation automatisch erkannt und korrekt ausgeführt wird.

    Eine 68K-Library kann von PPC-Programmen grundsätzlich nicht benutzt werden. Dazu wird eine PPC-Stub-Library benötigt, die aus den fd-Files und clib-Includes fast automatisch generiert werden kann.

    Von einem 68k-Programm aus eine PPC-Library zu patchen dürfte eine interessante Herausforderung sein. Es steht und fällt damit, dass es für IExec->SetMethod einen 68k-Vektor gibt. Und man muss genug PPC-Assembler können, um den PPC-Stub zu programmieren.




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

    [ - Antworten - Zitieren - Direktlink - ]

    24.01.2012, 18:11 Uhr

    Holger
    Posts: 8116
    Nutzer
    Zitat:
    Original von thomas:
    Es ist genau umgekehrt.

    Ist es das? Du sagst doch sinngemäß das Gleiche: ppc-Library kann von 68k-Code nur dann aufgerufen werden, wenn es ausdrücklich unterstützt wird, der Aufruf einer 68k-Library durch ppc-Code kann dagegen automatisiert werden.
    Zitat:
    Eine native PPC-Library kann eine 68k-Sprungtabelle enthalten. Die Vektoren zeigen auf PPC-Code, was von der Emulation automatisch erkannt und korrekt ausgeführt wird.
    Die Emulation erkennt mitnichten automatisch, dass eine bestimmte Adresse PPC-Code enthält. Der Overhead wäre ja gigantisch. Vielmehr gibt es Pseudo-68k-Instruktionen, die dem Emulator explizit sagen, dass er jetzt ppc-Code ausführen soll. Und den Code, der diese Pseudo-Instruktion enthält, nennt man Stub.
    Zitat:
    Eine 68K-Library kann von PPC-Programmen grundsätzlich nicht benutzt werden. Dazu wird eine PPC-Stub-Library benötigt, die aus den fd-Files und clib-Includes fast automatisch generiert werden kann.
    Was eben bedeutet, dass PPC-Programmen sehr wohl 68K-Libraries benutzen können. Schließlich benötigen sie offensichtlich exakt dasselbe, was ein 68k-Programmierer benötigt, um eine 68k-Library benutzen zu können. Der Fall, dass ein Library-Autor gerade für die Programmiersprache/den Compiler des Anwendungsprogrammierers passende includes mitliefert, um die Generierung aus fd-Files zu überspringen, kann man getrost als Spezialfall ansehen.

    --
    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 > Etwas nach Programmende im Speicher behalten... ? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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