|
PDVIXtest.c |
/**********************************************************************/
/* */
/* Projekt: PDVIXtest für MinMax99 -- Systemaufrufe testen */
/* Autor: Marek Musial */
/* Institut: TU Berlin - FB 13 Informatik - PDV und Robotik */
/* ------------------------------------------------------------------ */
/* Datei: PDVIXtest.c */
/* Datum: 04.01.2001 */
/* */
/**********************************************************************/
#include "mxStrukturen.h"
#include "mxLib.h"
#include "mxSystemAufruf.h"
#define SHORTTIMESLEEP 1500
/* zum Ausbauen einzelner Funktionen... Sinnvoll: 3, 4, 5 */
#ifndef AUFGABE
#define AUFGABE 5
#endif
#define SC0(call) (printf("%s...\n",#call), (call))
#define SC1(call,type) (printf("%s -> ", #call), RES = (int)(call), printf("(%d)\n", RES), (type)RES)
#define ASSERT(exp) do {if (!(exp)) {printf("\007### Fehlgeschlagene Invariante: %s\n", #exp); for(;;);}} while(0)
#define WINS 30
#define DUMMIES 50
/* Makro zum Selbstaufruf und fuer den Prozedurnamen */
#if (AUFGABE < 5)
#define MAIN PDVIXtest
#else
#define MAIN main
#endif
void EchoServer(char name, int server_mode){
#if (AUFGABE < 4)
printf (" PDVIXtest-Konfiguration Aufgabe %d, ohne Nachrichten!\n", AUFGABE);
#else
tName p;
tKommunikationsStatus status;
tString str;
int ok, RES;
if(!server_mode)
printf (" Ich bin Kommunikationspartner '%c'!\n", name);
else
printf(" Ich bin EchoServer '%c'!\n", name);
ok = SC1( sys_NameAnmelden(name), int );
ASSERT(ok);
for(;;){
SC0( p = cKeinName );
if(server_mode){
printf("Warte auf Anmeldung eines neuen Clients\n");
while( (status = SC1(sys_Empfangen( &p, str), tKommunikationsStatus)) != eOk);
printf("Kommuniziere mit Client %c\n", p);
}
if(!server_mode) SC0( sys_Schlafe( 500 ));
status = SC1(sys_Empfangen( &p, str ), tKommunikationsStatus);
if (status == eUnbekannt && !server_mode) break;
else if(status == eUnbekannt) continue; //Kommunikation mit neuem Client zulassen
if(!server_mode) ASSERT(p == 'T');
ASSERT(status == eOk);
printf("Nachricht='%s' (%d Zeichen) von Partner %c\n", str, strlen(str), p);
if(!strcmp(str, "ENDE")) break; //beende Server
if( server_mode && !strcmp(str, "QUIT")) continue; //Prozess hat sich abgemeldet
SC0( sys_Schlafe( 500 ));
status = SC1(sys_Senden( p, str ), tKommunikationsStatus);
if (status == eUnbekannt && !server_mode) break;
else if(status == eUnbekannt) continue;
if(!server_mode) ASSERT(p == 'T');
ASSERT(status == eOk);
}
sys_NameAbmelden();
}
void EchoClient(char name){
tName testPartner = 'T', echoPartner = 'E';
tKommunikationsStatus status;
tString str, cmd;
int ok, RES;
int angemeldet = FALSE;
printf("Ich bin Echo Client %c", name);
ok = SC1( sys_NameAnmelden(name), int);
ASSERT(ok);
//test Protokoll:
for(;;){
status = SC1( sys_Empfangen( &testPartner, cmd), tKommunikationsStatus );
ASSERT( status == eOk);
ASSERT( testPartner == 'T');
switch(cmd[0]){
case 'A': //Anmelden (Server bereits gestartet)
status = SC1(sys_Senden(echoPartner, "Anmdelung"), tKommunikationsStatus);
ASSERT(status == eOk);
angemeldet = TRUE;
break;
case 'a': //Anmelden (Server noch nicht gestartet)
while( eUnbekannt ==
(status = SC1(sys_Senden(echoPartner, "Anmdelung"), tKommunikationsStatus))) ;
ASSERT(status == eOk);
angemeldet = TRUE;
break;
case 'E': //EchoServer Quit "ENDE" schicken
status = SC1(sys_Senden(echoPartner, "ENDE"), tKommunikationsStatus);
ASSERT(status == eOk);
angemeldet = FALSE;
break;
case 'Q': //vom EchoServer abmelden
status = SC1(sys_Senden(echoPartner, "QUIT"), tKommunikationsStatus);
ASSERT(status == eOk);
angemeldet = FALSE;
break;
case 'q': //sich selber beenden
angemeldet = FALSE;
return;
case 'm': //nachricht senden
status = SC1(sys_Senden(echoPartner, cmd+2), tKommunikationsStatus);
ASSERT(status = eOk);
status = SC1(sys_Empfangen(&echoPartner, str), tKommunikationsStatus);
ASSERT( status = eOk);
ASSERT( echoPartner == 'E');
ASSERT( strcmp(str, cmd+2) == 0);
break;
case 'M': //Nachricht senden, aber beim Empfangen erwarten, dass status==eUnbekannt
status = SC1(sys_Senden(echoPartner, cmd+2), tKommunikationsStatus);
ASSERT(status = eOk);
sys_Schlafe(1500);
status = SC1(sys_Empfangen(&echoPartner, str), tKommunikationsStatus);
ASSERT( status == eUnbekannt);
break;
case 'p': //ping
status = SC1(sys_Senden(testPartner, "pong"), tKommunikationsStatus);
ASSERT( status == eOk);
break;
case '?': //angemeldet?
status = SC1(sys_Senden(testPartner, angemeldet ? "y" : "n"), tKommunikationsStatus);
ASSERT( status == eOk);
break;
}
}
#endif
}
int MAIN(int argc, char *argv[])
{
typedef void *ptr;
int RES;
int window[WINS];
char PST[] = "-EBTLS????????????????????????????????";
int i, j, w, res, all;
int x, dx, rx;
int y, dy, ry;
int slave = FALSE, partner = FALSE, dummy = FALSE, help = FALSE, autof = FALSE, autoi = 0;
int echo = FALSE, client = FALSE;
int dontuse0;
tString str;
tProzessNummer pid;
tProzessNummer dpid[DUMMIES];
tSystemStatus sysstat;
tInformationsFeld infos;
#if (AUFGABE >= 4)
tProzessNummer pid2;
tKommunikationsStatus status;
tName sender;
int ok;
#endif
#if (AUFGABE >= 5)
tNamenVerzeichnis dir;
#endif
/* Kommandozeile */
if (argc > 1) {
if (!strcmp(argv[1], "-s")) {
slave = TRUE;
} else if (!strcmp(argv[1], "-q")) {
partner = TRUE;
} else if (!strcmp(argv[1], "-e")) {
echo = TRUE;
} else if (!strcmp(argv[1], "-c")){
client = TRUE;
} else if (!strcmp(argv[1], "-d")) {
dummy = TRUE;
} else if (!strcmp(argv[1], "-h")) {
help = TRUE;
} else {
autof = TRUE;
}
}
/* *0 lesen */
dontuse0 = *((int*)0);
/* Fenster muessen her */
for (w=0; w<WINS; w++) {
if (w > 0 && (help || slave || partner || dummy)) break;
window[w] = SC0(sys_FensterOeffnen( cKeinFenster ));
if (window[w] == cKeinFenster) break;
printf("\n** %s -- Version 1.2 -- A%d -- in Fenster %d **\n", argv[0], AUFGABE, window[w]);
}
/* kein Fenster => zwecklos */
if (w < 1) return 1;
if (help) {
printf ("Benutzung: %s [-h | -s | cmds] \n", argv[0]);
printf (" -h Hilfe \n");
printf (" -s Slave-Mode \n");
printf (" -q <name> Kommunikationsparner-Mode\n");
printf (" -d Dummy-Mode \n");
printf (" cmds Kommandofolge aus: \n");
printf (" 0=String 1=Fenster 2=Nachr. 3=Prozess 4=Speicher \n");
printf (" 5=Schlaf 6=Cursor 7=LED 8=Info 9=Datei A=alle\n");
return 0;
}
/* Testen, ob zweiter Start (Slave-Mode) */
if (slave) {
printf(" Ich bin zweite PDVIXtest-Instanz, warte auf Fremdtermination!\n");
while(TRUE);
}
/* Testen, ob zweiter Start (Kommunikationspartner-Mode) */
if (partner || echo) {
EchoServer( argc > 2? argv[2][0] : 'Q', echo );
return 0;
}
#if (AUFGABE >= 4)
if (client){
EchoClient( argc > 2? argv[2][0] : 'C');
return 0;
}
#endif
/* Testen, ob zweiter Start (Dummy-Mode) */
if (dummy) {
printf (" Ich bin Dummy-Prozess!\n");
SC0(sys_FensterSchliessen( window[0] ));
while(TRUE) sys_Schlafe(0);
}
SC0(sys_FensterWechseln( window[0] ));
printf (" ok, habe w=%d Fenster bekommen: ", w);
for (i=0; i<w; i++) printf(" [%d]", window[i]);
printf("\n");
if (autof) {
printf ("Automatik-Mode, Kommandosequenz='%s'\n", argv[1]);
} else {
printf ("printf() scheint zu gehen...\n");
}
/* nur ein Fenster => zwecklos */
ASSERT(w > 1);
while (TRUE) {
/* hat etwa jemand einen Nullpointer missbraucht? */
ASSERT(*((int*)0) == dontuse0);
if (autof) {
res = argv[1][autoi++];
if (!res) res = 27;
} else {
printf("\n0=String 1=Fenster 2=Nachr. 3=Prozess 4=Speicher 5=Schlaf 6=Cursor 7=LED 8=Info 9=Datei A=alle ESC=Term\n");
res = SC1(sys_LiesZeichen(), int);
}
all = 0;
switch (res) {
case 'a':
case 'A': all = 1;
case '0':
printf ("Teste String-Eingabe...\n");
SC0(sys_LiesString( str, cStringLaenge+1 ));
printf (" Eingabe: \"%s\" (%d Zeichen)\n", str, strlen(str));
ASSERT(strlen(str) <= cStringLaenge);
if (!all) break;
case '1':
printf ("Teste explizite Fensterreservierung...\n");
for (i=1; i<w; i++) {
SC1(window[i], int);
SC0(sys_FensterSchliessen( window[i] ));
res = SC0(sys_FensterOeffnen( window[i] ));
ASSERT(res == window[i]);
SC0(sys_FensterWechseln( window[0] ));
}
if (!all) break;
case '2':
printf ("Teste Nachrichten...\n");
#if (AUFGABE < 4)
printf (" PDVIXtest-Konfiguration Aufgabe %d, ohne Nachrichten!\n", AUFGABE);
#else
/* ein Fenster freimachen */
SC0(sys_FensterSchliessen( window[1] ));
ok = SC1(sys_NameAnmelden( 'T' ), int);
ASSERT(ok);
printf("eOk: %d\n", eOk);
/* Senden, Empfang mit cKeinName, Sender blockiert */
pid = SC1(sys_StarteProzess( argv[0], "-q Q" ), tProzessNummer);
ASSERT(pid > 0);
printf("Warte auf Start:\n");
while ((status = (SC1(sys_Senden( 'Q', "Nachricht 1" ), tKommunikationsStatus))) == eUnbekannt) {
SC0(sys_Schlafe( 0 ));
}
ASSERT(status == eOk);
/* Empfangen, Empfang mit Q, Empfaenger blockiert */
SC0(sender = 'Q');
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachricht 1" ) == 0);
/* Senden, Empfang mit T, Sender blockiert */
status = SC1(sys_Senden( 'Q', "Nachricht 2" ), tKommunikationsStatus);
ASSERT(status == eOk);
/* Empfangen, Empfang mit cKeinName, Empfaenger blockiert */
SC0(sender = cKeinName);
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachricht 2" ) == 0);
/* Senden, Empfang mit T, Empfaenger blockiert */
SC0(sys_Schlafe( 1000 ));
status = SC1(sys_Senden( 'Q', "Nachricht 3" ), tKommunikationsStatus);
ASSERT(status == eOk);
/* abmelden */
ok = SC1(sys_NameAnmelden( 't' ), int);
ASSERT(ok);
SC0(sys_Schlafe( 1500 ));
ok = SC1(sys_NameAnmelden( 'T' ), int);
ASSERT(ok);
status = SC1(sys_Senden( 'Q', "Nachricht 4" ), tKommunikationsStatus);
ASSERT(status == eUnbekannt);
/* Start #2 */
pid = SC1(sys_StarteProzess( argv[0], "-q Q" ), tProzessNummer);
ASSERT(pid > 0);
printf("Warte auf Start: ");
SC0(sys_Schlafe( 1500 ));
/* Senden, Empfang mit cKeinName, Empfaenger blockiert */
status = SC1(sys_Senden( 'Q', "Nachricht 5" ), tKommunikationsStatus);
ASSERT(status == eOk);
/* Empfangen, Empfang mit Q, Sender blockiert */
SC0(sender = 'Q');
SC0(sys_Schlafe( 1000 ));
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachricht 5" ) == 0);
if (w < 3) {
printf (" Ueberspringe Multi-Empfangen, da kein Fenster mehr frei!\07\n");
SC0(sys_Schlafe( 3000 ));
} else {
printf (" Multi-Empfangen-Test\n");
/* noch ein Fenster freimachen und zweiten Partner starten*/
SC0(sys_FensterSchliessen( window[2] ));
pid2 = SC1(sys_StarteProzess( argv[0], "-q q" ), tProzessNummer);
ASSERT(pid2 > 0);
/* Senden, Empfang mit cKeinName, Sender blockiert */
printf("Warte auf Start:\n");
while ((status = (SC1(sys_Senden( 'q', "Nachr. 6" ), tKommunikationsStatus))) == eUnbekannt) {
SC0(sys_Schlafe( 0 ));
}
ASSERT(status == eOk);
/* Empfangen, Empfang mit cKeinName, Empfaenger blockiert, 2. Prozess vorhanden */
SC0(sender = cKeinName);
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'q');
ASSERT(strcmp( str, "Nachr. 6" ) == 0);
/* Senden, Empfang mit T, Empfaenger blockiert */
status = (SC1(sys_Senden( 'Q', "Nachr. 7" ), tKommunikationsStatus));
ASSERT(status == eOk);
/* Empfangen, Empfang mit cKeinName, Empfaenger blockiert, 2. Prozess vorhanden */
SC0(sender = cKeinName);
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachr. 7" ) == 0);
/* mit Prozess2 'Q' und Prozess3 'q' /*ueber kreuz*/ kommunizieren */
status = SC1(sys_Senden('Q', "Nachricht K1"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1(sys_Senden('q', "Nachricht K2"), tKommunikationsStatus);
ASSERT(status == eOk);
SC0(sender = 'Q');
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachricht K1") == 0);
SC0(sender = 'q');
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'q');
ASSERT(strcmp( str, "Nachricht K2") == 0);
/* kommunikation mit Prozess3 'q' innerhalb Kommunikation mit Prozess2 'Q' verschachteln */
status = SC1(sys_Senden('Q', "Nachricht K3"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1(sys_Senden('q', "Nachricht K4"), tKommunikationsStatus);
ASSERT(status == eOk);
SC0(sender = 'q');
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'q');
ASSERT(strcmp( str, "Nachricht K4") == 0);
SC0(sender = 'Q');
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q');
ASSERT(strcmp( str, "Nachricht K3") == 0);
/* Nachricht an Prozess2 und Prozess3 schicken, zweimal von cKeinName Empfangen */
status = SC1(sys_Senden('Q', "Nachricht K5"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1(sys_Senden('q', "Nachricht K6"), tKommunikationsStatus);
ASSERT(status == eOk);
for(i = 0; i < 2; i++){
SC0( sender = cKeinName );
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT(status == eOk);
ASSERT(sender == 'Q' || sender == 'q');
ASSERT( (sender == 'Q' && strcmp( str, "Nachricht K5") == 0) ||
(sender == 'q' && strcmp( str, "Nachricht K6") == 0));
}
/* Senden, Empfang mit T, Empfaenger blockiert */
SC0(sys_Schlafe( 500 ));
status = SC1(sys_Senden( 'q', "ENDE" ), tKommunikationsStatus);
ASSERT(status == eOk);
/* Fenster zurueckholen */
res = SC0(sys_FensterOeffnen( window[2] ));
SC0(sys_FensterWechseln( window[0] ));
ASSERT(res == window[2]);
}
/* Fremdtermination */
SC0(sys_Schlafe( 500 ));
SC0(sys_TerminiereProzess( pid ));
SC0(sys_Schlafe( 500 ));
/* Senden, Empfang mit T, Sender blockiert */
status = SC1(sys_Senden( 'Q', "ENDE" ), tKommunikationsStatus);
/* je nach Implementierung der Aufweckung bei Termination */
ASSERT(status == eOk || status == eUnbekannt);
printf(" Termination aus Nachrichtenblockierung ist implementiert: %s!\n", status != eOk? "JA" : "NEIN");
SC0(sys_Schlafe(10));
ok = SC1(sys_NameAnmelden( 'Q' ), int);
ASSERT(ok);
ok = SC1(sys_NameAnmelden( 'q' ), int);
ASSERT(ok);
/* EchoServer tests: */
/* Fenster zurueckholen */
res = SC0(sys_FensterOeffnen( window[1] ));
SC0(sys_FensterWechseln( window[0] ));
ASSERT(res == window[1]);
ok = SC1(sys_NameAnmelden('T'), int); //wieder orignial Anmeldename herstellen
ASSERT(ok);
//Fenster fuer EchoServer/Client freigaben:
SC0(sys_FensterSchliessen( window[1] ));
//EchoServer laeuft, Client starten und anmelden, Client beenden ohne abzumelden
pid = SC1( sys_StarteProzess(argv[0], "-e E"), tProzessNummer);
ASSERT( pid > 0);
SC0(sys_Schlafe(SHORTTIMESLEEP));
SC0(sys_FensterSchliessen( window[2] ));
pid2 = SC1( sys_StarteProzess(argv[0], "-c C"), tProzessNummer);
ASSERT( pid2 > 0);
SC0(sys_Schlafe(SHORTTIMESLEEP));
status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1( sys_Senden('C', "q"), tKommunikationsStatus);
ASSERT(status == eOk);
SC0(sys_Schlafe( SHORTTIMESLEEP )); //beenden lassen
//Echo Server laeuft, Client starten und anmelden, Client meldet sich ganz normal ab und beendet
pid2 = SC1( sys_StarteProzess(argv[0], "-c C"), tProzessNummer);
ASSERT( pid2 > 0);
SC0(sys_Schlafe(SHORTTIMESLEEP));
status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1( sys_Senden('C', "Q"), tKommunikationsStatus);
ASSERT(status == eOk);
status = SC1( sys_Senden('C', "q"), tKommunikationsStatus);
ASSERT(status == eOk);
//Server laeuft, Client meldet sich an, Server beendet nach Anmeldung, Client wartet auf neuen Server
pid2 = SC1( sys_StarteProzess( argv[0], "-c C"), tProzessNummer);
ASSERT(pid > 2);
SC0( sys_Schlafe(SHORTTIMESLEEP));
status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
ASSERT( status == eOk);
status = SC1( sys_Senden('C', "E"), tKommunikationsStatus);
ASSERT( status == eOk );
SC0(sys_Schlafe(1000));
status = SC1( sys_Senden('C', "a"), tKommunikationsStatus); //auf neuen Server warten
ASSERT( status == eOk );
//neuen Server starten
pid = SC1(sys_StarteProzess( argv[0], "-e E"), tProzessNummer);
ASSERT( pid > 0);
SC0(sys_Schlafe(1500));
//teste ob client angemeldet
status = SC1(sys_Senden('C', "?"), tKommunikationsStatus);
ASSERT( status == eOk);
sender = 'C';
status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
ASSERT( status == eOk);
ASSERT( sender == 'C');
ASSERT( str[0] == 'y');
//Server und Client beenden
status = SC1(sys_Senden('C', "E"), tKommunikationsStatus);
ASSERT( status == eOk);
SC0(sys_Schlafe(1000));
status = SC1(sys_Senden('C', "q"), tKommunikationsStatus);
ASSERT( status == eOk);
SC0( sys_Schlafe(1000));
//Fesnter von EchoServer zurueckholen
res = SC0(sys_FensterOeffnen( window[1] ));
SC0(sys_FensterWechseln( window[0]));
ASSERT( res == window[1] );
//Fesnter von EchoClient zurueckholen
res = SC0(sys_FensterOeffnen( window[2] ));
SC0(sys_FensterWechseln( window[0]));
ASSERT( res == window[2] );
/* Abmeldung */
SC0(sys_NameAbmelden());
SC0(sender = cKeinName);
status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
ASSERT(status == eNichtAngemeldet);
printf("Nachrichtentest erfolgreich beendet!\n");
#endif
if (!all) break;
case '3':
printf ("Teste Prozess-Start und Fremdtermination\n");
/* ein Fenster freimachen */
SC0(sys_FensterSchliessen( window[1] ));
pid = SC1(sys_StarteProzess( argv[0], "-s" ), tProzessNummer);
ASSERT(pid > 0);
printf("Warte auf Start... ");
sys_Schlafe( 1000 );
printf ("\n");
res = SC0(sys_FensterOeffnen( cKeinFenster ));
ASSERT(res == cKeinFenster);
SC0(sys_TerminiereProzess( pid ));
/* Fenster zurueckholen */
res = SC0(sys_FensterOeffnen( cKeinFenster ));
SC0(sys_FensterWechseln( window[0] ));
ASSERT(res == window[1]);
if (!all) break;
case '4':
printf ("Teste Speicherkapazitaet...\n");
/* ein Fenster freimachen */
SC0(sys_FensterSchliessen( window[1] ));
for (i=0; ; i++) {
pid = SC1(sys_StarteProzess( argv[0], "-d" ), tProzessNummer);
if (!pid) break;
dpid[i] = pid;
sys_Schlafe( 500 );
}
printf(" %d %s-Instanzen gestartet\n", i, argv[0]);
for (i--; i>=0; i--) printf ("."), sys_TerminiereProzess( dpid[i] );
printf ("\n");
/* Fenster zurueckholen */
res = SC0(sys_FensterOeffnen( window[1] ));
SC0(sys_FensterWechseln( window[0] ));
ASSERT(res == window[1]);
if (!all) break;
case '5':
printf ("Teste Schlafen...\n");
SC0(sys_Schlafe( 3000 ));
/* ein Fenster freimachen */
SC0(sys_FensterSchliessen( window[1] ));
pid = SC1(sys_StarteProzess( argv[0], "-s" ), tProzessNummer);
ASSERT(pid > 0);
printf("30mal Weitergabe der CPU");
for (i=0; i<30; i++) {
sys_Schlafe(0);
printf (".");
}
printf ("\n");
SC0(sys_TerminiereProzess( pid ));
/* Fenster zurueckholen */
res = SC0(sys_FensterOeffnen( window[1] ));
SC0(sys_FensterWechseln( window[0] ));
ASSERT(res == window[1]);
if (!all) break;
case '6':
printf ("Teste Cursor-Positionierung...\n");
SC0(sys_FensterWechseln( window[1] ));
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
rx = 1; x = 109; dx = 112;
ry = -1; y = 1; dy = 10;
while (dx > 0 && dy > 0) {
for (dx-=4, rx=-rx, i=0; i<dx; i++, x+=rx) sys_FensterXY(x,y), printf ("#");
for (dy-=2, ry=-ry, i=0; i<dy; i++, y+=ry) sys_FensterXY(x,y), printf ("#");
}
sys_FensterWechseln( window[0] );
if (!all) break;
case '7':
printf("Teste LED...\n");
for (i=99; i>=-1; i--) {
printf("\r [%2d] ... ", i);
sys_Setze7Segment(i, 1);
for (j=0; j<20000; j++);
}
printf ("aus!\n");
for (j=0; j<200000; j++);
if (!all) break;
case '8':
printf("Teste Informationsaufrufe...\n");
SC0(sys_SystemStatus( &sysstat ));
for (i=0; i<cStatusEintraege; i++) {
if (i && i % 8 == 0) printf("\n");
printf("%13u", ((unsigned*)&sysstat)[i]);
}
printf ("\n");
SC0(sys_ProzessInformationen( &infos ));
for (i=0; i<cMaximaleProzessAnzahl; i++) {
if (i && i % 7 == 0) printf("\n");
strncpy(str, infos[i].Name, 8);
str[8] = 0;
printf("%3d:%c%c%c%c:%-8s",
i, PST[infos[i].Status],
infos[i].AmTerminieren? 't':'-',
infos[i].Abgeschossen? 'a':'-',
infos[i].ImKern? 'k':'-',
str);
}
printf ("\n");
if (!all) break;
case '9':
printf("Teste Dateisystem-Info...\n");
#if (AUFGABE < 5)
printf (" PDVIXtest-Konfiguration Aufgabe %d, ohne Dateisystem!\n", AUFGABE);
#else
SC0(sys_LiesVerzeichnis( &dir ));
for (i=0; i<dir.Anzahl; i++) {
if (i && i % 4 == 0) printf("\n");
printf(" \"%s\"", dir.Namen[i]);
for (j=strlen(dir.Namen[i]); j<cDateiNameLaenge; j++) printf(" ");
}
printf ("\n");
#endif
break;
case 27:
printf("Teste Selbsttermination...\n");
SC0(sys_Terminiere());
ASSERT(FALSE);
}
}
return 0;
}
Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung