•  Back 
  •  Shared Libraries 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
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);
}