-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhistory.c
executable file
·151 lines (147 loc) · 3.7 KB
/
history.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
* chatterbox Progetto del corso di LSO 2017/2018
*
* Dipartimento di Informatica Università di Pisa
* Docenti: Prencipe, Torquati
*
*/
/**
* @file history.c
* @brief Contiene implementazione funzioni dichiarate in history.h
*
* @author Nicolo` Maio 544935
*
* Si dichiara che il contenuto di questo file e' in ogni sua parte opera
* originale dell'autore
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <history.h>
/**
* @function initHist
* @brief inizializza history
*
* @param dim_hist dimensione della history
* @param mtx variabile di mutex della history
*
* @returns history inizializzata
*/
storia * initHist(int dim_hist,pthread_mutex_t mtx)
{
storia * s;
s = malloc(sizeof(storia));
memset(s,0,sizeof(storia));
s->testa = 0;
s->fine = dim_hist;
s->messaggi =(message_t**) malloc(sizeof(message_t*)*dim_hist);
memset(s->messaggi,0,sizeof(message_t*));
s->msg_in_hist = 0;
for(int i =0;i<dim_hist;i++)
{
s->messaggi[i] = NULL;
}
return s;
}
/**
* @function add
* @brief aggiunge messaggi alla history
*
* @param s history in cui aggiungere msg
* @param msg messaggio da aggiungere
* @param mtx variabile di mutex della history
* @param dim_hist dimensione della history
*/
void add( storia *s,message_t *msg,pthread_mutex_t mtx,int dim_hist)
{
/* -- prendo mutua esclusione su history -- */
pthread_mutex_lock(&mtx);
if(s->testa == 0)
{
int i =s->testa;
int trovato = 0;
while(i<s->fine && trovato == 0)
{
if(s->messaggi[i]==NULL)
{
trovato = 1;
}
else
{
i++;
}
}
if (!trovato)
{
memset((char*)s->messaggi[s->testa],0,sizeof(message_t));
s->messaggi[s->testa] = malloc(sizeof(message_t));
memset((char*)s->messaggi[s->testa],0,sizeof(message_t));
setHeader(&s->messaggi[s->testa]->hdr,msg->hdr.op,msg->hdr.sender);
setData(&s->messaggi[s->testa]->data,msg->data.hdr.receiver,msg->data.buf,msg->data.hdr.len);
s->fine = s->testa;
s->testa= (s->testa +1)%dim_hist;
if(s->msg_in_hist < dim_hist) s->msg_in_hist += 1;
}
else
{
s->messaggi[i] = malloc(sizeof(message_t));
memset((char*)s->messaggi[i],0,sizeof(message_t));
setHeader(&s->messaggi[i]->hdr,msg->hdr.op,msg->hdr.sender);
setData(&s->messaggi[i]->data,msg->data.hdr.receiver,msg->data.buf,msg->data.hdr.len);
if(s->msg_in_hist < dim_hist) s->msg_in_hist += 1;
}
}
else
{
memset((char*)s->messaggi[s->testa],0,sizeof(message_t));
s->messaggi[s->testa] = malloc(sizeof(message_t));
memset((char*)s->messaggi[s->testa],0,sizeof(message_t));
setHeader(&s->messaggi[s->testa]->hdr,msg->hdr.op,msg->hdr.sender);
setData(&s->messaggi[s->testa]->data,msg->data.hdr.receiver,msg->data.buf,msg->data.hdr.len);
s->fine = s->testa;
s->testa= (s->testa +1)%dim_hist;
if(s->msg_in_hist < dim_hist) s->msg_in_hist += 1;
}
pthread_mutex_unlock(&mtx);
}
/**
* @function readConta
* @brief conta il numero di messaggi presenti in history
*
* @param s history in cui conta i messaggi presenti
* @param mtx variabile di mutex della history
*
* @returns numero dei messaggi presenti in history
*/
int readConta(storia *s,pthread_mutex_t mtx)
{
int val;
/* -- prendo mutua esclusione su history -- */
pthread_mutex_lock(&mtx);
val = s->msg_in_hist;
pthread_mutex_unlock(&mtx);
return val;
}
/**
* @function destroyhist
* @brief distrugge la history
*
* @param s history da distruggere
* @param dim_hist dimensione della history da distruggere
*/
void destroyhist(storia *s,int dim_hist)
{
if(s!=NULL)
{
for(int i =0;i<dim_hist;i++)
{
if(s->messaggi[i]!=NULL && s->messaggi[i]->data.buf!=NULL)
{
free(s->messaggi[i]->data.buf);
free(s->messaggi[i]);
}
}
}
if(s->messaggi != NULL)free(s->messaggi);
free(s);
}