diff --git a/Makefile b/Makefile index 7dd525d..741486d 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ clean: # Demo targets # halt: syscall - ${CARGO} -x ./target/guac/halt.guac -d2 + ${CARGO} -x ./target/guac/halt.guac -d3 pc: syscall ${CARGO} -x ./target/guac/producteur_consommateur.guac -d2 diff --git a/test/syscall_tests/Makefile b/test/syscall_tests/Makefile index 4c8f4ca..25f5240 100644 --- a/test/syscall_tests/Makefile +++ b/test/syscall_tests/Makefile @@ -1,4 +1,4 @@ -PROGRAMS = halt.guac prints.guac producteur_consommateur.guac join.guac matmult.guac +PROGRAMS = halt.guac prints.guac producteur_consommateur.guac lecteur_redacteur.guac join.guac matmult.guac TOPDIR = ../.. include $(TOPDIR)/Makefile.rules diff --git a/test/syscall_tests/lecteur_redacteur.c b/test/syscall_tests/lecteur_redacteur.c new file mode 100644 index 0000000..bd6c9ef --- /dev/null +++ b/test/syscall_tests/lecteur_redacteur.c @@ -0,0 +1,60 @@ +#include "userlib/syscall.h" +#include "userlib/libnachos.h" + +SemId red; +SemId mutex; +SemId util; +int nblect = 0; +int nbWrite = 0; + +void lecteur() { + while(1) { + P(red); + P(mutex); + if (nblect == 0) { + V(util); + } + nblect++; + V(mutex); + V(red); + n_printf("Lecture de l'information \n"); + if(nbWrite == 10) + return; + P(mutex); + nblect--; + if(nblect == 0) { + V(util); + } + V(mutex); + } + Exit(nblect); +} + +void redacteur() { + while(1) { + P(red); + P(util); + V(red); + n_printf((char*)"Ecriture de l'information\n"); + nbWrite++; + if(nbWrite == 10) + return; + V(util); + } + Exit(nbWrite); +} + +int main() { + red = SemCreate((char*)"redacteur", 1); + mutex = SemCreate((char*)"mutex lecteur redacteur", 1); + util = SemCreate((char*)"Mutex util lecteur redacteur", 1); + ThreadId lecteurTh = threadCreate((char*)"Lecteur", (VoidNoArgFunctionPtr) lecteur); + ThreadId lecteur1 = threadCreate((char*)"Lecteur", (VoidNoArgFunctionPtr) lecteur); + ThreadId lecteur2 = threadCreate((char*)"Lecteur", (VoidNoArgFunctionPtr) lecteur); + ThreadId redacteurTh = threadCreate((char*)"redacteur", (VoidNoArgFunctionPtr) redacteur); + Join(lecteurTh); + Join(lecteur1); + Join(lecteur2); + Join(redacteurTh); + return 0; +}