I3MUP1+-+Exercise+8

= Exercise 8 - The OS API =

Exercise 1
I exercise 7.1 og 7.2 lærte vi at bruge OS API'et i windows, men nu skal vi implementere det for Linux og teste det. Ved at se på windows implementeringerne af funktionaliteten i OS API'et og makefilen nåede vi frem til hvilke filer der skulle laves. Noget af det vigtigste ved implementeringerne er at opfylde den specifikkation vi har fået givet for OS API'et
 * Utility.cpp skulle laves da funktionen sleep ikke findes hos linux, men usleep som tager micro sekunder
 * Mutex.cpp, Semaphore.cpp, Thread.cpp bruger POSIX funktioner defineret i pthread bibliotekket
 * Conditional.cpp var delvist implementeret, men skulle færdiggøres. Også med pthread.

Mutex.cpp, Semaphore.cpp og hvad der manglede af Conditional.cpp, var relativt simpelt. Ved brug af manpages, og viden fra tidligere øvelser, blev de implementeret. I OS API'et er der også håndtering af exceptions, så det har vi brugt når det har været relevant. Bortset fra i destructors, hvor det er forbudt.!

Thread.cpp var lidt mere kompliceret, men ved google søgning fandt jeg frem til følgende funktioner, som jeg læste mere om på man pages.
 * pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
 * pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
 * pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_parem *sched_param);
 * pthread_setschedprio(pthread_t thread, int prio);

Når implementeringen er skrevet skulle API'et kompiles, og til det bruges makefilen. Det ses i make filen af hvis ikke target er specificeret, så kompiles der til host, og hvis ikke Debug er specificeres, kompiles release udgave. så der er fire kombinationsmuligheder.

Exercise 2
Først testede vi vores Thread.cpp med det med givne main.cpp program. Vi kompilede i teminalen med følgende komando: Vi fortæller compileren at den skal includere stien: /home/stud/test/OSApi/inc med -I -L betyder at den søger efter biblioteker: /home/stud/test/OSApi/lib/host/release ved linkning -D er defines.
 * g++ -o testapp main.cpp -D_REENTRANT -DOS_LINUX -I/home/stud/test/OSApi/inc -L/home/stud/test/OSApi/lib/host/release -lOSApi -lpthread -lrt

Semaphore blev også testet med et program. Senere bliver den anden funktionalitet testet i exercise 4 og 5.

Exercise 3
Det testede vi allerede sidst i Exercise 1 med.
 * make all TARGET=target
 * make all TARGET=target DEBUG=1
 * make all
 * make all DEBUG=1

Exercise 4 & 5
Disse opgaver gik ud på at skrive nogle gode makefiles, så det et program kunne portes til enten host eller target. Koden virkede jo allerede fra forrige øvelse. Da vi skulle bruge vores bibliotek vi lige havde kompilet, kopierede vi de to directories lib og inc til en ny directory, og likede til den. Dernæst kopierede vi filerne fra de forrige projkter 7.1 og 7.2 og skrev en god makefile. udsnit ses herunder code format="cpp" ifdef DEBUG CFLAGS=-ggdb -O0 LIBPATH=${PATHs}/${TARGET}/debug else CFLAGS=-O2 LIBPATH=${PATHs}/${TARGET}/release endif code PATHs er en makro med stien til OSAPI biblioteket TARGET er en makro der bestemmer hvad der kompiles til.
 * 1) Determine whether this is a debug build or not

I makefilen inkluderes de nødvendige filer, defines bliver sat og der linkes til de rigtige bibliotekker. Så skal de samme kald som vist i Exercise 3 kun kaldes, og programmet kan nu køres fra host og target i normal og debug mode. Det bedste ved at have lavet en god makefil er at det kun er source filerne der skal ændres i den for at kompile 7.2