From 103bfe05904d3a3ff6f6aa49cb49c86ce356b750 Mon Sep 17 00:00:00 2001 From: Edgar Duarte Date: Thu, 13 May 2021 18:54:45 +0100 Subject: [PATCH 1/4] almost everything fixed --- BreakDownManager.c | 32 +++++++++------ BreakDownManager.o | Bin 5840 -> 6880 bytes MultipleProcessActions.c | 12 +++--- MultipleProcessActions.o | Bin 9216 -> 9352 bytes RaceManager.c | 16 +++++--- RaceManager.o | Bin 10040 -> 10480 bytes RaceSimulator.c | 69 +++++++++++++++---------------- RaceSimulator.o | Bin 11776 -> 12568 bytes TeamManager.c | 86 +++++++++++++++++++++++++-------------- TeamManager.o | Bin 26536 -> 25600 bytes configs.txt | 6 +-- exec | Bin 51144 -> 51408 bytes logs.txt | 40 +++++++++++------- 13 files changed, 153 insertions(+), 108 deletions(-) diff --git a/BreakDownManager.c b/BreakDownManager.c index b3061d5..1b1baa7 100644 --- a/BreakDownManager.c +++ b/BreakDownManager.c @@ -15,15 +15,16 @@ #include "TeamManager.h" struct config_fich_struct *inf_fich; - +struct ids *msgid; struct team *team_list; struct semaphoreStruct *semaphore_list; int start_breakdown = 0; void endBreakDown(int signum){ - free(semaphore_list); - free(inf_fich); + printf("ef uoioe fo uie uioiououieuio euiofuiowefue fiowuioefwo u\n"); + msgctl(msgid->msg_queue_id,IPC_RMID,NULL); + start_breakdown =0 ; #ifdef DEBUG printf("Break Down Manager is out!\n"); #endif @@ -35,18 +36,22 @@ void raceStartBreakdown(int signum){ start_breakdown = 1; } -void createBreakdowns(struct ids *idsP){ +void createBreakdowns(struct ids *idsP, sigset_t mask, sigset_t new_mask){ + sigprocmask(SIG_BLOCK,&new_mask, NULL); sem_wait(semaphore_list->writingMutex); srand((unsigned) time(NULL)); + for(int i= 0; i < inf_fich->number_of_teams; i++){ + for(int j = 0; j < team_list[i].number_of_cars; j++){ + int r = rand()%100; - if(r >= team_list[i].cars[j].reliability && team_list[i].cars[j].has_breakdown != 1){ + if(r >= team_list[i].cars[j].reliability && team_list[i].cars[j].has_breakdown != 1 && strcmp(team_list[i].cars[j].current_state,"TERMINADO") != 0 && strcmp(team_list[i].cars[j].current_state,"DESISTENCIA") != 0){ char problem_string[200]=""; char car_number[3]=""; @@ -62,25 +67,25 @@ void createBreakdowns(struct ids *idsP){ msg.mtype=i*inf_fich->number_of_cars+j+1; msg.response = 1; - #ifdef DEBUG + #ifdef DEBUG printf("Breakdown Sent(%s)\n", team_list[i].team_name); #endif - msgsnd(idsP->msg_queue_id, &msg, sizeof(msg)-sizeof(long), 0); + msgsnd(idsP->msg_queue_id, &msg, sizeof(msg)-sizeof(long), IPC_NOWAIT); } } } sem_post(semaphore_list->writingMutex); - + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); } void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_listP, struct semaphoreStruct *semaphore_listP, struct ids *idsP){ sigset_t mask, new_mask; - + printf("Breakdown id: %d\n", getpid()); //Ignore all unwanted signals! sigfillset(&mask); sigprocmask(SIG_SETMASK, &mask, NULL); @@ -102,16 +107,17 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li inf_fich = inf_fichP; team_list = team_listP; semaphore_list = semaphore_listP; - + msgid = idsP; pause(); - + usleep(500); while(start_breakdown == 1) { - sleep(inf_fich->T_Avaria); - createBreakdowns(idsP); + sleep(1/inf_fich->time_units_per_second * inf_fich->T_Avaria); + + createBreakdowns(idsP, mask ,new_mask); } diff --git a/BreakDownManager.o b/BreakDownManager.o index efb36a7ec4aee1c2a359ef745df1cd63e9762cd7..da5fad15111b85f4e67ac570a8b036bd3a54b55d 100644 GIT binary patch literal 6880 zcmcIoU2GKB6~1em;3R+z4QbjCGD+jaZo}3N~>kqowc|2{&aUn zHfhrknQd4tRxPEd!RWLNgG)0w@N)@X5fLgU8G*W02siZ}np6|}R zyNB_Pc%etSbMF1_Ip00^XU^Q+7vlq)S|SmlB_h5q8ZC_qvG3E3dQ4VhVv$%VKI&Nh z?>%Pauja%Dos}1Env?6%c@+<{IuEKEYx_C$89XX8vTH{60N@U10my#MN{qfKLYn&4 zuQYDH^g$;#1PvOGl%IjC8=&|p;onblaksRC(q>d4A% zp68Lfc>jlOLd=xgb#n_f{dpy4&CGibm;b)gJa^5gynF7Gd9U`oTY0B)bOG5`<#Xh{ zRL^Xs48W`|1YK1Uo8()WHP2mXHG81i%*aKvY7STBIQ8BZGlJfRx>$`ZSS#r|j+}1A z+TIz`WfM0d9fyYQ7^68cZJ3i^#)S0}m!~@p-Sz(-;LR2qaHia=HjAoj8r4{%YBs7n z8r8jx>b^#GxKS-Ms^j%){GgoXO#HCYICT_7{Fu_OD}7w)lS-dbdRpm=O3x~NS?McE z`=@RuejV-fOnHS2;X?U~&~(}{YxB&u_&1ClgWLPevjg$1#+GeHzgg)uE931mvCa*H z#+^Dcoirc`tO#!PN%7L*K-r#g;2N1gR~H}YCA2VzEYi>AzK{6@-L z?I%oUo&ouV`B%#>V_u&e&?@tRcH- zWJ*TfbsiDBGLyVw}twPn}t__qEn8${Qtl+ejfr#?z}1mEM6rNFhz&NJ}&6uY(es`}@}!-Fx=CImb2DMps9BSFHT1 zE1N67zp6Ld`=uTq#yE6|5S>(TY&LJ(Bj`Pt21Xx9DfcNId45nt#ycYqE|}jwMN9tx z;mcItGtluxoj+*lUwD_o*Qh?&)%&)Sv+Ccg`k%$X+P8JbJXpYIT=hSV7gP5uteL`@ zZWI5IH>F^IYttJf=BQ_Rt4FI`m0K~iTIDJ=!{^Thr9EalS6ap0b3sB{1y=7?!TK*2 z|MWDI)(?f?p9{fPgy3J3ICk6@T^pe061Hw~j|qF03eHPV@&q))oe=!HA^1VUF|Hm@ zo*%+qQFx9tM4lVcZ%}DA?#U4RbO?@L1I>7FA#aAi9fJQh1V;vL#&anI|6>ULmk|6~ z2>wwB-bODB)>;4Zk?$GVE+xEKoXbM+CqnSmA^7?bd}9dyR0#fb2<|6NWNVcdqe+p; zr4#8)a#&&6FHbva?oUIA63?)3J(9Vn6adGOw_6DVc`BCK8(mw)brq zNNnG5X)7~2X9>iR?G$L@G;TUGI$E-6=9wWoTW}7jx|K?)TFx331w{|raoSj_O{RENO+UMkvt6+jZ$gHz*c0FuCd5tSQ0z1I(rM34Iw zzbQKmY&^W0=Oc!m_u-3WvP3ik;e&!Y^-w@%|d3J>y^7!LjsDv%c#56-0KImGO7 z;nFz%WPyO6@B15!=V9v8_CI0voaavr=j))a5a36g6I3Agpg{sR9_Nz`H>gjKyH4T3 zb@&d$c|0#OoX_hO#{UT8e~aP#y*S74N11(#y1F3##~6OE!u5QAOns20%%0EpF@|@M zou2P{hVys^82&i3-^cJL8197NlMLtlKTvoyh^L_st!}&Sdn}a=w)e*mP3@;bSbw!M`2VYI6e+N9SaP>K%mM??aPyj`o#5nW0`_~A|1~t21jAZOeemyPHmLTgpM*I3Ty*?e_fe;=bGvNw zpOkZKaX-Q<5{$o~{0&Y@^_5L>- t8!iTt47A!Xe{cr(o*)rJ5+T_cSlmEU=8k6mS5^G@y~`!&|38Vjx!nK& delta 1953 zcmZ`)TWC~Q6usxpdoqvAOgiV@B%==X5!1#;Z6cB~%@|q|2qhvGMSrF`(a_i?&ICl1 zQ9`us2xi!{p!nf@2-5r*q@@O=iXZ8Zm>(hZ!{?7d6x*L_5XZgGy*JqnxZvz_&)RE0 z&bhCL?XztYEqZ^V(z@0xdo)DPk26ozytJ$w-(7jWA$G^5X*1*gTCGO@`7VdbycWp+$pbHJY@nkplzNyv5#@#3uJyxc2S7@6eqGwa+wAr3=mmf>QGtbws z$NS(DRr}eh#h8Z0cE)GlVwAnKQjWb6#e0>LNiQ{|X;ASu!)^a2Y{4D4D!SpfKxbRt zjh-(e^{4gju-CQE9rF1#1F54FfyfCojvsQe3HlB9war6;|kqmqO&4&wK!m8Plo@cN>Py{zo7%1*-O&_?lxx}G8n z6Cp$VrPgxT2Tp~hh$)*Q3s=L2*r3+!%62NYE0Ti!k-osd zk$heo9xWDNI`R?x6KQ}@v^QB8JUB2oG*rkJHM|@?^8Nn9xx%+F5M2>Im@f_w9?*t! zqlLT%<*0c$gvId&D>PC^26^q4yOc9@Dv@i{z- z%HDpa3FGxEyN5Bx^WM(cJk|ODhm-R>jMPhU399w7ben1D7CM^OHc$Q6G5#z230cnn zNd#g!A8{@5v@dBbwI+)%se>?)bP9iJ2T;>=xDMaR67hz{8BYb8a1hS1Jj6M9eqs6` zZOw61;Z{tRerI9LEbPYr!j__5FrK#+r~VOi9@N$rS|FNjo+jQ_#^PJmd8E+kwAIHF z@d9Ho6_?^Xq|si69dT(+v(zhD1`muRq*wvfgzRmjUJxYx5QkGG%lOrd-}N3IzXSh$(H*&>Xm&>o3u!X}52X=&NgGD|-~rv}&~si$ z2b1`RXweUN;h2#L9J0fHf?LK`{a-IE7#Tg~vt(wAzRCy3%#7aUgK3tm_hour, timeinfo->tm_min, timeinfo->tm_sec,string); + localtime_r ( &rawtime, &timeinfo); + sprintf(buffer,"%.2d:%.2d:%.2d %s\n",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,string); sem_wait(mutex); @@ -184,19 +184,17 @@ void updateState(struct team *team_list, struct semaphoreStruct *semaphore_list, //Prints the statistics of a race (could be midway or at the end). This has priority over writing actions void readStatistics(struct config_fich_struct *inf_fich, struct team *team_list, struct semaphoreStruct *semaphore_list){ - + printf("entered here\n"); sem_wait(semaphore_list->writingMutex); - + printf("yo\n"); //First line for team index second line for car index int top5Teams[5][2] = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int lastTeam[1][2] = {{-1,-1}}; - getTop5Teams(inf_fich, team_list, top5Teams); getLastTeam(inf_fich, team_list, lastTeam); int total_breakdowns = amountBreakdowns(inf_fich, team_list); int total_reffils = amountReffil(inf_fich, team_list); int total_racing = amountRacing(inf_fich, team_list); - for(int i = 0; i<5; i++){ printf("Lugar: %d, Número Carro: %d, Nome Equipa: %s, Número Voltas: %d, Número de Paragens na Box: %d\n", i+1, team_list[top5Teams[i][0]].cars[top5Teams[i][1]].car_number , team_list[top5Teams[i][0]].team_name diff --git a/MultipleProcessActions.o b/MultipleProcessActions.o index 48178ac3cf9b488eeff22235d67aa56ce275f3c8..d0aa2affe2e2e2db65f709e14e73d227c4d5a9e1 100644 GIT binary patch delta 1775 zcmZ{kT}TvB6vyYTtL^63s_V{&Ysh;XxBeDVWhACwG=>O~SFvWQyHGB8lcrwTh~=8jwkJaF&KoZtU^%$+;8Cpb_Q zDYDqq;bPS_W|5@e;C$D=?d{;;Y@2o&X&MfNjt*$|uh%5B;Lu2f9*6pL?}y-^4#KnK z4-eg=d1RC{;rT8|WCt92E*>8qX@X!{xRe zk8?SaYb~HA4n{bw{x6ZuDoMY+L3}Y+P9Q~Gx)TD%y0M4zf#RSp!Dj{W` z4SKyEXj82)m%YNOA?i8}HrWjuE;l;|FI+OK*XCwzZq?>4nw3FJl_@bvtAqCyi8!G> zCJGBaE39Cimo8`bBzj31Nzw$;I<76*JPz{Tv}=#jVd@y|Ee`Te?$;irY5gL7;{J=t zyZt}7-Wa0$qn1q=~#Iip>EqC+Y{5ac3Q?q1N{MEs zc3481$EmsQFt9vX>E}DcOc&uG($4}FyRtwCX(`_`M%_8R4XF%BIhn8QeNa8JvTCAPoccXoHJ(5o3fjZH@afrcf%e!s4vSR+GwwxOX9M8kXvm&=7^ldBfH z6<&-+c1o+`DMgy_*fhnB41MIuSFDf(Lmd3u&dgt63+ZX$#&IiLXGg#J%FJiB`ENOI zSXLXumKrm&hm#sIQj*WYeBM^>Lb7UmnVg<#2d7y8s|VIu8!Wq;p-gu}w(e%F5Oe9Q zo$F4nySWaMHg02@9F1wb2Cf_Sp+b4YeY&`QO8SA@c8eUxQ{oOk@E}PRaFBh_!M9o^ zHH-2V2ic=(e5=jHC+(B4_wL_o|03+3^tk<)$g?5rR)%(nlioPjehV;{5jXG?!R2{a zc6T`Xu5|_aZuDHe1jmgitQ!`afQo$GSQXLKJw597Zd}$Nfb^H3Hk_Rb&45V0&OES* z`Y0@;=Lyjs<)J5$d1}bVXcm<6ve?gRA%?mROrIaTK09>#s#!Tq`uyw(#C(27l&&v|9S)aN KF*^iGO8){#lc)0l diff --git a/RaceManager.c b/RaceManager.c index da228cd..2102227 100644 --- a/RaceManager.c +++ b/RaceManager.c @@ -42,14 +42,16 @@ void my_handler(int signum) void endRaceManager(int signum){ - pid_t wpid; - int status = 0; + for(int i = 0; i < inf_fich->number_of_teams; i++){ kill(pids[i], SIGUSR2); } free(pids); - while ((wpid = wait(&status)) > 0); + + for(int i = 0; i < inf_fich->number_of_teams; i++){ + wait(NULL); + } #ifdef DEBUG printf("RaceManeger is out.\n"); @@ -60,7 +62,9 @@ void endRaceManager(int signum){ void endRace(){ + printf("!!!!!!!!!!!!!!!!!!!!!!beakdown pid : %d\n", ids_proc->pid_breakdown); kill(ids_proc->pid_breakdown, SIGUSR2); + kill(getppid(), SIGUSR2); endRaceManager(0); } @@ -92,7 +96,7 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, sigset_t mask, new_mask; - + printf("Race manager id: %d\n", getpid()); ids_proc = idsP; //Ignore all unwanted signals! sigfillset(&mask); @@ -187,8 +191,9 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, //Notificar os TeamManagers do inicio da corrida for(int i = 0; inumber_of_teams; i++){ kill(pids[i], SIGTERM); - } + } + kill(getppid(), SIGTERM); kill(idsP->pid_breakdown, SIGTERM); start = 1; @@ -276,6 +281,7 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, printf("MENSAGEM RECEBIDA %s\n",data.message); if(strcmp(data.message,"TERMINADO") == 0){ + endRace(); } } diff --git a/RaceManager.o b/RaceManager.o index eaa5656db135a3ea3f76f0f581560009bd1d32fd..331aa8864faaca9a9ba2897c461668d88fbfef4f 100644 GIT binary patch delta 3311 zcmZ`*eQZ-z6o21*Qm9giM5vNXe#?@tKiD6RVqJE{s8zkjO|u zoMsXN0HEg4vL!eib7GW;@`t9Io*^QA_0-iraaR$j2)j|N{x*f?%wHeH1loo3N&Orq!h^{Z!ARmrcv$04YW$qWdou04$U~$20kqsLQq$p6jMCl5pLrTw5dalwnO4lk~uk>=IpH;d|>1|5)D*ZZX z7@oQ>uWM6#XZH(6TWfb0HWhjc7i7{LrvrtLfLU~0MBqe`6wPo%O3@0}ao(+v9`HzM z?bf@>z_AFQ(J@=zP|SB>F>;PGj+b%zVWX6>L2bpOVz`)<`b0uFeFcxv0_8`0Fesyi zkCSmorgzysML7+_U14?Z&L(f#Zs(=v&FK$jrmrxTw54k#qiw|;O|g0>wRsdp_F-j z3@0pUoncnqpfAZ<|22!ucYT$4(M#Qi56Ml&=P&gxtgvKQ+-I|hL|=>3LpQ_ej&krK z@RUfaT3e};L1qoZbxVpRO0OfPc!_j;0TEFsOAbCxv<8i*$63Yrd5r%u!)cF)@F97P z#o5P94M5z=PAXX~FSJHfkwC_*MmlszF zBj~$I=|hmf`3E$&exseCklPG=oZ9{%YglHI&2A-K@{V=M1o+diy-dc}Gb@G9(BIT% zjZ-duIC|6g&bPUX@vB+(0mkRYC}rdDQJF{Nz>#tpF3UnU6gmo2$y{AYg~q88-lZAJ z>tW`_k7F&vd9)~8E|=mN*jO&DEi5v>hx#aT{2;UP+v^y^x!1`F@H-5D0Qca$myXG} zKuO=%CL4z=pC`UmbEqeLcYB%d{b+My9$|Qp;lnHrbz`;e?ca<)i}6=wHcLaMmZqFeFg_1tUHg&!;aKg?7ZNnyqo?%^ud-YZ#xOvD!5LQO%DsK0gT! zHtzl3Ez$(nr^zt>V^QLycfz%^aJ<~l$jkbQdC}Bq@wedd%lg~QcQ&(T(iul_a-G+u zPtkb#%l1N|LWV8o#dFPMUS$~7sbLX_3Mm@M*Xm%t{6^dkF|_VsR(^o?Lm2bE$*er@ z8J71UmiLCL)=PmiobEMvwDP)bVrh9;m32 z;v&>kT{EQ%N&@q8=14oH-v!Nqd7=ptfe7l$fk@6;`j>$cHlZXq&+K!<%HSgLAtZtk v(GQnVUja`jVlEHB%Fv?hOZhha3pf~>pM9XvUhRkPL-TV|0ejVLU{c>dywHV= delta 2841 zcmZ`*e`wTY82`TKw%g9#yq(wHebw8%?Y6rOl@6j@ncK3no6+=O!;q{-%g{e`<$_G- zX|rG+;?5@`VW=Z1LS&6eXpy)T3=v`TpNbhWMM{)9ZIQufJTco)Jje@VW=o+?6pySIg<@ozOXi6Ku)kn)$$f#5znOSAH)kz+zYJ~_d?t27+Wo@F z9ruoWaU0sa&G~H`mp{7^ro6$CKfN_BaRP$ArT%)VDPH3Hz_rd>&{6Czv|xj8r>Gve z;QLJ==X3wA)EIG46c^`@aQH1@siWh%0td-y9E5wY7?S6m$r{0#@OF)F)cCg=KdtfV zg^pnYC!glv1V{ZvVhRrWrTAIt-$@?}l#4uw1*BN0v|njk=?bN5lwP59OzG81H!Gb` z`bDK*QTiRFdz5|;4nA@go-TV5_Ln{8edG1+uI-&x*IV0nc5j2>vLVq99a4%e7%rD$ zFJy3iSRuz?RLa;%U3?zSWjJQ%92wHM3un3~HF|#zLgmuFsCVQgaTu?wki;xglq+?c zaTYVq-x@cO8}xpGZY{<1Gd|rH65@Mtm|P0LJ@JDKw~0t0$Ux8AI7Fe@mSPPIqTWQh zWxGTDAG1s2G}$b|yNn-V_(AAcBJK1%)_$0@r9Hr6QbQYYkbDYaiA@*%lYiaH3PeoEaf>)203s;utyCxq)y!MATUpO&D}{^TFtvR}R`G+<`H%_9RImWeD8!_>K{Pj8f+lp;jt&CsC_y-&uA{C{n3(S|F<;pzxPYkDn&gfh>HBM*Y zzr{O@&*RTH_!iYfejkO~iD(XQ5)^2h64c``hp%A#5{9pV(n={dK(a!L9cq0Nrg6O# z1}mjqRrp^PUe-#Otdt$kXlrh+B*Vij*C`f_ni9}2ptFp>g7FtXX1RPmx#ZjJ8sLc;7BDFW#RUj8C;~)wSJWe14g-Is8t||HHwZmn1K1mdX-tNQPuA zK)pmU56?K;8qaO$+vFwo!Ei{n^fF)m;u>JSt1z~C@Lw`M9qf=U^lJ!(q&>#0{4I5v za@jw!m`hm9Utt=pv-9}k)v1yq25+Kng2^grKd1lH>Abw=R%k|Rm$uTWV=T*u5UZAA zOzAn&sR%tu6kALR`XSKJ;!<)?uT!9$8{EEgji%TWNXSj2k5H; zrMwvYwU4{pUYPWi!K<}VvpiKB^%T+{JIZ|l*O2sA33wuFUExIzHxd<5=!-Op1YC|Z mx<0M~Pjqcjlm71d0+P`uin0MG!coZJu8G=+(hbSl%6|Y*8T9Y~ diff --git a/RaceSimulator.c b/RaceSimulator.c index 76193be..f7c097d 100644 --- a/RaceSimulator.c +++ b/RaceSimulator.c @@ -49,6 +49,7 @@ struct ids *idsP; int shmid; int named_pipe_fd; pid_t pids[2]; +int race_started =0 ; //Only for debug purposes will be deleted/changed later @@ -93,11 +94,12 @@ void leituraParaTeste(){ void clean(){ free(inf_fich); shmdt(team_list); - + msgctl(idsP->msg_queue_id,IPC_RMID,NULL); shmctl(shmid, IPC_RMID, NULL); sem_close(semaphore_list->logMutex); sem_close(semaphore_list->writingMutex); sem_close(semaphore_list->readingMutex); + sem_unlink("MUTEX"); sem_unlink("WRITING_MUTEX"); sem_unlink("READING_MUTEX"); @@ -107,6 +109,24 @@ void clean(){ unlink(PIPE_NAME); } + +void endRaceSim(int signum){ + pid_t wpid; + int status = 0; + + while ((wpid = wait(&status)) > 0); + + leituraParaTeste(); + if (race_started == 1) { + printf("oiioioio\n"); + readStatistics(inf_fich, team_list, semaphore_list); + } + + clean(); + exit(0); +} + + void sigint(int signum){ printf("SIGNAL SIGINT RECEIVED\n"); @@ -116,23 +136,24 @@ void sigint(int signum){ kill(pids[0],SIGUSR2); kill(pids[1],SIGUSR2); - pid_t wpid; - int status = 0; - while ((wpid = wait(&status)) > 0); - leituraParaTeste(); - readStatistics(inf_fich, team_list, semaphore_list); - clean(); - exit(0); + endRaceSim(0); } + void sigtstp(int signum){ signal(SIGTSTP, SIG_IGN); - readStatistics(inf_fich, team_list, semaphore_list); + if(race_started == 1) readStatistics(inf_fich, team_list, semaphore_list); signal(SIGTSTP, sigtstp); } +void raceStartRaceSim(int signum){ + race_started =1; +} + + + //Main function. Here the RaceManager and the MalfunctionManager processes will be created int main(int argc, char* argv[]){ @@ -145,14 +166,15 @@ int main(int argc, char* argv[]){ //Create the wanted signals sigemptyset(&new_mask); sigaddset(&new_mask,SIGINT); - sigaddset(&new_mask,SIGTSTP); + sigaddset(&new_mask,SIGTSTP); + sigaddset(&new_mask,SIGTERM); + sigaddset(&new_mask, SIGUSR2); sigprocmask(SIG_UNBLOCK,&new_mask, NULL); signal(SIGINT, sigint); signal(SIGTSTP, sigtstp); - - - + signal(SIGUSR2, endRaceSim); + signal(SIGTERM, raceStartRaceSim); @@ -219,9 +241,6 @@ int main(int argc, char* argv[]){ } - - - unlink(PIPE_NAME); #ifdef DEBUG printf("Creating named pipe.\n"); @@ -271,24 +290,6 @@ int main(int argc, char* argv[]){ } } - //The main process waits for its child (BreakDownManager) to die - pid_t wpid; - int status = 0; - - while ((wpid = wait(&status)) > 0); - - #ifdef DEBUG - printf("---SHARED MEMORY BEFORE THE SIMULATOR ENDED---\n"); - //Only for debugging purposes. We know that there are no protections to the shared memory here, but they - //do not need to exist because it is in a controled envirnoment. In future work there will be a mutex - //stoping any readers in case someone is changing the shared memory. - leituraParaTeste(); - #endif - - printf("SIMULATOR CLOSING\n"); - writeLog("SIMULATOR CLOSING", semaphore_list->logMutex, inf_fich->fp); - clean(); - return 0; } diff --git a/RaceSimulator.o b/RaceSimulator.o index 69456593fffe0f66df3b2e9beb5bbbc9bb797483..85b90e0b99d6d9ba6dc9b9ac6ddbd5aaeada7db6 100644 GIT binary patch literal 12568 zcmbtae~=tioqwBMA*>0z5f3AXbdW&8Wyd5Suz`@>Y$oZoHk)O419~Bjy)!+#&CV}- zddNl+qpr&_4$I~KxT;v9QgsDKl_(S{YLH|ua&E9Z#2@G7>MV?n|_`@GNlzVG|?>+g1FU%YSgf~F>+OOv=o)N2|Q;y_3Jx=UVmi3`PI z@k-k}|GeEUzi3aMY@dnGa?7udFA&16EavMEYcGJ(n z)v0RRC!QtlO#HO$H~zZ)?20{BiJz`XF0h+evVJ;R>1tuwzSozUw%6K~_n3`5Rq0CE z~eTlY3tk`%ctvr*MGD*{0Ge^s-&~2kxy_NzcFhoK~s} z9A=)JVa@xr8CqK6Az{f2B$%T#=X7 zRPE`hS1zMg@pT^YV3mFkRq1N}4qtAb8#`~XSI@$~uUq@1 zT(kwjx>{_WB}{RQ!*$~W(~(p5^jkaa^1#@nWWaPgCD3;N-Dk+L z^BrWLZ8JH%kZcb_RL@gJ(IIwR-8bc)mP${{MI~@(t;rKj8Wh-&Sb%RCV_ia+HdgoLv%JjBRy4 zAd1&=6IDPxjOV&x_Z!iSc!9P)+R_fb%6kAu8SG8R>0y3Q&>l3WK~CY`sUJ{Oe)MVn zZ4Ex(_N1)eJH=gibCsK>ex}sTwWt40HW7n~#XIeR%>H^!Ws&kz_peaDcu=%ovf8}vhF%7EQB(p$P~bO9N)^7 zvLmjqK+uj5{lHBv6QVbFmy_{Q zYR+tBt;4d`?M2se$YfV`bVf3+bvOHvX~CFlkpt4+Xvue2v}mQhjJsF#_%79RqgHXu z@!gb_b+dVYHyONjdtdkPwn1xXxO=pE=u3=H<();%0wWpSm4JT$y#^$n|6uUu&@TW@u&sgKTfrYv?^ zO!PRpT%Ll1EpsKd&Jz7Kf@(;`#I}N)W7Dy-G)qh5i68~6G`rdNc&2m3m=Y7qcYL6A z=kja9Ns+{kIg{OKt>_$jIk5Dj|tj^fAvDF=GZYas> znvbkq9b0|f$`B6C5-oIYr-L6?poyqYF+wWP>v-rH`^P7nx+isSvLj0D`x_!Zm+$@$7bcbr+kL`5Lx)Z8xAGR&H zOZMgV1FC)Joc7^byS)FYjmN2ty-hYt>=@%z{=^g4w%L<<+OiFQXv*ZP--Vk6Hqdo* z!@u+yZ!Fg=y&e&fIx=0D)3AhUO|&{kIF+M0q-;5ws3+=Ow{MKr~ml*J+2HY~>?>6Aq8}NC_Pl8gL z`0()i6Pvg9_YC)L>rW(N*InCrt?+W`MA}P^iGWhrM8+!yqUdIw!dTvS!z!mtqBxfI zQbHy!3C?;F>69o?i|{GSN>G~137^QgUO@TUfa5#EZZU90VoTq)jop2TZJRd_#fKBa z-5dMj2~qI9T#y!&KPD-O<8x6YGp>^pY2S5utW+Q*{O(Zk9WlO<}UlrvLwrAWcgC$mm*oIAOcmG4%#lS=Vb*2!e@NogEsXwsA(nZItPv{mAT zJo|PmOSvYW963dk2KK5~ijs}h}$^YelW^LY!^`llGA!rMIm<*e~P zGDsz=zmD$HM)*ezIPWKo_-|%mDpCEd20U-TKMgp~i*r#f4=Fr4uP*_9G4b?#Uo_2{^fwb z41D&_3(EdK0^b7uDwXH)=?cI%0DckRafNd{zXkAH0q1dlMhBPMKnL%aoxn%Gr2xnH z9|s)oqq{)=T{NEd&qo30TvFqo1pG?CA5=Kci|s#22bYI{kM=(be6;7QfaAQL0UY(8 z1^ugNJZKYNj3l1z+VCQsR*B%WI1i%pU1{g;pSy@X#J}JM|(OH9*u`i zz|jv~faCgZ0UZ4~sBpFi*Z2LvUkP?5fsc0X0zSv>Z1|Wx^L5~_0-f&z-U0Ye0gnOx zd%)if_yy`udbS_&%MAD$1O8sX(Vkls&i-Ex;3=ppo9DW6TnBEqkyB%_d#b3*z@BE{|L2l`6=*m z+?Rll+DV;Ojx>dKyEo*EZm@J^JsN9TEI-<%f|7 z{*1y$LH`EO&j5ZS;6CVJ9x`FTCjrO#-V6Gjp#QH1{sF*oT|Ngm#>vBgl``;JgZ&du92EG^J>-qAxYcA~n4Rq*v?FK&neYekm ze-dzBuRD}I{{s5xhfe{Het0mVbGOoY2>9rSM}gl3_J0}p-GKi$;2Qz|g#kYScn|QG zau8Et^LW1ZDLb!FIQw%G9onBa0UiguFQW5+(zy-z_#W&I;N!aZz~2n|7F}~;StTv& zUGle%>+ew?jNtlv&YlRazr#Eb!S(kOo&V}__4kt>NBH{tiHH?=4#pul~y%7y| zQy*4x#}a9uKF%vk&h2DTcYai<^tmS1rLOK)>!KUfV@+4(dsdE>t{M_vJgz=89p#rC zR9J@lsz;& zAVBN5<$4$e30hicMOz^%K}%2}&;YS{2=fpR6+}w~C@s(eiI5>k1W4un|Ln}&=d~w9 zWTe~K`R1E%{`u$M+1cH@F513oT1}16sYYBNswIsIas7hod9yri7DtNNVsHIPpRcn^ z@7e=<8b+i0xaR#`(}b|gv-!Ln-Dk&Nwo5PDkMF9r=W{mQu6d?@yQtqjGB{Gd>?L;jJ7y!t%FPM8^jzs_d+2;- zJKy-i2fla2_Ul!e8f8)mgjgRlH z*{Xs-N)1H!QRBdt=2^?4`|59;9k8B#vT{8H^>%4gg^Z-@Vo75K5myD z+(sGt?mhP1;4WFIf+Q%)upqBhokYCLzF?6GkBd9miD8UQ31Jnz>b0QkuFS%ufeas4 z@j)qwT!;y~d?M9~zp~zr5jyT1p|i=$WT|#ya2#Z-)|p?eS;K&I^)!FEp8N6v;t=~7 zu6m|C$nz9jZ-f7kr$JU4t;Ub7e4;KXxLhZANv#kK_HFi1C#)D$uD|aIz9a4!spaW< zx*Cvyav(f7a$Q}uCcq}I853<894SJZ(ZN?~2sAljcW&Z!QEr~achNw!+}u!qpQMs$ zbVp@tC*HD4qk4G`Xp`^hWA@O|%j{BT-+*MmaF;~5!}^7_P1rPf3z7ik|LMT5H9ilfxUA84q# z)|a4ioTQW*rcyoapmfk5aK4i-E3|uXWYa0Km$DexH^)B)>#BZ06wl?lrhsY~Pjthk zgV79mffg)Uh<1F!YXCcA~#hrq;+-gkJ zSu1k=R=4l?uGQ$#cA>|0GFH~fxXY~|5y}*gDS)*)1uI+3Y;X$-BrV3gyz3?^ya0>m zvR*Nh_fxqn^%+@`l+1#gPB|M=>6E`oTGAoatX$GcJ9#orb)TpcP1PjUtm}zhA};P~ z>uKv)9Scfb(Uz6fQa+V;MR(ikj+S$=&bnx9GE4hQ{F&7 zzBjGzSjQLW2xGLI%EbEzPBm9`iJJa~n&W59n7NfM?-K~)AEyQ;M~`gy>9p3_htZ zGL7{kdGD*D!CCE;Pq^%ZspV>=*TO2ymv{IH6?3RmL--EfTTwzrt(Xyjp<}He2ThS` z#o<$+-0xwNaDF_WBR(G2N;*H&fS+%`+YR`I3g=kir1OjEocq;fox2LxcIfzMGP z4LT;I;w3(12fNz*7c1Z@{lG;F}G2*?{w!JeB`{X~6$zz#lZ=j~eh7 z40yW%f7O8h(}4fWfWK$J#|-$m0Y8k^<*EEOX>$>ytwXe@=XpEI{+SYc&Vv)1X zJm+kY$|hsURJ>34v^9*SQ=Tt8H{;~{as@Xi@|Hw+eVJ53$c;gacNMW@LgcANq}`NH zTcA#-;Pkkj?~2&!_O&Zo+GA^1t?G{U#Clp*v`1qiUr1&Bq@XQXoc2YWdm^58ovcU} zT$kk&)Nx-X?x(r`SUjEc2&S`QHl50D6ke*A6a?=%-1b~Am$Ob|akxZtGUZ0?CC7VgQ(x0(d z%FD%8vVaJq`!^oIgNqNF;vz%UjY9Iz>in=QLaY(RE4vhyl2%q3xJRIECK#EfqxG0 z>j7^A{i}eYI|-8@t=@v zA%11x-x=b+toU~s`1b-I{qq3ualRe_{*hqklLr2?z~}pe9@opj=a)np|2y#6KX1{G z(;L7)iOQNkUG0ZB-kAS3{Wu-2aLzDp8-S1Tc|73ghk1abev`sEv*@SoIS=r;fUf`@ zewNYv4&a{xcu$B=RWe;>;QN4|N=&W)Gr*4m{3g)H@!kqJUXOPGj()ov^iKo*`vE@| z@J9e|1pIZt(QmsH&hv|Q{ugkx^FzSV&d)&qH0W19NV5LvfY=JqY?1m34eR z8seW(!)zfQ2R^Q=&ja2_JgxH);1R(0fj-(l4mjFhr(W^!ynh>X<|tgpiQb>O;q;3plQC zY0$xaj%UDs0y;}T{}$l0J=@tKl&jS1*(82x2 zV+Q;gz;V1UfIfe))BV0?;J*nt&dWQ1W1Q>;9Orkh!Z{w!hJHT>KH8~Y>9Tuqyff6R zUe-bX%vQMOQ?*QAH{d4$j{P%=*=O$k@GiE8&-1rV#xx1OjVW~T4qsmUOLovtRmK|&PJ4FT{4hwVpC3jk@fyf&)v_+%4KaSY!qsCxLqXyOQ>1YJd@pCsuiBpXT&#() zLdC#f%H*HOBoG|5{Tkx6k=yg05z{c=Bq%KmvdU50uk#gDqt7cOI{84gM~u(IT>d`9 zTeGnJW2(JHb(q5TUrv>*8E)UeH$O_-f~;~3x92FFYW}y*51RC=mOP!jMCtbYu8GrB xeKS6y`nOeJ^1YQc!tGge(%dso{msg_queue_id, &msg, sizeof(msg)-sizeof(long), team_index*inf_fich->number_of_cars+arrayNumber+1, IPC_NOWAIT); } - printf("Car %d while2 \n",team_list[team_index].cars[arrayNumber].car_number); + if(msg.response == 1){ #ifdef DEBUG printf("Breakdown Received (%d) => Security Mode\n",team_list[team_index].cars[arrayNumber].car_number); @@ -193,18 +207,18 @@ void racing(int arrayNumber){ current_fuel -= 0.4 * team_list[team_index].cars[arrayNumber].consumption; distance_in_lap += 0.3 * team_list[team_index].cars[arrayNumber].speed; } - printf("Car %d while3 \n",team_list[team_index].cars[arrayNumber].car_number); + //The car has no more fuel. This means that the car is giving up on the race if(current_fuel <= 0){ strcpy(team_list[team_index].cars[arrayNumber].current_state,"DESISTENCIA"); printf("Desisti\n"); - break; + gaveUp(); } - printf("Car %d while4 \n",team_list[team_index].cars[arrayNumber].car_number); + //If the car does not have enough fuel for the next 4 laps. The car enters security mode if(interrupting != 1 && terminating != 1 && current_fuel < 2 * ((inf_fich->lap_distance / team_list[team_index].cars[arrayNumber].speed)*team_list[team_index].cars[arrayNumber].consumption )){ @@ -230,7 +244,7 @@ void racing(int arrayNumber){ } - printf("Car %d while5 \n",team_list[team_index].cars[arrayNumber].car_number); + //Passes a lap. Sees if the car has a breakdown or need a refill, if it does then it goes, else it continues the race if(distance_in_lap >= inf_fich->lap_distance){ team_list[team_index].cars[arrayNumber].number_of_laps++; @@ -286,9 +300,8 @@ void racing(int arrayNumber){ //If the race has no interruptions else{ - printf("Car %d while2 \n",team_list[team_index].cars[arrayNumber].car_number); - printf("Number of laps, name car (%d, %s)\n", team_list[team_index].cars[arrayNumber].number_of_laps, team_list[team_index].team_name); + printf("Number of laps, car number, team (%d, %d, %s)\n", team_list[team_index].cars[arrayNumber].number_of_laps, team_list[team_index].cars[arrayNumber].car_number, team_list[team_index].team_name); //The car ended the race! if(team_list[team_index].cars[arrayNumber].number_of_laps >= inf_fich->number_of_laps){ @@ -305,10 +318,10 @@ void racing(int arrayNumber){ distance_in_lap = distance_in_lap - inf_fich->lap_distance; - printf("antes de esperar"); + printf("antes de esperar\n"); sem_wait(update_waiting); - printf("Car %d while7 \n",team_list[team_index].cars[arrayNumber].car_number); + printf("i am not waiting anymore\n"); if((strcmp(team_list[team_index].cars[arrayNumber].current_state, "SEGURANCA") == 0) && ((strcmp(team_list[team_index].box_state, "RESERVADO") == 0) || (strcmp(team_list[team_index].box_state, "LIVRE") == 0))){ @@ -323,9 +336,11 @@ void racing(int arrayNumber){ strcpy(team_list[team_index].cars[arrayNumber].current_state, "BOX"); + printf("I am here"); //Waits for the everything to get sorted in the car sem_wait(wait_box); + printf("I passed here\n"); current_fuel = team_list[team_index].cars[car_index].consumption; @@ -336,7 +351,7 @@ void racing(int arrayNumber){ } else if(interrupting == 1){ - printf("Car %d while8 \n",team_list[team_index].cars[arrayNumber].car_number); + sem_wait(counter_mutex); amount_terminated++; sem_post(counter_mutex); @@ -371,7 +386,7 @@ void racing(int arrayNumber){ } else if(current_fuel < 4 * ((inf_fich->lap_distance / team_list[team_index].cars[arrayNumber].speed)*team_list[team_index].cars[arrayNumber].consumption) && strcmp(team_list[team_index].box_state, "LIVRE") == 0){ - printf("Car %d while9 \n",team_list[team_index].cars[arrayNumber].car_number); + //car reserves and immediatly goes into box //TO-DO add semaphore is_reserved = 0; @@ -386,7 +401,7 @@ void racing(int arrayNumber){ printf("(%s) Stopped in box.\n", team_list[team_index].team_name); #endif sem_wait(wait_box); - printf("Car %d while10 \n",team_list[team_index].cars[arrayNumber].car_number); + if(terminating == 1){ strcpy(team_list[team_index].cars[arrayNumber].current_state,"TERMINADO"); break; @@ -426,7 +441,6 @@ void racing(int arrayNumber){ //Normal time else{ - printf("Car %d while11 \n",team_list[team_index].cars[arrayNumber].car_number); sem_post(update_waiting); sleep(1/inf_fich->time_units_per_second); } @@ -439,7 +453,7 @@ void racing(int arrayNumber){ } - waitForEnd(); + anouncingEnd(); } @@ -577,20 +591,30 @@ void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, if(team_list[team_index].cars[car_index].has_breakdown == 1){ //Sleep for a random amount of time - sleep((rand() % (inf_fich->T_Box_Min - inf_fich->T_Box_Max + 1)) + inf_fich->T_Box_Min); + printf("Entrei aqui\n"); + //sleep(((rand() % (inf_fich->T_Box_Min - inf_fich->T_Box_Max + 1)+ inf_fich->T_Box_Min) * 1/inf_fich->time_units_per_second)); + printf("ehhehehe\n"); team_list[team_index].cars[car_index].has_breakdown = 0; team_list[team_index].cars[car_index].amount_breakdown++; + printf("epowierpoweirpow\n"); } //refill - sleep(2); + printf("Entrei aqui2\n"); + sleep(2 * 1/inf_fich->time_units_per_second); team_list[team_index].cars[car_index].times_refill++; #ifdef DEBUG printf("(%d) Left box.\n", team_list[team_index].cars[car_index].car_number); #endif is_reserved = 0; - strcpy(team_list[team_index].box_state, "LIVRE"); sem_post(wait_box); + + sem_wait(update_waiting); + strcpy(team_list[team_index].box_state, "LIVRE"); + sem_post(update_waiting); + + + printf("Exitedd BOX \n"); sigprocmask(SIG_UNBLOCK,&new_mask, &mask); } diff --git a/TeamManager.o b/TeamManager.o index e6c929a794803009b8bced91ef9e4c5bef5e0cba..de36350b88c8e94aef730e1aae01ad3c1636baff 100644 GIT binary patch literal 25600 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 cgKQ^l#Sy<rxi^T77PB_VZ~OKC3yJjcZ~y=R literal 26536 zcmdU$4RloHna6KPP)e;6@S|*N?ezl%)EERr5H%r;+_;cr^MUA5r$c5!rX({tGZVm8 zw$d2u?2wAB?fSLV+U}{fr(4~%mC_19V?%9gQPA4DrO2)dg>Lz3O)Hgs{_lO?nSU;G zH`#VL+kMZOx%d9=|32^YKJVwfcji;UMc0lgDX~l{v97lAM}}I~lt_NRO6^uzr&=Gd z4hPQuV~dk{)9Kl7XV&b`j>Wm&{_fCV@CbJIo#(hL+j7Kdec9QvyVNP!=434=Gq?wW zp5T!ZC;I{Hxip&Wfx$UXVkg3ZCRYvgC-NOl|?<#E6 z`O%on1dr~UWZbLV0Au&R^Pcw0b!JZRX!kGkd2tSd!6D?fZ;G+dGBm7!n{YN?%Apct zap<<6=u6DmVjgk~PVl}P==+?^4|H5Mpva2mD=ODObnOlcZ%=dG8%N7ICs=lc$IgClef+-tY9C0dJi? z<#hg9?M}AJJ{*|Ve>gCq*O80c0>4%Ji)4SWcd2~i;%qMrXL=*@?G`)J`!U(yd_;0} zDmr`qTSG-L~w?Z?{uI!i337n+DPl)Kpk zzO~KuvSgdI0J!S%Y*m@l_w5ELfAt1y9OC@aM%h@p%@oP0g2h)gg5vjnTOxk~b1IJM z!K$+`TouQd)6;J|o0@_PTNG5J;zytDqsffXFyL7%3f!^nf7VX1x(udq(r@RkC z&EddOl>zqm28-6TRg*bBO8+TQIvluB6|FeM(b2l`r9**o)&33zZg}C4MD0-E#@yH{ zS*pSoCrgRop}@3llA&tSM{HzyQpI2mbvxoC`;;?;C>mK>V#-zgh$3E*VAMx5dfWV^~TTV*XL zJz;BcVkqsfN_y=L(wUZ;`U%|mu@l>&(l-~!`Ty4gd~rfhuu+<3r-sa}7?aVt1D9?I zeERlNi`E?)%6pzI$uyJ~sUVIR8ey3{x;|oMUMMi%x|6>2%s=J=5awl`B zK!Y!mdGv49db3sI<~$o%ho>LKG40cVoIZ7@C}+pzI+dxtp8hgv;7R7i z6Mqx6H}<|<^KzG=xiQtObJgO>?GX8g1;*k3SAfI zeXun548a{b-8N`C_sC{XScgEX9kk}xFExw1(ffq%?3Ttn3d}#f(9bf^u&^F;pRMRI z?8MJmcbznB&N|_b3jRu_Lz=<BJ0UoAXQWEAU`Xmfl-rt)0s((0f!Z zRfd&PpZz~rdjF+kP2i5*zQq~EXt4L;qOIEsHrwOYIx6g0@7t%n6ZT-;?Vh|sznVIx z7f5@LynXE0`uzH7y^{?NMVuM#%Zc<@_1@rz&*k2{$g4Rgvu2N|_J~ixquJn5Z7KiK z!iY0#j^-cOuD>~Fq#&%mzIsV@OLeon{A-XLHaMB?C!9>nV@_uABMUOYhZbcPujiL0 zui>Rh{vF*$33cxEiHsJE^E!1t@z5VHfoBqd2gukvgBi#tfYhsxL{JdwyLa zEpn^8W2()(TCLi<+TT(A4D34hIen-1VsAq^4tw^L$osNQ*moP!JHK~U^p`uCXPvdX ztpn00GjBOlUzIyaXU>lFL}%@OOSDeUy7PxnhJAZQxpwz4*>|Sy$nW>QoGzcNXwRN; zPRTB(XPm4NWYb^jY}qqLy`Rejx497!pYZbA+zq)U8VnAIeQRHnlNDXdfV^tXE*{97 zvOXIe$QJ@9oswtGz_D0lKXkUdA+OxG%DXiE!qW3%dLZ{=df>K4eR_{}%(ygCJ*XAI zrp91XuyF}J@^P);(USKij(1e_eX}~6rO2lGnwEy@1@%~kc@2-~`DpGvdfT% z^~N;N`?A!vZu4iL-m}-q4;9?K#FNpS>6`O|d~qtGVUjW|u_;RM3%!rwb>>K!$U=C~T2#BFQPx>y z!Q*axhqvn7+_d+fjvhOPqe4k;phJsWnuAL%-JP0i>+3XWX;@I*9MlKFx&?MkeM_CJ z_N?oxYnyG{dN)VIo%ZC8h@I$8W2Un-N!it%iSBsXPDhiSv3NKgjo5ST$&v9^G%hG< zMOVkt=`@a#(U?^ePRdDpReP)>I^7;W?D#S{mNY*Z4X=nKR>kecXlpdKQVdR+9GPlg zb+z3TZS79R(zn`+6Orh66`x?vkIrx;YKQG)G!;#*45wp>IPB}&DDz6XdRUG#M6n>6 zilx%SJ)7zAY?d4=AH?;Ja92tn)v6M9cS)Hm##?pWoy($0JJF^j7u)f0XVh+$^2(JL z+mlmM-LP3#QF2RmZ7d#3wM#kE?NK`!ZjIU`xoW%>mV8pSlrEa;iYCL!VP%*tzM1i{ zUc5|AwVTq3t}Zbbi`&Z*tHm{r`W2qC&G8&huk-@cldAs3;dpqt6tPum2=zQg+Jlrz zMP@-F7GG|sV^Zc^w(7*9Xj@vlf!ejK2kuAu`86|C+J22?-Ckuatf`r6Pia{uEveg{ zQ!%5W@{;MZyVc?JzrU=qqH^X`7h9Ix3}dFWFjg$AYq4Y`=m(SMS1O&ZwPBBTi8j56l4u+55spWT$sri6Bh*9URkS)@8@I~ivO*5FJ0T?moO20Qr zOsi|t>a1m5f~`3(ySR2em?T`9J6De@-Sba?OHyO9xpt9z-WI+MCnYtVEMK|vcb9&) ztZ(c(IPa4%4wP93j}7h@pw%@T*Ey)Q2-1m8x1O#Nq7msT9A(DUeDndEQ$f zm0HIa5UZmJ)}dp@lG!4@h4{HX{B<8bU2(K1H%-yo1+twWaj4SAm3q5G^V{{Y(T6qf z*WBn=D1N;ED}DHmi6&FAp~e*1&J$j)ZStnkhhHsYQ6YWUM}NJKzS~E?&WGRc!@uOi zAM@eQ`0(vMe5Vh8(}(XDjyRk6s_|I@`;Lzu6GEYQzR!o_S0jb=$gdE;+=tf)ho3)_ zEs~lmWP6>Deu)pi*@s7b_zEAs#)tR#@Oy>B{|7&;+;`_P+5M8{TQyhnnDECm-=(>l zzl3kp{CAqGc}w`9@Ivu?*@y4+;c=gO-{Ye{=)>Rf;UzK!7V>kP5C5PKS8FD{WU6Sj zV)3?6TdcL+O3O+*)FEq5D;4bwceN*yQTMR3I~`peikU^FEMVm#tf6IvDF>m}L_A`- zqLi%gEPT08R+(~LNEUk*Eq|@ zsJ-@ZJRa?kJi^Iz2$GZ)R}0)wqAeu4lod;b+{~g8DU-YSM>ct%fHr|udgV+j(H{7O(I>4w&a=_sB(?1)hKT65jsRNV*{z3T|`(~{UJ5z{%LiUlM|A>5sv_E$M zN&-JyK8D{7CEQe*#KKuNGaRX&D42q+19_Vde%x}5zSAdXu{W9JpkVSgI&*ENTI zoA_JA&yjuO|3TuY3uFKHn#2A@#7~lO7YX*cUe41T`itdb>|8>6Oa+F|AmI#XkL>c%zwObR@dfKjB*dTnIqcEn9MX`F{!hd&6P+n9)|*J! zAP#eJAn7#Ck?#!o82v|x^SE>|+2Qs!lk~I5&Ro*l#IZg_!p4@5$+y;rHxTFX3hP!R zYE=qFy|V7BBV#T%zPOmJ(sJC^xS?{66bt35{Lb@@Cvwrh^f)x;B|XMehhv;FT9M;z{v57Kj* zW5aRyIqBK{uZXk#^I%jG%8T8v;y}_RntScfBt6@oOPuYmCC>WK5NG{P;ynMpr8)fJ z@$EOHXZweVv;B#BLNVoiQI%HKoSMVFJcQ2Gob7iKhy6Qnp``W1 z+0QQ$XFEHI!_GQw=MTi$j(PA68QZDRkI=zkr&O;?7HjTpZ(-82{pG~j{$}E^f10*G zK=yh3-$r`2|0;2|{~-*%l8pZ!*7ncW-0S}|(&N6&^p`ord0wa`j$NZ~BF=u^K%D*j zXX32?265Jpg-8<0#rpRXXMH_!#M!jl>oxbb+hwH3t|?bLakjsiIFB2Hn!`Siw=a?& zyT<+w;%xsgarke>+jlkh`akv*5lKRPc)Tqq&iS56ob#PY9Qm5@_G-<&?I%cj9&ZA?xCz^ZfWjpD)|Ne?N=ldpc&bJCT!;(-g9v>Qr^L@us z&Asja7Sh{d%fxxP504XP`zy&lx2rXz=W_KB=W-1aM?7nFJYORF+)iF2J=@<&obA6$ zoXa~F4>4}M$W9gUO44)v&LhtLRFfUP zUt36eZf{M*Ic_%)=eT{FIM@3#ntR*TbELPaTtD{V+ljON*U3J&tG7wd{{MzJ`#&8w zw~|o5XjkUG<4VoF{d7L**}g-Z?Y9wUeFt&YKSdn=+@#yN`bni6d;NKy^lbk}#M%C- z6U2xll$Xa(n>gFKfH>Q^hxp%!Ez@rCH+UrYSuG#KpCUcm-$?|Zb&v*5tpCxuoxt5Tg%XJfRF4rT(;m@G<=W(*n_8HxiQ$#?N~-_x6_uNNj;%xt4$^PYJ z=Xuhz|34zm{-1*bNr)%U%NG%6JJX4?oi)T+-$R`BKOv6xhTp>=y-A$y>?6*0#$ynX zgv(*ajN216NBnu-IfwLY|3czye+6;aKUw?PP4>B8e3JBhe|;x$485kEe3tBRJw8Bs z>>B--iSzvObssxVkei2^>{*LCTU-qYt^xUs+B+mJMj5z1}J>oph{D?UB$L*SX`}@yHZ;P)cKD&MR zUgB*3Alc`3GDLbV*L%ddT=Q`=DapjsjPr{$_r|k{^gOOECH-u%XUY}!(YF)lalVu6 zRFRz&={f$NBF_HYL3ZYloqr%bw}%IabDSR~JKSy`BfU-bpY-7yh_n5Evd{JS8tJ(n zcM|7%JXinT&(z}--7hZI+*^+`NRK6wsjn+Z&;HCOJ1wQ&Z($6D( z3+c}zek17};%z?q6{N2v{VE^*Z9e+DeDr-j`ulzKUm^WG^5=2VPbU5p>8~UHJ< zKkuXeG3ghO{#76SFG-Ji&D8I1(oZKo%@^S@<93*vcvff_~>6GJ?Hxh>3N;=3({XE`I+|c7U|*795f6` z2T0HBmUl^ysoU5&34@d*T+ZY01mf?Pb4Gs_alC>sd@^yKM=FV*Px{%Kqn$4zeii94 zt{VG`iSzi@NOl&J{uUp7JL%_g=QzJXb~tW(NYCTL0n+n2=N-~>oc~0e z<6L2j(~=N344Eblb8R`01kU5bd>hmqKY6`TYb&huJbwP2=7>N0xs>$h$~lv7h&ab5 zraA0ze7Z=_(5^z8ow#M%E1#M%Eh zh_juyiL;%tXiSn2H?}iFbHthboJ)GPUqzhl-$I=2XNa?%yNR=%ZxUxa+lix{#K*{& zq+e?8Z72Uhdh}nj9{w-l?9UP6?9WHh*(8mT56_PmYVPe96{Lqr)2?O_$FAYmkR9&7 zwrG%$FFqzggJih*Kig6l=eYU**lG_q|I519!_EJ)p7L<>zpNb|ZvK~LRitk1Oox}r zHl1|0?Pf0-?Fd)Mzmd{bh5UsmY*j2vrL2l%!aZnBbau-B`K^k0A|0)e|6pID{$`?& zm&dy+yf_zw*do<-n#T}&XA=AmGcE^;@yZ{v>H&X+T0KPQr%<@$PN*!OB1 zh2f`p9yhIaeZ4K`IC=g5xSWJd@AY@->ksh7vhTeft*}u2k85==d`w@D`o~Yz%=H-4 zkP77uzWPFZTh@L0cZXQ(Vjl8d51Zb)7i5)Rif>u7cusobH$gNWiMs9y?SEPw<-few F|2GccOBetE diff --git a/configs.txt b/configs.txt index 77bc4f9..7143af9 100644 --- a/configs.txt +++ b/configs.txt @@ -1,7 +1,7 @@ 1 -300, 4 +600, 10 3 4 -1 -5, 10 +3 +1, 2 36 diff --git a/exec b/exec index a69f8dd1c678c4261b862c3eca0ef9927eaf75ce..b47d04c53386bf2418a1a3f79139c0ec526313aa 100755 GIT binary patch delta 17516 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 delta 16890 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 TEAM: A, CAR: 1, SPEED: 120, CONSUMPTION: 0.10, RELIABILITY: 89 -23:49:24 NEW CAR LOADED => TEAM: B, CAR: 1, SPEED: 90, CONSUMPTION: 2.00, RELIABILITY: 80 -23:49:24 NEW CAR LOADED => TEAM: C, CAR: 1, SPEED: 200, CONSUMPTION: 0.10, RELIABILITY: 70 -23:49:24 NEW CAR LOADED => TEAM: A, CAR: 2, SPEED: 122, CONSUMPTION: 0.30, RELIABILITY: 99 -23:49:24 NEW CAR LOADED => TEAM: B, CAR: 2, SPEED: 95, CONSUMPTION: 0.70, RELIABILITY: 80 -23:49:24 NEW CAR LOADED => TEAM: C, CAR: 2, SPEED: 300, CONSUMPTION: 1.00, RELIABILITY: 90 -23:49:24 NEW CAR LOADED => TEAM: A, CAR: 3, SPEED: 100, CONSUMPTION: 2.10, RELIABILITY: 60 -23:49:24 NEW CAR LOADED => TEAM: B, CAR: 3, SPEED: 90, CONSUMPTION: 3.20, RELIABILITY: 80 -23:49:24 NEW CAR LOADED => TEAM: C, CAR: 3, SPEED: 200, CONSUMPTION: 1.00, RELIABILITY: 70 -23:49:24 NEW CAR LOADED => TEAM: A, CAR: 4, SPEED: 80, CONSUMPTION: 2.10, RELIABILITY: 80 -23:49:24 NEW CAR LOADED => TEAM: B, CAR: 4, SPEED: 190, CONSUMPTION: 3.20, RELIABILITY: 90 -23:49:25 NEW CAR LOADED => TEAM: C, CAR: 4, SPEED: 100, CONSUMPTION: 1.00, RELIABILITY: 50 -23:49:29 NEW PROBLEM IN CAR 4 -23:49:29 SIGNAL SIGINT RECEIVED +18:52:47 SIMULATOR STARTING +18:52:49 CANNOT START, NOT ENOUGH TEAMS +18:52:53 NEW CAR LOADED => TEAM: A, CAR: 1, SPEED: 120, CONSUMPTION: 0.10, RELIABILITY: 89 +18:52:53 NEW CAR LOADED => TEAM: B, CAR: 1, SPEED: 90, CONSUMPTION: 2.00, RELIABILITY: 80 +18:52:53 NEW CAR LOADED => TEAM: C, CAR: 1, SPEED: 200, CONSUMPTION: 0.10, RELIABILITY: 70 +18:52:53 NEW CAR LOADED => TEAM: A, CAR: 2, SPEED: 122, CONSUMPTION: 0.30, RELIABILITY: 99 +18:52:53 NEW CAR LOADED => TEAM: B, CAR: 2, SPEED: 95, CONSUMPTION: 0.70, RELIABILITY: 80 +18:52:53 NEW CAR LOADED => TEAM: C, CAR: 2, SPEED: 300, CONSUMPTION: 1.00, RELIABILITY: 90 +18:52:53 NEW CAR LOADED => TEAM: A, CAR: 3, SPEED: 100, CONSUMPTION: 2.10, RELIABILITY: 60 +18:52:53 NEW CAR LOADED => TEAM: B, CAR: 3, SPEED: 90, CONSUMPTION: 3.20, RELIABILITY: 80 +18:52:53 NEW CAR LOADED => TEAM: C, CAR: 3, SPEED: 200, CONSUMPTION: 1.00, RELIABILITY: 70 +18:52:53 NEW CAR LOADED => TEAM: A, CAR: 4, SPEED: 80, CONSUMPTION: 2.10, RELIABILITY: 80 +18:52:53 NEW CAR LOADED => TEAM: B, CAR: 4, SPEED: 190, CONSUMPTION: 3.20, RELIABILITY: 90 +18:52:54 NEW CAR LOADED => TEAM: C, CAR: 4, SPEED: 100, CONSUMPTION: 1.00, RELIABILITY: 50 +18:52:59 NEW PROBLEM IN CAR 1 +18:52:59 NEW PROBLEM IN CAR 2 +18:52:59 NEW PROBLEM IN CAR 4 +18:53:02 NEW PROBLEM IN CAR 3 +18:53:05 NEW PROBLEM IN CAR 1 +18:53:05 NEW PROBLEM IN CAR 4 +18:53:05 NEW PROBLEM IN CAR 3 +18:53:08 NEW PROBLEM IN CAR 4 +18:53:14 NEW PROBLEM IN CAR 4 +18:53:14 NEW PROBLEM IN CAR 1 +18:53:14 NEW PROBLEM IN CAR 2 From edf523110827dc255a30fb99336a88d46f0a12b1 Mon Sep 17 00:00:00 2001 From: Edgar Duarte Date: Thu, 13 May 2021 22:21:22 +0100 Subject: [PATCH 2/4] everything is almost done --- BreakDownManager.c | 21 +++---- BreakDownManager.o | Bin 6880 -> 6136 bytes MultipleProcessActions.c | 6 +- MultipleProcessActions.o | Bin 9352 -> 9432 bytes RaceManager.c | 34 +++-------- RaceManager.o | Bin 10480 -> 10136 bytes RaceSimulator.c | 18 +++--- RaceSimulator.h | 2 +- RaceSimulator.o | Bin 12568 -> 10824 bytes TeamManager.c | 125 ++++++++++++++++++++++----------------- TeamManager.o | Bin 25600 -> 27776 bytes exec | Bin 51408 -> 51408 bytes logs.txt | 61 +++++++++++-------- 13 files changed, 136 insertions(+), 131 deletions(-) diff --git a/BreakDownManager.c b/BreakDownManager.c index 1b1baa7..7d5450b 100644 --- a/BreakDownManager.c +++ b/BreakDownManager.c @@ -22,7 +22,6 @@ struct semaphoreStruct *semaphore_list; int start_breakdown = 0; void endBreakDown(int signum){ - printf("ef uoioe fo uie uioiououieuio euiofuiowefue fiowuioefwo u\n"); msgctl(msgid->msg_queue_id,IPC_RMID,NULL); start_breakdown =0 ; #ifdef DEBUG @@ -38,6 +37,8 @@ void raceStartBreakdown(int signum){ void createBreakdowns(struct ids *idsP, sigset_t mask, sigset_t new_mask){ + char log[MAX]; + sigprocmask(SIG_BLOCK,&new_mask, NULL); sem_wait(semaphore_list->writingMutex); @@ -53,15 +54,10 @@ void createBreakdowns(struct ids *idsP, sigset_t mask, sigset_t new_mask){ if(r >= team_list[i].cars[j].reliability && team_list[i].cars[j].has_breakdown != 1 && strcmp(team_list[i].cars[j].current_state,"TERMINADO") != 0 && strcmp(team_list[i].cars[j].current_state,"DESISTENCIA") != 0){ - char problem_string[200]=""; - char car_number[3]=""; + sprintf(log, "NEW PROBLEM IN CAR %02d",team_list[i].cars[j].car_number); + //printf("%s\n",log); + writeLog(log,semaphore_list->logMutex,inf_fich->fp); - strcpy(problem_string,"NEW PROBLEM IN CAR "); - sprintf(car_number,"%2d",team_list[i].cars[j].car_number); - strcat(problem_string,car_number); - - printf("NEW PROBLEM IN CAR %2d\n",team_list[i].cars[j].car_number); - writeLog(problem_string,semaphore_list->logMutex,inf_fich->fp); struct messageQ msg; msg.mtype=i*inf_fich->number_of_cars+j+1; @@ -112,8 +108,9 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li pause(); + //Gives time to threads to be created + sleep(1); - usleep(500); while(start_breakdown == 1) { sleep(1/inf_fich->time_units_per_second * inf_fich->T_Avaria); @@ -121,8 +118,4 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li } - #ifdef DEBUG - printf("Breakdown Manager is out!\n"); - #endif - exit(0); } diff --git a/BreakDownManager.o b/BreakDownManager.o index da5fad15111b85f4e67ac570a8b036bd3a54b55d..6a8d644cf9af324cfee61ff53909b9bf6e3836f7 100644 GIT binary patch literal 6136 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 diff --git a/MultipleProcessActions.c b/MultipleProcessActions.c index 130aee2..13480a1 100644 --- a/MultipleProcessActions.c +++ b/MultipleProcessActions.c @@ -25,6 +25,8 @@ void writeLog(char * string, sem_t *mutex,FILE *fp){ sem_wait(mutex); + printf("%s",buffer); + fprintf(fp,"%s",buffer); fflush(fp); sem_post(mutex); @@ -51,7 +53,7 @@ int writingNewCarInSharedMem(struct team *team_list, struct car *new_car, struct team_list[i].cars[j] = *new_car; sem_post(semaphore_list->writingMutex); - sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability); + sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %02d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability); writeLog(carLog,semaphore_list->logMutex, inf_fich->fp); return 0; } @@ -70,7 +72,7 @@ int writingNewCarInSharedMem(struct team *team_list, struct car *new_car, struct team_list[i].number_of_cars = 1; sem_post(semaphore_list->writingMutex); - sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability); + sprintf(carLog,"NEW CAR LOADED => TEAM: %s, CAR: %02d, SPEED: %d, CONSUMPTION: %.2f, RELIABILITY: %d",team_name,new_car->car_number, new_car->speed,new_car->consumption,new_car->reliability); writeLog(carLog,semaphore_list->logMutex, inf_fich->fp); return 1; } diff --git a/MultipleProcessActions.o b/MultipleProcessActions.o index d0aa2affe2e2e2db65f709e14e73d227c4d5a9e1..c84a6e1e51c33af82c89d0e341426ae40cfb7fb8 100644 GIT binary patch delta 1487 zcmZ`(Ur19?7{6yTThr-gy0fdB+jXw&51A$zQH}^a$!-^gf9}3FGz#<<8 z+4mqpK?@4XB5W^3AP5?S82x$it@ac>MG+B{*!S(8qhAX@IOp8^`+dLj{m!3zuO}Ci zH`>IpsVy$ikh}VJX?Zy@_9~IvZ(uy9uCPtyyp8l^#CCL^-n-I8V#97DHVg~Cm}6%r zeD`$~+UhPlYSRK!duzPc90xs>&cQ;V-s2EynDIXq$D!z#a9$pwcR45~!3s!oVnbpz+KejL(W~hipK$40vq#tYT4C(#|RTjkEARFfGg_#XE3Z zhpkqlpQ_FMFnQmWBapgN3X(Z2C}5_K2n*dn5u!XFTiS&NkJkE znp0xa+I}aYHqL9^Qn+?Y9K{33Hc4}VsoaR_*?z+mvZW%3Qmp`E!%%FJnO1@^XyDpz zhI1#68E&FR*UHl-Vi3*qzbL%i`A-{%3qhY5sw_$W^N@giP?~*=<^InRn;c>+_dm*T z?&l7}`MErVj*#q_s$O-%&&5!;N3UX|I$amcplVvNw06EHU&~Y>rTPKmA(^VES*_*6 zN4=9(3fHx^DwUVz^L@C)aQZCuJU5}gS(^758)WQD$TrK&JH|FMw%Us?7}|sW68#FN zmDXX?wSu$&44r>ldETV(^88L4&#VZlNr|y<4MC!;z;=~?c#ZrMW%)-{e)^w${A~3K zERcu5N#z&7cKf)^-f1C)x?uZmNEN_t3R;8i7 znlZH|UDNCb6P33hACcL2Y_(3N98|{S(!uaah11GD%n&BUHCTv9YmQaX?zQh*5K(EZ zFjg|w3#q6qtRpK7ns{xL;k=V+hKI36dreVW7({dZyu#g`zjknV7Bwx8I#72HeNe^z z(~RZ)j}n_Y%vj$4DTecYF2ZO`itBJ8CbKuxWguUE3M&fNJ$IR=n&(|4i#bUa}WME*tJ2!3JCFgygmyZiAKO2uXU6}sf~UE2tGOuz|b^(*w$#g4-? zvicSBs;@+Kl*8~OF2yV?#ovhY@Gvpd^qvkBnumber_of_teams){ - printf("CANNOT START, NOT ENOUGH TEAMS\n"); - writeLog("CANNOT START, NOT ENOUGH TEAMS",semaphore_list->logMutex,inf_fich->fp); + writeLog("CANNOT START, NOT ENOUGH TEAMS",semaphore_list->logMutex,inf_fich->fp); } else{ //Notificar os TeamManagers do inicio da corrida @@ -200,10 +198,8 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, } } else if(start == 1){ - strcpy(wrong_command_string,received); - strcat(wrong_command_string," => Rejected, race already started!"); - printf("%s\n",wrong_command_string); - writeLog(wrong_command_string,semaphore_list->logMutex,inf_fich->fp); + sprintf(log,"%s => Rejected, race already started!",received); + writeLog(log,semaphore_list->logMutex,inf_fich->fp); } } //is START RACE! else{ // Check if it is ADDCAR @@ -218,16 +214,13 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, newCar->consumption > inf_fich->fuel_capacity || newCar->reliability < 0 ){ - strcat(wrong_command_string,"WRONG COMMAND => "); - strcat(wrong_command_string,received); - printf("%s\n",wrong_command_string); - writeLog(wrong_command_string,semaphore_list->logMutex,inf_fich->fp); + sprintf(log,"WRONG COMMAND => %s",received); + writeLog(log,semaphore_list->logMutex,inf_fich->fp); } else{ if(start == 1){ //Race already started - printf("%s => ",received); - printf("Rejected, race already started!\n"); - writeLog("Rejected, race already started!",semaphore_list->logMutex,inf_fich->fp); + sprintf(log,"%s => Rejected, race already started!",received); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); } else{ //ADD CAR @@ -292,16 +285,5 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, } //select } //while - //the father process waits for all his children to die :( - while ((wpid = wait(&status)) > 0); - -for(int i=0;inumber_of_teams+1;i++){ - close(pipes[i]); -} - free(pipes); - #ifdef DEBUG - printf("Race Manager is out!\n"); - #endif - exit(0); } diff --git a/RaceManager.o b/RaceManager.o index 331aa8864faaca9a9ba2897c461668d88fbfef4f..300ec1da39721916e5f3da85e185aab7a9725768 100644 GIT binary patch delta 3060 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 DEl=~X diff --git a/RaceSimulator.c b/RaceSimulator.c index f7c097d..6c8107b 100644 --- a/RaceSimulator.c +++ b/RaceSimulator.c @@ -53,6 +53,7 @@ int race_started =0 ; //Only for debug purposes will be deleted/changed later +/* void leituraParaTeste(){ for(int i = 0; i< inf_fich->number_of_teams; i++){ @@ -64,7 +65,7 @@ void leituraParaTeste(){ break; } printf("Amount cars: %d\n Box State %s\n", team_list[i].number_of_cars, team_list[i].box_state ); - /*printf("Team name:%s\n Box state:%s\n Car number: %d\n Car speed: %d\n Car consumption: %.2f\n Car reliability: %d\n Number laps: %d\n Amount Breakdown %d\n Amount reffil:%d\n Car state:%s", team_list[i].team_name + printf("Team name:%s\n Box state:%s\n Car number: %d\n Car speed: %d\n Car consumption: %.2f\n Car reliability: %d\n Number laps: %d\n Amount Breakdown %d\n Amount reffil:%d\n Car state:%s", team_list[i].team_name , team_list[i].box_state , team_list[i].cars[j].car_number , team_list[i].cars[j].speed @@ -73,7 +74,7 @@ void leituraParaTeste(){ , team_list[i].cars[j].number_of_laps , team_list[i].cars[j].amount_breakdown , team_list[i].cars[j].times_refill - , team_list[i].cars[j].current_state);*/ + , team_list[i].cars[j].current_state); printf("Team name: %s\nBox state: %s\nCar number: %d\nCar speed: %d\nCar consumption: %.2f\nCar reliability: %d\nNumber of laps: %d\n", team_list[i].team_name , team_list[i].box_state @@ -88,13 +89,13 @@ void leituraParaTeste(){ printf("-----------\n"); } -} +}*/ //cleans active memory void clean(){ free(inf_fich); shmdt(team_list); - msgctl(idsP->msg_queue_id,IPC_RMID,NULL); + msgctl(idsP->msg_queue_id,IPC_RMID,NULL); shmctl(shmid, IPC_RMID, NULL); sem_close(semaphore_list->logMutex); sem_close(semaphore_list->writingMutex); @@ -116,9 +117,8 @@ void endRaceSim(int signum){ while ((wpid = wait(&status)) > 0); - leituraParaTeste(); + //leituraParaTeste(); if (race_started == 1) { - printf("oiioioio\n"); readStatistics(inf_fich, team_list, semaphore_list); } @@ -129,8 +129,8 @@ void endRaceSim(int signum){ void sigint(int signum){ - printf("SIGNAL SIGINT RECEIVED\n"); - writeLog("SIGNAL SIGINT RECEIVED", semaphore_list->logMutex, inf_fich->fp); + printf("\n"); + writeLog("SIMULATOR CLOSING", semaphore_list->logMutex, inf_fich->fp); signal(SIGINT, SIG_IGN); kill(pids[0],SIGUSR2); @@ -213,7 +213,7 @@ int main(int argc, char* argv[]){ for(int i = 0; i <= inf_fich->number_of_teams ; i++){ team_list[i].cars = (struct car*)(team_list + inf_fich->number_of_teams +1 + i * (inf_fich->number_of_cars)); } - printf("SIMULATOR STARTING\n"); + writeLog("SIMULATOR STARTING", semaphore_list->logMutex, inf_fich->fp); idsP = (struct ids*) malloc(sizeof(struct ids)); diff --git a/RaceSimulator.h b/RaceSimulator.h index 90eb377..876b685 100644 --- a/RaceSimulator.h +++ b/RaceSimulator.h @@ -3,7 +3,7 @@ #define SIZE 50 #define DEBUG #define PIPE_NAME "pipe" -#define MAX 200 +#define MAX 550 #include #include diff --git a/RaceSimulator.o b/RaceSimulator.o index 85b90e0b99d6d9ba6dc9b9ac6ddbd5aaeada7db6..eb9dddf61494a687874d39fa4ebea1b9cc20d63e 100644 GIT binary patch literal 10824 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 literal 12568 zcmbtae~=tioqwBMA*>0z5f3AXbdW&8Wyd5Suz`@>Y$oZoHk)O419~Bjy)!+#&CV}- zddNl+qpr&_4$I~KxT;v9QgsDKl_(S{YLH|ua&E9Z#2@G7>MV?n|_`@GNlzVG|?>+g1FU%YSgf~F>+OOv=o)N2|Q;y_3Jx=UVmi3`PI z@k-k}|GeEUzi3aMY@dnGa?7udFA&16EavMEYcGJ(n z)v0RRC!QtlO#HO$H~zZ)?20{BiJz`XF0h+evVJ;R>1tuwzSozUw%6K~_n3`5Rq0CE z~eTlY3tk`%ctvr*MGD*{0Ge^s-&~2kxy_NzcFhoK~s} z9A=)JVa@xr8CqK6Az{f2B$%T#=X7 zRPE`hS1zMg@pT^YV3mFkRq1N}4qtAb8#`~XSI@$~uUq@1 zT(kwjx>{_WB}{RQ!*$~W(~(p5^jkaa^1#@nWWaPgCD3;N-Dk+L z^BrWLZ8JH%kZcb_RL@gJ(IIwR-8bc)mP${{MI~@(t;rKj8Wh-&Sb%RCV_ia+HdgoLv%JjBRy4 zAd1&=6IDPxjOV&x_Z!iSc!9P)+R_fb%6kAu8SG8R>0y3Q&>l3WK~CY`sUJ{Oe)MVn zZ4Ex(_N1)eJH=gibCsK>ex}sTwWt40HW7n~#XIeR%>H^!Ws&kz_peaDcu=%ovf8}vhF%7EQB(p$P~bO9N)^7 zvLmjqK+uj5{lHBv6QVbFmy_{Q zYR+tBt;4d`?M2se$YfV`bVf3+bvOHvX~CFlkpt4+Xvue2v}mQhjJsF#_%79RqgHXu z@!gb_b+dVYHyONjdtdkPwn1xXxO=pE=u3=H<();%0wWpSm4JT$y#^$n|6uUu&@TW@u&sgKTfrYv?^ zO!PRpT%Ll1EpsKd&Jz7Kf@(;`#I}N)W7Dy-G)qh5i68~6G`rdNc&2m3m=Y7qcYL6A z=kja9Ns+{kIg{OKt>_$jIk5Dj|tj^fAvDF=GZYas> znvbkq9b0|f$`B6C5-oIYr-L6?poyqYF+wWP>v-rH`^P7nx+isSvLj0D`x_!Zm+$@$7bcbr+kL`5Lx)Z8xAGR&H zOZMgV1FC)Joc7^byS)FYjmN2ty-hYt>=@%z{=^g4w%L<<+OiFQXv*ZP--Vk6Hqdo* z!@u+yZ!Fg=y&e&fIx=0D)3AhUO|&{kIF+M0q-;5ws3+=Ow{MKr~ml*J+2HY~>?>6Aq8}NC_Pl8gL z`0()i6Pvg9_YC)L>rW(N*InCrt?+W`MA}P^iGWhrM8+!yqUdIw!dTvS!z!mtqBxfI zQbHy!3C?;F>69o?i|{GSN>G~137^QgUO@TUfa5#EZZU90VoTq)jop2TZJRd_#fKBa z-5dMj2~qI9T#y!&KPD-O<8x6YGp>^pY2S5utW+Q*{O(Zk9WlO<}UlrvLwrAWcgC$mm*oIAOcmG4%#lS=Vb*2!e@NogEsXwsA(nZItPv{mAT zJo|PmOSvYW963dk2KK5~ijs}h}$^YelW^LY!^`llGA!rMIm<*e~P zGDsz=zmD$HM)*ezIPWKo_-|%mDpCEd20U-TKMgp~i*r#f4=Fr4uP*_9G4b?#Uo_2{^fwb z41D&_3(EdK0^b7uDwXH)=?cI%0DckRafNd{zXkAH0q1dlMhBPMKnL%aoxn%Gr2xnH z9|s)oqq{)=T{NEd&qo30TvFqo1pG?CA5=Kci|s#22bYI{kM=(be6;7QfaAQL0UY(8 z1^ugNJZKYNj3l1z+VCQsR*B%WI1i%pU1{g;pSy@X#J}JM|(OH9*u`i zz|jv~faCgZ0UZ4~sBpFi*Z2LvUkP?5fsc0X0zSv>Z1|Wx^L5~_0-f&z-U0Ye0gnOx zd%)if_yy`udbS_&%MAD$1O8sX(Vkls&i-Ex;3=ppo9DW6TnBEqkyB%_d#b3*z@BE{|L2l`6=*m z+?Rll+DV;Ojx>dKyEo*EZm@J^JsN9TEI-<%f|7 z{*1y$LH`EO&j5ZS;6CVJ9x`FTCjrO#-V6Gjp#QH1{sF*oT|Ngm#>vBgl``;JgZ&du92EG^J>-qAxYcA~n4Rq*v?FK&neYekm ze-dzBuRD}I{{s5xhfe{Het0mVbGOoY2>9rSM}gl3_J0}p-GKi$;2Qz|g#kYScn|QG zau8Et^LW1ZDLb!FIQw%G9onBa0UiguFQW5+(zy-z_#W&I;N!aZz~2n|7F}~;StTv& zUGle%>+ew?jNtlv&YlRazr#Eb!S(kOo&V}__4kt>NBH{tiHH?=4#pul~y%7y| zQy*4x#}a9uKF%vk&h2DTcYai<^tmS1rLOK)>!KUfV@+4(dsdE>t{M_vJgz=89p#rC zR9J@lsfuel_capacity; float distance_in_lap = 0; @@ -179,7 +202,11 @@ void racing(int arrayNumber){ team_list[team_index].cars[arrayNumber].has_breakdown = 1; strcpy(team_list[team_index].cars[arrayNumber].current_state, "SEGURANCA"); + sprintf(log,"CAR %02d IS NOW IN STATE: SEGURANCA",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); + sem_wait(update_waiting); + if(strcmp(team_list[team_index].box_state, "LIVRE") == 0){ is_reserved = 1; #ifdef DEBUG @@ -212,7 +239,9 @@ void racing(int arrayNumber){ if(current_fuel <= 0){ strcpy(team_list[team_index].cars[arrayNumber].current_state,"DESISTENCIA"); - printf("Desisti\n"); + + sprintf(log,"CAR %02d IS NOW IN STATE: DESISTENCIA",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); gaveUp(); @@ -226,6 +255,9 @@ void racing(int arrayNumber){ if(strcmp(team_list[team_index].cars[arrayNumber].current_state,"SEGURANCA") != 0){ strcpy(team_list[team_index].cars[arrayNumber].current_state, "SEGURANCA"); + sprintf(log,"CAR %02d IS NOW IN STATE: SEGURANCA",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); + } sem_wait(update_waiting); @@ -307,6 +339,10 @@ void racing(int arrayNumber){ strcpy(team_list[team_index].cars[arrayNumber].current_state, "TERMINADO"); + + sprintf(log,"CAR %02d IS NOW IN STATE: TERMINADO",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); + strcpy(data.message, "TERMINADO"); write(channel[1], &data, sizeof(struct message)); #ifdef DEBUG @@ -318,11 +354,12 @@ void racing(int arrayNumber){ distance_in_lap = distance_in_lap - inf_fich->lap_distance; - printf("antes de esperar\n"); + sem_wait(update_waiting); - printf("i am not waiting anymore\n"); - if((strcmp(team_list[team_index].cars[arrayNumber].current_state, "SEGURANCA") == 0) && ((strcmp(team_list[team_index].box_state, "RESERVADO") == 0) || (strcmp(team_list[team_index].box_state, "LIVRE") == 0))){ + + + if((strcmp(team_list[team_index].cars[arrayNumber].current_state, "SEGURANCA") == 0) && (strcmp(team_list[team_index].box_state, "RESERVADO") == 0)){ car_index = arrayNumber; @@ -336,13 +373,14 @@ void racing(int arrayNumber){ strcpy(team_list[team_index].cars[arrayNumber].current_state, "BOX"); - printf("I am here"); + sprintf(log,"CAR %02d IS NOW IN STATE: BOX",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); + //Waits for the everything to get sorted in the car - sem_wait(wait_box); - printf("I passed here\n"); - current_fuel = team_list[team_index].cars[car_index].consumption; + current_fuel = inf_fich->fuel_capacity; + sem_wait(wait_box); //if the race has terminated while he was in the box if(terminating == 1){ @@ -382,6 +420,9 @@ void racing(int arrayNumber){ //TO-DO Add a semaphore here strcpy(team_list[team_index].cars[arrayNumber].current_state, "CORRIDA"); + sprintf(log,"CAR %02d IS NOW IN STATE: CORRIDA",team_list[team_index].cars[arrayNumber].car_number); + writeLog(log, semaphore_list->logMutex, inf_fich->fp); + } @@ -400,6 +441,8 @@ void racing(int arrayNumber){ #ifdef DEBUG printf("(%s) Stopped in box.\n", team_list[team_index].team_name); #endif + + current_fuel = inf_fich->fuel_capacity; sem_wait(wait_box); if(terminating == 1){ @@ -467,15 +510,10 @@ void *carThread(void* team_number){ #ifdef DEBUG //printf("I %ld created car %d.\n",(long)getpid(),number); #endif - //printf("i am waiting\n"); - //Have a condition variable racing(number); - pthread_exit(NULL); - - } //Signals the race manager that the race has started @@ -493,22 +531,21 @@ void interruptRaceTeam(){ //Team manager. Will create the car threads void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, struct semaphoreStruct *semaphore_listP, int channelP[2],int team_indexP, struct ids *idsP){ - - //Ignore all unwanted signals! sigfillset(&mask); sigprocmask(SIG_SETMASK, &mask, NULL); - sigemptyset(&new_mask); sigaddset(&new_mask, SIGUSR1); sigaddset(&new_mask, SIGUSR2); sigaddset(&new_mask, SIGTERM); + sigaddset(&new_mask, SIGALRM); sigprocmask(SIG_UNBLOCK,&new_mask, NULL); signal(SIGUSR2, teamEnd); signal(SIGUSR1, interruptRaceTeam); signal(SIGTERM, raceStart); + signal(SIGALRM, everyoneGaveUp); sem_unlink("BOX_MUTEX"); @@ -618,25 +655,5 @@ void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, sigprocmask(SIG_UNBLOCK,&new_mask, &mask); } - - /* - //Waits for all the cars to die - for(int j=0; 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 CKgsj} literal 25600 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 cgKQ^l#Sy<rxi^T77PB_VZ~OKC3yJjcZ~y=R diff --git a/exec b/exec index b47d04c53386bf2418a1a3f79139c0ec526313aa..b23f9b5b367382805cb08c34419400cda71de8be 100755 GIT binary patch literal 51408 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 G?f(Jjl`2pG literal 51408 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 TEAM: A, CAR: 1, SPEED: 120, CONSUMPTION: 0.10, RELIABILITY: 89 -18:52:53 NEW CAR LOADED => TEAM: B, CAR: 1, SPEED: 90, CONSUMPTION: 2.00, RELIABILITY: 80 -18:52:53 NEW CAR LOADED => TEAM: C, CAR: 1, SPEED: 200, CONSUMPTION: 0.10, RELIABILITY: 70 -18:52:53 NEW CAR LOADED => TEAM: A, CAR: 2, SPEED: 122, CONSUMPTION: 0.30, RELIABILITY: 99 -18:52:53 NEW CAR LOADED => TEAM: B, CAR: 2, SPEED: 95, CONSUMPTION: 0.70, RELIABILITY: 80 -18:52:53 NEW CAR LOADED => TEAM: C, CAR: 2, SPEED: 300, CONSUMPTION: 1.00, RELIABILITY: 90 -18:52:53 NEW CAR LOADED => TEAM: A, CAR: 3, SPEED: 100, CONSUMPTION: 2.10, RELIABILITY: 60 -18:52:53 NEW CAR LOADED => TEAM: B, CAR: 3, SPEED: 90, CONSUMPTION: 3.20, RELIABILITY: 80 -18:52:53 NEW CAR LOADED => TEAM: C, CAR: 3, SPEED: 200, CONSUMPTION: 1.00, RELIABILITY: 70 -18:52:53 NEW CAR LOADED => TEAM: A, CAR: 4, SPEED: 80, CONSUMPTION: 2.10, RELIABILITY: 80 -18:52:53 NEW CAR LOADED => TEAM: B, CAR: 4, SPEED: 190, CONSUMPTION: 3.20, RELIABILITY: 90 -18:52:54 NEW CAR LOADED => TEAM: C, CAR: 4, SPEED: 100, CONSUMPTION: 1.00, RELIABILITY: 50 -18:52:59 NEW PROBLEM IN CAR 1 -18:52:59 NEW PROBLEM IN CAR 2 -18:52:59 NEW PROBLEM IN CAR 4 -18:53:02 NEW PROBLEM IN CAR 3 -18:53:05 NEW PROBLEM IN CAR 1 -18:53:05 NEW PROBLEM IN CAR 4 -18:53:05 NEW PROBLEM IN CAR 3 -18:53:08 NEW PROBLEM IN CAR 4 -18:53:14 NEW PROBLEM IN CAR 4 -18:53:14 NEW PROBLEM IN CAR 1 -18:53:14 NEW PROBLEM IN CAR 2 +22:16:18 SIMULATOR STARTING +22:16:21 NEW CAR LOADED => TEAM: A, CAR: 01, SPEED: 120, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: B, CAR: 01, SPEED: 90, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: C, CAR: 01, SPEED: 200, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: A, CAR: 02, SPEED: 122, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: B, CAR: 02, SPEED: 95, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: C, CAR: 02, SPEED: 300, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: A, CAR: 03, SPEED: 100, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: B, CAR: 03, SPEED: 90, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: C, CAR: 03, SPEED: 200, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: A, CAR: 04, SPEED: 80, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:21 NEW CAR LOADED => TEAM: B, CAR: 04, SPEED: 300, CONSUMPTION: 0.01, RELIABILITY: 100 +22:16:21 NEW CAR LOADED => TEAM: C, CAR: 04, SPEED: 100, CONSUMPTION: 20.00, RELIABILITY: 10 +22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 04 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 04 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA +22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA +22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 04 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 04 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA +22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA +22:16:43 CAR 04 IS NOW IN STATE: TERMINADO From 86b460a83b6519c427790d8bfaad8e53c039abb4 Mon Sep 17 00:00:00 2001 From: Edgar Duarte Date: Thu, 13 May 2021 22:27:47 +0100 Subject: [PATCH 3/4] sadsadsad --- TeamManager.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TeamManager.c b/TeamManager.c index 4f4df86..18430af 100644 --- a/TeamManager.c +++ b/TeamManager.c @@ -75,7 +75,9 @@ void cleanT(){ } - +/*This function is for when the team manager prepares to die. It waits for all the cars to +end their lap and, when they all do, the team manager cleans all of the resources it uses +and exits. This function can be called by SIGINT or when a car in the team ends the race.*/ void teamEnd(int signum){ //This code exists in case a SIGINT is called after a SIGUSR1 @@ -87,6 +89,7 @@ void teamEnd(int signum){ } terminating = 1; + interrupting = 0; pthread_cond_broadcast(&interruption_cond); From ea8140a93b13040f8cda32a81a10cf23c67a833c Mon Sep 17 00:00:00 2001 From: Edgar Duarte Date: Fri, 14 May 2021 01:20:41 +0100 Subject: [PATCH 4/4] IT WORKSSSS. CLIP IT AND SHIP IT --- BreakDownManager.c | 8 ++- BreakDownManager.o | Bin 6136 -> 6376 bytes RaceManager.c | 113 +++++++++++++++++++++-------- RaceManager.o | Bin 10136 -> 12704 bytes RaceSimulator.c | 2 +- TeamManager.c | 78 +++++++++++++++++--- TeamManager.o | Bin 27776 -> 29864 bytes exec | Bin 51408 -> 55720 bytes logs.txt | 84 ++++++++++++---------- test | Bin 17528 -> 17376 bytes test.c | 172 +++++++++------------------------------------ 11 files changed, 242 insertions(+), 215 deletions(-) diff --git a/BreakDownManager.c b/BreakDownManager.c index 7d5450b..a98cd34 100644 --- a/BreakDownManager.c +++ b/BreakDownManager.c @@ -31,6 +31,10 @@ void endBreakDown(int signum){ } +void waitSig(int signum){ + pause(); +} + void raceStartBreakdown(int signum){ start_breakdown = 1; } @@ -38,7 +42,7 @@ void raceStartBreakdown(int signum){ void createBreakdowns(struct ids *idsP, sigset_t mask, sigset_t new_mask){ char log[MAX]; - + sigprocmask(SIG_BLOCK,&new_mask, NULL); sem_wait(semaphore_list->writingMutex); @@ -90,11 +94,13 @@ void BreakDownManager(struct config_fich_struct *inf_fichP, struct team *team_li sigemptyset(&new_mask); sigaddset(&new_mask, SIGUSR2); sigaddset(&new_mask, SIGTERM); + sigaddset(&new_mask, SIGUSR1); sigprocmask(SIG_UNBLOCK,&new_mask, NULL); signal(SIGUSR2,endBreakDown); signal(SIGTERM,raceStartBreakdown); + signal(SIGUSR1, waitSig); #ifdef DEBUG printf("Breakdown Manager created(%ld)\n",(long)getpid()); diff --git a/BreakDownManager.o b/BreakDownManager.o index 6a8d644cf9af324cfee61ff53909b9bf6e3836f7..592447e7c3cf4f14380423794c1e95eb1a7b2394 100644 GIT binary patch delta 1490 zcmZ`(O-NKx6rMZ&jBn=6zcbf|nqwxJi|j3G`dJM97>W`MwJ4#*5aGCqq@*c`G$~9n zoDM~TA%d%dP=`Py3@MBjfwu8y6Yi#P(JX=z!Opq!9-NH_&UfEE-#Ono@4lJ)w%zOwUL+sILhest$L%hDn@R~{3Fq)4kT z@Ys3QTYf=zRp7P;{W7e$>O=+#uDa@1l!MmmM6h#9(oW2Vfy&xkTg95tlo0YmFr!KH z89s#^!jZz2tg5&;CUK?sU2DHoQhb<&UU!T5LbcC5RpJ{xi0=y56>cirQ20w>LE$!` z;SojIL}^h@O^S~-ko8E>pzyH5lM2r%>>z}g-tWDW>bZTfr`vHe)pzSUOy~=6&HLKu zvW6tl2>Q-$(Qd$`SBe~@d{WGV>66A1%QRT#GGu+yTxD!EW4BqH&fL~N0*k2pNa3o& zdMIF*Lv;RVG*2zMoqrta{SwlCy|E0V_2^{7dt{GMw#dVPUmAZ{&OWTM6?b3;b6hYP zkYU zMB?H%BqIsLtilzZ*ry(0nXv?l*#T=|h<64G}8Z85cjJt>El0~a1g)Vta Q8`X>3B#cQCUy%p@11_?$82|tP delta 1410 zcmZ`&O=uHQ5Z>1`F^QYa=C8AhS`+_Tf4~%^!9xip6pi&@4@JE-ErQTmTBFi~SbI?P zpft{vCec#M{`QCe*)wW;z zCtGh>!AiD&=E2QI?Dij+o%HvKMoq?SJ&+cd4O-#^7K2-1j7S+r8zgiY=GBHmB;YH| zjt75>jHODNhVmKLgx2q_U;3Pv`xwW^sLE%8pRR}_9F zwEw!=t;(KjL~;fS9YjiDTH!v0?Fu^-76@@tzl_b1dH+c1eEAfPtQcV5aov(| zlgvMBPTa$q0mVnG3amQEc-p@=wZM3r@hkY<0AXWK6vVK?1%+Xph=LubW0gT3Hp%qV zGB^{3or7+b9)6h_nG|I{h4WFsXHi`&Vax>kJ*#b&y`JJH>@=ZRXNnP4^}9DlKDIDk zcX=8MGrj|-O=v5zD*5Y@NioROn&sN_a05q85VvX8US_jgc@^7YAb#MI3F8s>&i}um zZH%Wg@$?56zn$?zE>F84pC@HfTwwj&=M{(FqpoF#Z1jGh$_Dr+^AIaB7_YJFE;jXM z9sV2Rx!O;cC%aLmv&Q;c7$2ZL$$#PJc&ubP@5(vvNim)uO~&QDqZv|Cnzonq^P@S4 zA_?LUjwZnFWwZQa8o=oUh||~;2m373*)6rble|PacrBr$p45A*>vRki%(9{NJVhR@_7rL8pR(%+sC%^ShHIG E0njRkKmY&$ diff --git a/RaceManager.c b/RaceManager.c index 03a39c4..60de312 100644 --- a/RaceManager.c +++ b/RaceManager.c @@ -29,17 +29,52 @@ struct ids *ids_proc; int *pids; int *pipes; -void my_handler(int signum) -{ - - if (signum == SIGUSR1) - { - #ifdef DEBUG - printf("Received SIGUSR1! => Interromper corrida\n"); - #endif +int number_of_teams_stopped; +int number_added_this_iteration; +int race_has_paused; +int start = 0; + +void skip(int signum){ + + number_of_teams_stopped++; + + //means all the teams have finished + if(race_has_paused == 0 && number_of_teams_stopped == inf_fich->number_of_teams){ + writeLog("EVERY SINGLE CAR GAVE UP", semaphore_list->logMutex, inf_fich->fp); + kill(getppid(), SIGINT); } } +void pauseRace(int signum){ + + signal(SIGUSR1, SIG_IGN); + + if(start == 1){ + + race_has_paused =1; + writeLog("SIMULATOR PAUSING", semaphore_list->logMutex, inf_fich->fp); + + for(int i = 0; i < inf_fich->number_of_teams; i++){ + kill(pids[i], SIGUSR1); + } + + kill(ids_proc->pid_breakdown, SIGUSR1); + + start = 0; + + number_added_this_iteration = 0; + + writeLog("WAITING FOR ALL CARS TO PAUSE", semaphore_list->logMutex, inf_fich->fp); + while(number_of_teams_stopped != inf_fich->number_of_teams){ + pause(); + number_added_this_iteration++; + } + + writeLog("ALL CARS PAUSED", semaphore_list->logMutex, inf_fich->fp); + printf("IF YOU WANT TO RESTART RACE TYPE: START RACE!\n"); + } + +} void endRaceManager(int signum){ @@ -62,15 +97,11 @@ void endRaceManager(int signum){ void endRace(){ - printf("!!!!!!!!!!!!!!!!!!!!!!beakdown pid : %d\n", ids_proc->pid_breakdown); kill(ids_proc->pid_breakdown, SIGUSR2); kill(getppid(), SIGUSR2); endRaceManager(0); } -void interruptRace(int signum){ - printf("TO DO\n"); -} int getFreeChannel(int n, int pipes[n]){ for(int i=0;i 0 ) { //NAO FAÇO -1 PQ O "PIPES" TEM NUMBER_OF_TEAMS + 1 (NAMED) if(FD_ISSET(pipes[0], &read_set)){ - + sigprocmask(SIG_BLOCK,&new_mask, NULL); read(pipes[0],received,sizeof(received)); #ifdef DEBUG printf("[RaceManager] (NP) Received: %s\n",received); @@ -174,27 +207,46 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, //char received[512] ="ADDCAR TEAM: C, CAR: 21, SPEED: 30, CONSUMPTION: 0.04, RELIABILITY: 95"; //char received[512] ="START RACE!"; if(strcmp(received,"START RACE!")==0){ + printf("here!\n"); //verificar se o numero de equipas é suficiente => erro no ecra e nos logs if(start == 0){ - int n_equipas=0; - for(int i=0; inumber_of_teams; i++){ - if(strcmp(team_list[i].team_name,"")!=0){ - n_equipas++; - } - } - if(n_equipas!=inf_fich->number_of_teams){ - writeLog("CANNOT START, NOT ENOUGH TEAMS",semaphore_list->logMutex,inf_fich->fp); + + if(firstStart == 0){ + int n_equipas=0; + for(int i=0; inumber_of_teams; i++){ + if(strcmp(team_list[i].team_name,"")!=0){ + n_equipas++; + } + } + if(n_equipas!=inf_fich->number_of_teams){ + writeLog("CANNOT START, NOT ENOUGH TEAMS",semaphore_list->logMutex,inf_fich->fp); + } + else{ + //Notificar os TeamManagers do inicio da corrida + for(int i = 0; inumber_of_teams; i++){ + kill(pids[i], SIGTERM); + + } + kill(getppid(), SIGTERM); + kill(idsP->pid_breakdown, SIGTERM); + start = 1; + firstStart = 1; + + } } else{ - //Notificar os TeamManagers do inicio da corrida + //Notificar os TeamManagers do inicio da corrida for(int i = 0; inumber_of_teams; i++){ - kill(pids[i], SIGTERM); + kill(pids[i], SIGTERM); } - kill(getppid(), SIGTERM); kill(idsP->pid_breakdown, SIGTERM); + writeLog("RACE UNPAUSED",semaphore_list->logMutex,inf_fich->fp); start = 1; + race_has_paused =0; + number_of_teams_stopped -= number_added_this_iteration; + signal(SIGUSR1, pauseRace); } } else if(start == 1){ @@ -259,11 +311,13 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, } } } //ISNt START RACE! + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); }//isset //else{ for(int channel=1;channel<(inf_fich->number_of_teams+1);channel++){ if(FD_ISSET(pipes[channel], &read_set)){ + sigprocmask(SIG_BLOCK,&new_mask, NULL); struct message data; @@ -274,9 +328,12 @@ void Race_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, printf("MENSAGEM RECEBIDA %s\n",data.message); if(strcmp(data.message,"TERMINADO") == 0){ - + signal(SIGUSR1, SIG_IGN); + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); endRace(); + } + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); } } //} diff --git a/RaceManager.o b/RaceManager.o index 300ec1da39721916e5f3da85e185aab7a9725768..c0003f65929e4005ca051aafe99bb688392c9740 100644 GIT binary patch literal 12704 zcmb_heQ;dWb-ydwSaF0U2u=u4@=Pq(0(r3=2*`YCEv@|&q?IDAY)Im)*Sk;F#?orD z`xe_EXgtfNye#W54VpNeCZQjHcoHTW?%>9yQHiK~ ze)rwGd-Sv~VWzn=`|iEJ`@83!bMCnx@9iIjdp6Yt0z#*NxLs6h8Wq9_R?8i-*ddmQ zi^ch-tKSh)z+{BM{bso=E08*=^52DJM%cQ-^ z9PLp(1oPw1K8Q5#(}gaa3C}`7X7=nnvm2?gV)pDjvu7)2n~I@*xa z66i*STf%22jz4{YQVmhkJ6hr=eI?q93gOuR6Zq3oc(y7ov^BIPG!%*sn)}WkY#?Qv zL*}n9Tri!dI%GC^v&_nCDNCBAMJ=nLu@ioI-IO%FvNE2ADH1YEMX*hGxtZnS6SC$m z6;*u}Y+6%`+?Y!kPqB z4gMK{kSItZk9!F`@QUu$(P$=)nT59lrZag!3OLs7{8LBITVFSwpPTK+?Mo?e1aZy6!z*W-sLz?x z#N2oC0+r3yipX5fTbXrNi7Y-)))eX5>ZQExiM$DpWMXkeXYnC=&J>gMgfeIDtq2BGo!ycs_uo;RYBG;Z&t62! zD{<5;J^zxFsr)kO?eMMXx335sE1bBa_1Lq}#+f!>KWRG0%n!|&&U=vHJSrs=2|!S{A|o%p-1I}y^uwv* zl)a=N1q2F`I&V54ZsI9D6?BG6rroNL-+C`O{nbU#Eu%GR(_$t8=^2%G1}s$Ntb*(? zPYKW`j>uU(%$RCprz-~ot9O~1B3y*{JN`yu3c6>JSt?6jd2&0VTSao=Y{QmbXS&;& zt*KGr@0y+B!z8|N2+zg&ZAxNE6sPv|>q^I>;?x5hRqcFJv)M4*^v+b%_0zl8R6%GX z9ariw&Np5AGMblFBs3PM_C|hxK6-{CsWJii-=pB|Bv>gu(}69!TDxps?eclGt5}T= zEyH}Svu|LayDLN+&*f%Gz8;t*8C^OI%4IoGrKd1$m>{*}oZ=&LLhz*6`Uj}Mb{^f` z6;>K(EF7UT{HXJWj25T(D0Rcu_&=0Y7O^~u^z=+hihfBrLKiaPI(3!ien?Qw<*S-q zx%H)bdMmoAVuM@}s!NZ1rz;)8F-w~+Aai=H=ZVeYK^c%u`_Vt;jw`IyAG3j4CPS?)9Efh71Il(Dm$NDJMVBQN#jeCH^BXB z7Rs51k~FN_IaljOtZ0R)2A?xY&Lx^Fn~GG8=3~9*Rnlul#j|V|@>p7-6kO-)Fu>^o zzc=mA)46^6W-7udBD^I$aJMno9ogIyHabHC#^%tLurbsx2D^KQdP32@0i!=Ogm$qt z)E%YV*hE;Urw8moBibk1!=i$K9`2ID>CwH(xVvx2*cysN!5s(>MneNpV<6NSHlla; zhc_5iV1*cnC#>Fh+S+Mlja1GU&)Y$X8DsHuT!P6BMoV(31Y^XMU?OY9Z7XT4ZW&Fs z;tiQnU&czO(mRcGe2iK$sf=X|k7o^HCJ7b*B(F1`PLJEhIMEldHW(sO?Jg-?hV1`& zr7{%RW~`3%w;BUh!b;s^LDSq)!Oa`7vepXOO>~ALk-n&Fe4Bw{IMO$?*)*czQ176S z{uzo?ec6&TZo8dCf5}RasclAbcZ%}_jE_^219He=%cyr?Cb3fMY=F{OHORI zY#UBZjF8u?QR&gNwcD_*_?Y@WZ`YF+2W7uD?| zhTC>4a7vw6T)Mq}LjVMv8(%;pr2}~Ab}B;d9$=Ji!9%xYrD)kM`%u%JyuEH?W$dSc zQzC~{``2xf?FKHKmZ{2Cv8oe#dj z2fxDy4=Y@INax#p@V!2`BXQjubLXb7Q+6qvFB!vxJxV`$-*IV`=l6W@Cw=heeDEp4 zF|Hm@t_{Lo@!|iY5B`P^{ubeo|04t{CB070P`Q>}=X~&Yeem}Phx|U;D3Ij(q`Z#C z1O7FI%XLZkB?|wk!sU7-e1*bSs-+>l#7Yw79u;5Yi<9X@!E4}O;qzQYGk`QT|E z92dD-c1`%;`+V?+d~oc^wd6nMgX7Ji79TgMTKJ1TxW0Pe91kW$Dm@$p7EVxr)6hoaIq^jIx1vu+(kq#wKE-8fXL+SoUqbKc1sb%S<4c;<0)HMd+=~u zA#M}3bh>9ds{M3H%5}Pzt9dsrIW&z-Lk-j5Ig7lL+6ixr#dEt*w#G8{UWJp{D2>HO zN6B5dMv07-&5mcurK5D65xB&V-Py!gM&vTtRN5XEu~;fMo@j56<#LI5dRSUbSC5Fb zyEC5cP7jX6vsSX#8gp-QbS>K@qL?amC!{mLO<1mogE@RgrF4Z4ZZP~(#=nl?xLRsC zH!z&b$2ow6aXJ4p5_NGL)mqM0hU4y{aeb%2KL1gM#}yy=#~41waGZ5o&VGi&c8%kF zK!Tnhp`XV85+Ehu@B@94lj#QlDS7RB#)T!$?K;YE*d^bUDgUv;y>`9H`1l~N_4#kc z=XUA8488g^)A~jNj!$%2&eaOXxLnRk#)luYz1Y8zAP2Fe@pgvu`R!sj_rqry4nO=M z{gAdO-0O#J48M|iTK@!-1AR0;>VxMP&h^ATjRd=R-2O4cIsZ=>&h7dx!(mq#LMi=~ z!o7BV-^17O{RHFVzO3zfjq!Or{0HOnd7Nc@uKyAkN(mX4)1+|dc{Tm?xYscJ6AWL& zDK3!uZ_YF^2PfU@yZtzrgT6VB?Ocdkg%~ z!tgIE9Nl2ocj$+7ALFm0y4K%ee6Ifi#z*XH{$DeEHN&SE-pcUf48NA)r+n}^AAC6s zrG$)+dzHdr@5kw<^<2gHeE(d-_}rg2`S5RN{L7ep(}y2ne5_Nw|7>M^K3@sO$9&;F zk2J>ke7^2ud>+pZ!#_;@wI9C8aJ~w)Ykfe@^i` z7=I1pe}>@(!#~U9aDQ%RI83}!?T;3d!}b3j<8wK0`rs?oE4zWEBp-1)2W) zeE8q>!T*)X;p_L8KK%C?|9Up=GWB6V&+o0uKbI>Udah#pRUW=Rr-O{Ymho@%@bR97 zw2|?-|4qi{_py5!&e!9U4CnFxk`Mld4}Oy2d|ki8aKw+T^#3n~!$169+NeI!z@K~_ zU8`{L`FV6R<8%E@#^>i+l;K=X$_F23^7*}PlHpv>Cw=5hGd|bz-+cI|eE8=X&iyPm zFY=9!!*3`*FUDY$yng<$!olZuEoV5tw||1+{Jz)1aDJb>p5dJTX@>Lju|wg|lb?@w zGCq&z6vGi$`o4G%le3O+y-(iH_$X@pA%=5*ew)eR@%cEz`FZpkCI|Yws{G%8#YPEs zt*4(J_lpXL|It{kru_RcYU1+!~8jHl%F&nFcQHTZlP zAX5UaRFw4&`K;o$s&Dt;`uq5V2iM=V|ICBy@7m9MaQ$8TEf220Yl~oR@0cCmLAjlE z^ATOjTBGrxZSAo|Fd4VwBDf=$6T$4bTS<(Mjag}GqyJg0ApJMDhCXp7cB%T#bUsKQ z4(WrSy_fnxk~I<=&eH#`N|XOzW>9x*>FOF=5!Rtfx2Sp14Ql(>Re^6Xn9Gg|;uh{g zkWe~^!kkf6JN?ifYlWweE4#1bAeFWLI^W1JPVG|tIfki;FeA=BG`MD?Hj9sLo7wdP-}aXTJV{W1Tz;_2~mM@6bNHt_8@tSPO==0^#8 nKK2D~f5`OCJwf6jHNY{C!#q{_?Xp(?gGztBuRtb}xBveEj$wy1 literal 10136 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 Vg@4M$>+imiS7*8v<=^)D{{hGfkWK&q diff --git a/RaceSimulator.c b/RaceSimulator.c index 6c8107b..598aa67 100644 --- a/RaceSimulator.c +++ b/RaceSimulator.c @@ -111,6 +111,7 @@ void clean(){ } + void endRaceSim(int signum){ pid_t wpid; int status = 0; @@ -177,7 +178,6 @@ int main(int argc, char* argv[]){ signal(SIGTERM, raceStartRaceSim); - semaphore_list = (struct semaphoreStruct*) malloc(sizeof(struct semaphoreStruct)); sem_unlink("MUTEX"); semaphore_list->logMutex = sem_open("MUTEX", O_CREAT|O_EXCL,0700,1); diff --git a/TeamManager.c b/TeamManager.c index 18430af..94bae04 100644 --- a/TeamManager.c +++ b/TeamManager.c @@ -34,6 +34,7 @@ sem_t *reservation; sem_t *update_waiting; sem_t *counter_mutex; sem_t *wait_box; +sem_t *interrupt_race_mutex; int team_index; @@ -49,6 +50,7 @@ int interrupting = 0; int all_exited = 1; int amount_terminated = 0; int out = 0; +int firstStart = 0; sigset_t mask, new_mask; struct ids *idsT; @@ -57,12 +59,12 @@ struct ids *idsT; void cleanT(){ - sem_close(car_in_box); sem_close(reservation); sem_close(update_waiting); sem_close(counter_mutex); sem_close(wait_box); + sem_close(interrupt_race_mutex); pthread_cond_destroy(&interruption_cond); pthread_mutex_destroy(&mutex_interruption); pthread_mutex_destroy(&mutex_stop); @@ -72,14 +74,44 @@ void cleanT(){ sem_unlink("UPDATE_MUTEX"); sem_unlink("END COUNTER"); sem_unlink("WAIT BOX"); + sem_unlink("INTERRUPT MUTEX"); } + + +void pauseRaceTeams(int signum){ + + interrupting = 1; + + + sigprocmask(SIG_BLOCK,&new_mask, NULL); + + + //Makes sure it waits for all of the cars + sem_wait(interrupt_race_mutex); + + + //Sends a signal to the race manager that this team has stopped all cars! + kill(getppid(), SIGALRM); + + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); + + printf("waiting for signal\n"); + //waits for a signal + pause(); + + interrupting = 0; + printf("unpaused\n"); + pthread_cond_broadcast(&interruption_cond); +} + /*This function is for when the team manager prepares to die. It waits for all the cars to end their lap and, when they all do, the team manager cleans all of the resources it uses and exits. This function can be called by SIGINT or when a car in the team ends the race.*/ void teamEnd(int signum){ + sigprocmask(SIG_BLOCK,&new_mask, NULL); //This code exists in case a SIGINT is called after a SIGUSR1 if(start_teams == 0){ for(int i =0 ; i < team_list[team_index].number_of_cars; i++){ @@ -125,8 +157,7 @@ void everyoneGaveUp(){ for(int i =0 ; i < team_list[team_index].number_of_cars; i++){ pthread_cancel(cars[i]); } - - cleanT(); + kill(getppid(), SIGALRM); exit(0); @@ -175,7 +206,7 @@ void anouncingEnd(){ //Cars are racing void racing(int arrayNumber){ - sigprocmask(SIG_BLOCK,&new_mask, &mask); + sigprocmask(SIG_BLOCK,&new_mask, NULL); char log[MAX]; //Variables char update[MAX]; @@ -301,13 +332,14 @@ void racing(int arrayNumber){ sem_wait(counter_mutex); amount_terminated++; sem_post(counter_mutex); - + printf("Stopped %s\n", team_list[team_index].team_name); #ifdef DEBUG printf("(%d) Interrupted.\n", team_list[team_index].cars[arrayNumber].car_number); #endif //all of the cars are now on stand by if(amount_terminated == team_list[team_index].number_of_cars){ start_teams = 0; + sem_post(interrupt_race_mutex); } pthread_mutex_lock(&mutex_interruption); @@ -395,12 +427,22 @@ void racing(int arrayNumber){ sem_wait(counter_mutex); amount_terminated++; + + printf("Stopped %s\n", team_list[team_index].team_name); + if(amount_terminated == team_list[team_index].number_of_cars){ + + start_teams = 0; + sem_post(interrupt_race_mutex); + } + sem_post(counter_mutex); #ifdef DEBUG printf("(%d) Interrupted.\n", team_list[team_index].cars[arrayNumber].car_number); #endif pthread_mutex_lock(&mutex_interruption); + + while (interrupting == 1) { pthread_cond_wait(&interruption_cond, &mutex_interruption); @@ -454,8 +496,14 @@ void racing(int arrayNumber){ } else if( interrupting == 1){ + printf("Stopped %s\n", team_list[team_index].team_name); sem_wait(counter_mutex); amount_terminated++; + if(amount_terminated == team_list[team_index].number_of_cars){ + start_teams = 0; + sem_post(interrupt_race_mutex); + } + sem_post(counter_mutex); #ifdef DEBUG printf("(%d) Interrupted.\n", team_list[team_index].cars[arrayNumber].car_number); @@ -521,14 +569,20 @@ void *carThread(void* team_number){ //Signals the race manager that the race has started void raceStart(int signum){ - start_teams = 1; + + if(firstStart == 0 ){ + start_teams = 1; + firstStart = 1; + } + else{ + start_teams = 1; + pthread_cond_broadcast(&interruption_cond); + } + } -void interruptRaceTeam(){ - interrupting = 1; -} //Team manager. Will create the car threads @@ -544,9 +598,10 @@ void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, sigaddset(&new_mask, SIGTERM); sigaddset(&new_mask, SIGALRM); + sigprocmask(SIG_UNBLOCK,&new_mask, NULL); signal(SIGUSR2, teamEnd); - signal(SIGUSR1, interruptRaceTeam); + signal(SIGUSR1, pauseRaceTeams); signal(SIGTERM, raceStart); signal(SIGALRM, everyoneGaveUp); @@ -561,6 +616,8 @@ void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, counter_mutex = sem_open("END COUNTER", O_CREAT|O_EXCL,0700,1); sem_unlink("WAIT BOX"); wait_box = sem_open("WAIT BOX", O_CREAT|O_EXCL,0700,0); + sem_unlink("INTERRUPT MUTEX"); + interrupt_race_mutex = sem_open("INTERRUPT MUTEX", O_CREAT|O_EXCL,0700,0); #ifdef DEBUG printf("Team Manager created (%ld)\n", (long)getpid()); @@ -579,7 +636,6 @@ void Team_Manager(struct config_fich_struct *inf_fichP, struct team *team_listP, pause(); } - sigdelset(&new_mask, SIGTERM); sigprocmask(SIG_BLOCK,&new_mask, NULL); diff --git a/TeamManager.o b/TeamManager.o index 11de6cb52be9209f3be864b60e8cddd1ead0c092..929aac3c9f9bd9c7763e386baf2a1952e624b1b6 100644 GIT binary patch literal 29864 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 literal 27776 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 CKgsj} diff --git a/exec b/exec index b23f9b5b367382805cb08c34419400cda71de8be..6e7405e02be8b8152e032a7411e0f3c1c0743613 100755 GIT binary patch literal 55720 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 literal 51408 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 G?f(Jjl`2pG diff --git a/logs.txt b/logs.txt index 0f24e77..7cb95ab 100644 --- a/logs.txt +++ b/logs.txt @@ -1,36 +1,48 @@ -22:16:18 SIMULATOR STARTING -22:16:21 NEW CAR LOADED => TEAM: A, CAR: 01, SPEED: 120, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: B, CAR: 01, SPEED: 90, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: C, CAR: 01, SPEED: 200, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: A, CAR: 02, SPEED: 122, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: B, CAR: 02, SPEED: 95, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: C, CAR: 02, SPEED: 300, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: A, CAR: 03, SPEED: 100, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: B, CAR: 03, SPEED: 90, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: C, CAR: 03, SPEED: 200, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: A, CAR: 04, SPEED: 80, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:21 NEW CAR LOADED => TEAM: B, CAR: 04, SPEED: 300, CONSUMPTION: 0.01, RELIABILITY: 100 -22:16:21 NEW CAR LOADED => TEAM: C, CAR: 04, SPEED: 100, CONSUMPTION: 20.00, RELIABILITY: 10 -22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 04 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 04 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 01 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 02 IS NOW IN STATE: SEGURANCA -22:16:24 CAR 03 IS NOW IN STATE: SEGURANCA -22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 04 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 03 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 04 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 02 IS NOW IN STATE: DESISTENCIA -22:16:26 CAR 01 IS NOW IN STATE: DESISTENCIA -22:16:43 CAR 04 IS NOW IN STATE: TERMINADO +01:18:35 SIMULATOR STARTING +01:18:39 NEW CAR LOADED => TEAM: A, CAR: 01, SPEED: 120, CONSUMPTION: 0.10, RELIABILITY: 100 +01:18:39 NEW CAR LOADED => TEAM: B, CAR: 01, SPEED: 100, CONSUMPTION: 0.20, RELIABILITY: 50 +01:18:39 NEW CAR LOADED => TEAM: C, CAR: 01, SPEED: 200, CONSUMPTION: 0.30, RELIABILITY: 70 +01:18:39 NEW CAR LOADED => TEAM: A, CAR: 02, SPEED: 122, CONSUMPTION: 1.00, RELIABILITY: 90 +01:18:39 NEW CAR LOADED => TEAM: B, CAR: 02, SPEED: 95, CONSUMPTION: 0.30, RELIABILITY: 10 +01:18:39 NEW CAR LOADED => TEAM: C, CAR: 02, SPEED: 300, CONSUMPTION: 0.10, RELIABILITY: 100 +01:18:39 NEW CAR LOADED => TEAM: A, CAR: 03, SPEED: 100, CONSUMPTION: 2.00, RELIABILITY: 100 +01:18:39 NEW CAR LOADED => TEAM: B, CAR: 03, SPEED: 90, CONSUMPTION: 0.50, RELIABILITY: 80 +01:18:39 NEW CAR LOADED => TEAM: C, CAR: 03, SPEED: 200, CONSUMPTION: 0.10, RELIABILITY: 90 +01:18:39 NEW CAR LOADED => TEAM: A, CAR: 04, SPEED: 100, CONSUMPTION: 0.80, RELIABILITY: 50 +01:18:39 NEW CAR LOADED => TEAM: B, CAR: 04, SPEED: 190, CONSUMPTION: 1.50, RELIABILITY: 70 +01:18:40 NEW CAR LOADED => TEAM: C, CAR: 04, SPEED: 100, CONSUMPTION: 1.20, RELIABILITY: 80 +01:19:12 NEW PROBLEM IN CAR 02 +01:19:12 NEW PROBLEM IN CAR 04 +01:19:12 NEW PROBLEM IN CAR 02 +01:19:12 NEW PROBLEM IN CAR 04 +01:19:12 CAR 02 IS NOW IN STATE: SEGURANCA +01:19:12 CAR 04 IS NOW IN STATE: SEGURANCA +01:19:12 CAR 04 IS NOW IN STATE: SEGURANCA +01:19:12 CAR 02 IS NOW IN STATE: SEGURANCA +01:19:14 CAR 03 IS NOW IN STATE: SEGURANCA +01:19:15 NEW PROBLEM IN CAR 01 +01:19:15 NEW PROBLEM IN CAR 01 +01:19:15 NEW PROBLEM IN CAR 03 +01:19:15 CAR 01 IS NOW IN STATE: SEGURANCA +01:19:15 CAR 01 IS NOW IN STATE: SEGURANCA +01:19:15 CAR 03 IS NOW IN STATE: SEGURANCA +01:19:15 CAR 02 IS NOW IN STATE: BOX +01:19:17 CAR 02 IS NOW IN STATE: CORRIDA +01:19:18 SIMULATOR PAUSING +01:19:18 WAITING FOR ALL CARS TO PAUSE +01:19:31 ALL CARS PAUSED +01:19:40 CAR 04 IS NOW IN STATE: BOX +01:19:40 CAR 02 IS NOW IN STATE: BOX +01:19:40 CAR 04 IS NOW IN STATE: BOX +01:19:40 RACE UNPAUSED +01:19:42 CAR 04 IS NOW IN STATE: CORRIDA +01:19:42 CAR 04 IS NOW IN STATE: CORRIDA +01:19:42 CAR 02 IS NOW IN STATE: CORRIDA +01:19:43 NEW PROBLEM IN CAR 04 +01:19:43 NEW PROBLEM IN CAR 02 +01:19:43 NEW PROBLEM IN CAR 04 +01:19:43 CAR 04 IS NOW IN STATE: SEGURANCA +01:19:43 CAR 04 IS NOW IN STATE: SEGURANCA +01:19:43 CAR 02 IS NOW IN STATE: SEGURANCA +01:19:45 CAR 02 IS NOW IN STATE: TERMINADO +01:19:50 CAR 03 IS NOW IN STATE: DESISTENCIA diff --git a/test b/test index e8009096b82f7137c1110193b94fec1ab7f48553..7b88fc0d431e7b57e81492ce39dc9aa82ef0d5dc 100755 GIT binary patch delta 3229 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 #include #include -#include + #include #include +#include +#include #include #include -#include -#include -#include -#include #include -#include + int i = 0; -sem_t *sem; +sem_t *car_in_box; pthread_mutex_t mutex_cond = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t variavel_cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex_interruption = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t interruption_cond = PTHREAD_COND_INITIALIZER; pthread_t *cars; -/*pthread_mutex_t mutex_cond = PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t variavel_cond = PTHREAD_COND_INITIALIZER; -sem_t *comunicate; -sem_t *reserva;*/ -/* -void carEnd(){ - printf("Car from team %ld killed.\n",(long)getpid()); - pthread_exit(NULL); -} -void teamEnd(int signum){ - for(int j=0; j<3; j++){ +sem_t *semaphore; - pthread_join(cars[j],NULL); - } - printf("Team %ld killed\n",(long)getpid()); - exit(0); -} - -void *carThread(void* team_number){ - signal(SIGINT, carEnd); - sleep(10); - pthread_exit(NULL); - return NULL; - -} -*/ -//void *thread(void *cancro){ - -/* while(1){ +void child2(){ + sem_unlink("BOX_MUTEX"); + car_in_box = sem_open("BOX_MUTEX", O_CREAT|O_EXCL,0700,2); sleep(1); - sem_post(comunicate); - pthread_cond_wait(&variavel_cond, &mutex_cond); - - printf("It worked :O\n"); - } -}*/ -/* -void weee(int signum){ - printf("I received it clear and loud\n"); -}*/ - -void *thread(void *yeet){ - printf("brah"); - pthread_exit(NULL); -} - -void interrupt(int singum){ - printf("wow\n"); -} - -void func(){ - signal(SIGINT,SIG_IGN); - printf("vou dormir zzz\n"); - sleep(5); - sem_post(sem); - printf("bazei"); -} - -void sigint(int signum){ - - i = 0; - while (i < 5){ - printf("yoooooooo\n"); - sleep(1); - i++; - } + sem_wait(car_in_box); + printf("2 - I am out :)"); } -int main(){ -/* signal(SIGINT, teamEnd); - - int workerId[3]; - - pthread_t cars[3]; - - //Create the car threads - for(int i=0; i<3;i++){ - workerId[i] = i+1; - pthread_create(&cars[i], NULL, carThread,&workerId[i]); - }*/ - //Waits for all the cars to die - - - - /*signal(SIGINT, weee); - int workerId = 0; - - pthread_t cars[1]; - - pthread_create(&cars[0], NULL, thread,&workerId); +void child1(){ - pause(); - for(int j=0; j<1; j++){ - pthread_join(cars[j],NULL); - }*/ -/* - sem_unlink("MUTEX"); - comunicate = sem_open("MUTEX", O_CREAT|O_EXCL,0700,0); - sem_unlink("ATUATIA"); - reserva= sem_open("A TUA TIA", O_CREAT|O_EXCL,0700,0); + sem_unlink("BOX_MUTEX"); + car_in_box = sem_open("BOX_MUTEX", O_CREAT|O_EXCL,0700,2); - int workerId = 0; - pthread_t cars[1]; - pthread_create(&cars[0], NULL, thread,&workerId); + sem_wait(car_in_box); + printf("1-waiting for 2 seconds\n"); + sleep(2); - while(1){ + sem_wait(car_in_box); - sem_wait(reserva); - printf("está reservado!"); - sem_wait(comunicate); - printf("yoooo\n"); - sleep(1); - pthread_cond_signal(&variavel_cond); +} - } - */ - sigset_t mask, new_mask; - //Ignore all unwanted signals! - sigfillset(&mask); - sigprocmask(SIG_SETMASK, &mask, NULL); - - //Create the wanted signals - sigemptyset(&new_mask); - sigaddset(&new_mask,SIGINT); - - sigprocmask(SIG_UNBLOCK,&new_mask, NULL); - signal(SIGINT, sigint); - - sigprocmask(SIG_BLOCK,&new_mask, NULL); - printf("tou dormindo blockeado\n"); - sleep(5); - - sigprocmask(SIG_UNBLOCK, &new_mask, NULL); - - printf("tou dormindo nao blockeado\n"); - sleep(5); - - - printf("3etipoji jio \n"); - +int main(){ + if(fork() == 0){ + child1(); + printf("1-I am leaving\n"); + exit(0); + } + if(fork() == 0){ + child2(); + printf("2-I am leaving\n"); + exit(0); + } + + for(int i = 0; i < 2 ; i++){ + wait(NULL); + } }