-
Notifications
You must be signed in to change notification settings - Fork 0
/
threads.c
63 lines (47 loc) · 2.06 KB
/
threads.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
#include "threads.h"
#include "memory.h"
void *query_address_routine(void *_context) {
MemoryContext *context = (MemoryContext *)_context;
int *nb_hits = malloc(sizeof(int)); // Nombre de fois que la fonction
// in_main_memory renvoie un CACHE_HIT
*nb_hits = 0;
for (int i = 0; i < context->config.nb_access; i++) {
// Génère une adresse aléatoire comprise entre 0 et le nombre de page
// dans la mémoire secondaire
int rand_address = random_address((context->config.nb_page_secondary) * context->config.page_size);
int in_memory =
page_in_main_memory(context->queue, context->memory_hash, get_page(rand_address, context->config.page_size));
if (in_memory) {
// Si cette mémoire se trouve dans la mémoire principale on augmente
// notre compteur
(*nb_hits)++;
}
// On fait une demande d'adresse physique à notre Queue
reference_address(context->queue, context->memory_hash, rand_address, context->config.page_size);
}
return nb_hits;
}
pthread_t *create_tid_array(int length) {
pthread_t *tid_array = (pthread_t *)malloc(sizeof(pthread_t) * length);
return tid_array;
}
void start_all_threads(pthread_t *tid_array, MemoryContext *context) {
for (int i = 0; i < context->config.nb_threads; i++) {
pthread_create(&tid_array[i], NULL, query_address_routine, context);
}
}
int *join_all_threads(pthread_t *tid_array, MemoryContext *context) {
void *return_val;
int *stats = (int *)malloc(sizeof(int) * context->config.nb_threads);
for (int i = 0; i < context->config.nb_threads; i++) {
pthread_join(tid_array[i], &return_val);
// Déréférence la valeur de retour pour la sauvegarder dans notre
// tableau
stats[i] = *((int *)return_val);
// Puis libère le pointeur qui était alloué dynamiquement dans
// request_address
free(return_val);
}
return stats;
}
void free_tid_array(pthread_t *tids) { free(tids); }