ο main φάκελος syspro2 περιέχει τα bash scripts αρχεία του 3ου ερωτήματος, αλλά και 2 φακέλους Server και Client που αφορούνε το 1ο και 2ο ερώτημα αντίστοιχα. Compilation: Υπάρχουνε 3 makefiles, ένα που αφορά το compilation του Client, ένα του Server, και ένα που καλεί τα άλλα 2. Τα δύο πρώτα βρίσκοντε στους φακέλους Client και Server αντίστοιχα, ενώ το τελευταίο στον main φάκελο. Με την εντολή make compile_all στον main φάκελο, μεταγλωτίζεται το αρχείο του Client και του Server και είναι έτοιμα για εκτέλεση. Παράγοντε τα αρχεία poller και pollSwayer στον main φάκελο, όπου τα τρέχουμε με τα ορίσματα που ορίζει η εκφώνηση. Οι φακλέλοι server και client περιέχουν τους υποφακέλους Objects και Sources αλλά και τα makefile τους. Πηγαία αρχεία Server: server.cpp: Περιέχει τον κώδικα που καλεί το master_thread. master_thread.cpp: Φτιάχνει τα worker_threads, δημιουργεί το socket του σέρβερ και κάνει εισαγωγή στο buffer τα αναγνωριστικά των sockets των clients (clientsock). worker_thread.cpp Επαναληπτικά, παίρνει αναγνωριστικά από τον buffer, επικοινωνεί με τον client, και διαβάζει τον ψήφο του και τον γράφει στο αρχείο global.cpp Περιέχει συναρτήσεις χρήσιμες που καλούντε σε κάποια σημεία των παραπάνων αρχείων και αρχικοποιεί τις global μεταβλητές του αρχείου. Sigint Signal: Όταν έρθει sigint signal στο process, καλούμε τον signalHandler που υπάρχει στο global αρχείο ο οποίος ορίζει μία global μεταβλητή flag σε true για να ενημερώσει τους workers ότι ήρθε σήμα. Όλα τα threads εκτός του master μπλοκάρουν το σήμα για να τερματίσουν ομαλά, και ο handler αναλαμβάνει αποδέσμευση μνήμης και γράψιμο στο αρχείο των στατιστικών. Δομές: Έχουμε 2 δομές και τις απαραίτητες συναρτήσεις για εισαγωγή στοιχείων σε αυτές, ένα set που περιέχει τα ονόματα που έχουν ψηφίσει, και ένα map από όνομα σε αριθμό ψήφων. Συγχρονισμός: Το insert και get που αφορά το buffer γίνεται από 2 συναστήσεις insert και get στο global αρχείο που καλούντε από τα άλλα αρχεία. Ακολουθάμε τη λογική του προβλήματος παραγωγός και καταναλωτές με παραγωγό το master_thread που βάζει συνδέσεις στο buffer και τους workers σαν παραγωγούς να τις ζητάνε, χρησιμοποιόντας ένα mutex και 2 conditional variables. Υπάρχει επίσης με χρήση mutex συγχρονισμός στην εισαγωγή στις δομές, αλλά και στο γράψιμο στο αρχείο. Πηγαία αρχεία του Client: client.cpp: Κάνει parsing τις γραμμές του inputFile και δημιουργεί τόσα threads όσα και τις γραμμές του αρχείου client_threads.cpp: Ο κώδικας των thread που δημιουργεί ο client.cpp. Κάνουν τη σύνδεση με τον server στο socket του και μετά επικοινωνούν με τον server για την αποστολή των ψήφων Header αρχεία: Και στο φάκελο Client και στον φάκελο Server τα header.h περιέχουν τις απαραίτητες βιβλιοθήκες. Επίσης το αρχείο function_headers.h έχει τους ορισμούς των συναρτήσεων του αντίστοιχου προγράμματος. Τώρα η global.h που υπάρχει στον φάκελο του Server, ορίζει με extern τις global μεταβλητές του προγράμματος. Bash scripts: Τα bash scripts κάνουν την δουλειά της εκφώνησης.