11#include "cputracker.h"
22#include "analyzer.h"
33#include "reader.h"
4+ #include "printer.h"
45
56int g_nproc = 0 ;
6- struct proc_stat * g_buffer [BUFFER_SIZE ];
7- pthread_mutex_t g_bufferMutex = PTHREAD_MUTEX_INITIALIZER ;
8- sem_t g_filledSpaceSemaphore ;
9- sem_t g_leftSpaceSemaphore ;
7+ struct proc_stat * g_dataBuffer [BUFFER_SIZE ];
8+ pthread_mutex_t g_dataBufferMutex = PTHREAD_MUTEX_INITIALIZER ;
9+ sem_t g_dataFilledSpaceSemaphore ;
10+ sem_t g_dataLeftSpaceSemaphore ;
11+
12+
13+ unsigned long * g_printBuffer [BUFFER_SIZE ];
14+ pthread_mutex_t g_printBufferMutex = PTHREAD_MUTEX_INITIALIZER ;
15+ sem_t g_printFilledSpaceSemaphore ;
16+ sem_t g_printLeftSpaceSemaphore ;
17+
18+ pthread_t readerThreadId ;
19+ pthread_t analyzerThreadId ;
20+ pthread_t printerThreadId ;
1021
1122int get_nproc (int * nproc ) {
1223 * nproc = sysconf (_SC_NPROCESSORS_ONLN );
@@ -22,9 +33,14 @@ int get_semaphore_value(sem_t *sem) {
2233 return sval ;
2334}
2435
25- struct proc_stat * get_item_from_buffer () {
26- int index = get_semaphore_value (& g_filledSpaceSemaphore );
27- return g_buffer [index ];
36+ struct proc_stat * get_item_from_data_buffer () {
37+ int index = get_semaphore_value (& g_dataFilledSpaceSemaphore );
38+ return g_dataBuffer [index ];
39+ }
40+
41+ unsigned long * get_item_from_print_buffer () {
42+ int index = get_semaphore_value (& g_printFilledSpaceSemaphore );
43+ return g_printBuffer [index ];
2844}
2945
3046int main () {
@@ -34,29 +50,41 @@ int main() {
3450 g_nproc ++ ;
3551
3652 for (int i = 0 ; i < BUFFER_SIZE ; i ++ ) {
37- g_buffer [i ] = malloc (g_nproc * sizeof (struct proc_stat ));
38- if (g_buffer [i ] == NULL ) {
53+ g_dataBuffer [i ] = malloc (g_nproc * sizeof (struct proc_stat ));
54+ g_printBuffer [i ] = malloc (g_nproc * sizeof (unsigned long ));
55+ if (g_dataBuffer [i ] == NULL || g_printBuffer [i ] == NULL ) {
3956 exit (EXIT_FAILURE );
4057 }
4158 }
4259
43- if (sem_init (& g_filledSpaceSemaphore , 0 , 0 ) ||
44- sem_init (& g_leftSpaceSemaphore , 0 , BUFFER_SIZE )) {
60+ if (sem_init (& g_dataFilledSpaceSemaphore , 0 , 0 ) ||
61+ sem_init (& g_dataLeftSpaceSemaphore , 0 , BUFFER_SIZE )) {
62+ exit (EXIT_FAILURE );
63+ }
64+
65+ if (sem_init (& g_printFilledSpaceSemaphore , 0 , 0 ) ||
66+ sem_init (& g_printLeftSpaceSemaphore , 0 , BUFFER_SIZE )) {
4567 exit (EXIT_FAILURE );
4668 }
4769
48- pthread_t readerThreadId ;
49- pthread_t analyzerThreadId ;
5070 pthread_create (& readerThreadId , NULL , reader , NULL );
5171 pthread_create (& analyzerThreadId , NULL , analyzer , NULL );
72+ pthread_create (& printerThreadId , NULL , printer , NULL );
73+
5274 pthread_join (readerThreadId , NULL );
5375 pthread_join (analyzerThreadId , NULL );
76+ pthread_join (printerThreadId , NULL );
77+
78+ pthread_mutex_destroy (& g_dataBufferMutex );
79+ sem_destroy (& g_dataFilledSpaceSemaphore );
80+ sem_destroy (& g_dataLeftSpaceSemaphore );
5481
55- pthread_mutex_destroy (& g_bufferMutex );
56- sem_destroy (& g_filledSpaceSemaphore );
57- sem_destroy (& g_leftSpaceSemaphore );
82+ pthread_mutex_destroy (& g_printBufferMutex );
83+ sem_destroy (& g_printFilledSpaceSemaphore );
84+ sem_destroy (& g_printLeftSpaceSemaphore );
5885 for (int i = 0 ; i < BUFFER_SIZE ; i ++ ) {
59- free (g_buffer [i ]);
86+ free (g_dataBuffer [i ]);
87+ free (g_printBuffer [i ]);
6088 }
6189 return 0 ;
6290}
0 commit comments