Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File11.23.5 SLB_DEMO.C TOS /* * * Rumpf einer "shared library" * * Andreas Kromke * 22.10.97 * */ #include <portab.h> #include <tos.h> #include <tosdefs.h> #pragma warn -par typedef void *PD; char *mem; /* hier globalen Speicher */ /***************************************************************** * * Die init-Funktion wird einmal beim Laden der Bibliothek * aufgerufen. Dabei läuft sie im Prozeß der Bibliothek, * d.h. es können Dateien geöffnet und Speicher angefordert * werden, die jeweils der Bibliothek gehören. * Achtung: Auf die dabei geöffneten Dateien darf durch die * Bibliotheksfunktionen _NICHT_ zugegriffen werden, * weil diese im Kontext des Aufrufers laufen. * * Achtung: Die init-Funktion läuft im Supervisormode, da eine * Bibliothek i.a. keinen Userstack hat. * Daher darf sie nicht zuviel Stack benutzen (max. 1kB) * und nicht zu lange laufen (weil das Multitasking * im Supervisormode blockiert ist). * Ggf. kann aber ein Userstack alloziert und in den * Usermode gewechselt werden. * *****************************************************************/ extern LONG cdecl slb_init( void ) { mem = Malloc(4096L); if (mem) return(E_OK); else return(ENSMEM); } /***************************************************************** * * Die exit-Funktion wird einmal beim Freigeben der Bibliothek * aufgerufen. Dabei läuft sie im Prozeß der Bibliothek, * d.h. es können Dateien geöffnet und Speicher angefordert * werden, die jeweils der Bibliothek gehören. * * Achtung: Die exit-Funktion läuft im Supervisormode, da eine * Bibliothek i.a. keinen Userstack hat. * Daher darf sie nicht zuviel Stack benutzen (max. 1kB) * und nicht zu lange laufen (weil das Multitasking * im Supervisormode blockiert ist). * Ggf. kann aber ein Userstack alloziert und in den * Usermode gewechselt werden. * *****************************************************************/ extern void cdecl slb_exit( void ) { Mfree(mem); } /***************************************************************** * * Die open-Funktion wird einmal beim Öffnen der Bibliothek * durch einen Anwenderprozeß aufgerufen. Dabei läuft sie im * Prozeß des Aufrufers, d.h. es können Dateien geöffnet und * Speicher angefordert werden, die jeweils dem Aufrufer gehören. * * Durch den Kernel ist sichergestellt, daß jeder Prozeß die * Bibliothek nicht mehrmals öffnet und daß die Bibliothek immer * ordnungsgemäß geschlossen wird. * * Achtung: Die open-Funktion läuft im Usermode, und zwar mit dem * Userstack des Aufrufers. Das heißt, daß der Aufrufer, * auch wenn er im Supervisormode läuft, immer einen * ausreichend großen usp zur Verfügung stellen muß. * *****************************************************************/ extern LONG cdecl slb_open( PD *pd ) { return(E_OK); } /***************************************************************** * * Die close-Funktion wird einmal beim Schließen der Bibliothek * durch einen Anwenderprozeß aufgerufen. Dabei läuft sie im * Prozeß des Aufrufers, d.h. es können Dateien geöffnet bzw. * geschlossen und Speicher angefordert und freigegeben werden, * die jeweils dem Aufrufer gehören. * * Achtung: Die close-Funktion läuft im Usermode, und zwar mit dem * Userstack des Aufrufers. Das heißt, daß der Aufrufer, * auch wenn er im Supervisormode läuft, immer einen * ausreichend großen usp zur Verfügung stellen muß. * *****************************************************************/ extern void cdecl slb_close( PD *pd ) { } /***************************************************************** * * Eine Beispiel-Bibliotheksfunktion. * Sie wird im Kontext des Aufrufers ausgeführt, und zwar mit dem * Stack des Aufrufers (je nach Status usp oder ssp). * * Es wird dringend empfohlen, die Funktionen einer SLB nur im * Usermode aufzurufen, um die Kompatibilität zu späteren * Implementationen zu wahren. * *****************************************************************/ extern LONG cdecl slb_fn0( PD *pd, LONG fn, WORD nargs, char *s ) { Cconws(s); Cconws("\r\nTaste: "); Cconin(); return(E_OK); }