Skip to content

Commit e902218

Browse files
committed
leader: block: changes in block structs, add allocation struct, many changes and new functions, still segfault malloc
1 parent 4f83561 commit e902218

4 files changed

Lines changed: 162 additions & 25 deletions

File tree

include/block.h

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,46 @@ struct block {
2020
char free;
2121
};
2222

23-
struct blocks {
23+
struct block_register {
2424
size_t nb_blocks;
2525
struct block **blks;
2626
};
2727

28-
struct blocks *init_nodes_same_size(unsigned short nb_nodes, size_t size);
28+
struct allocation_register {
29+
size_t size_alloc;
30+
size_t count_alloc;
31+
struct allocation **allocs;
32+
};
33+
34+
struct allocation {
35+
size_t number_parts;
36+
size_t v_address_start;
37+
struct block **parts;
38+
};
39+
40+
struct allocation_register *generate_allocs(size_t size_alloc);
41+
42+
void add_allocation(struct allocation_register *a_r, struct allocation *a);
2943

30-
struct blocks *generate_blocks(size_t nb_blks);
44+
struct block_register *init_nodes_same_size(unsigned short nb_nodes, size_t size);
45+
46+
struct block_register *generate_blocks(size_t nb_blks);
3147

3248
struct block *generate_block(unsigned short id, size_t size, size_t node_address, size_t virtual_address, char free);
3349

3450
void
3551
add_block(struct block *blk, unsigned short id, size_t size, size_t node_address, size_t virtual_address, char free);
3652

37-
void merge_free_block(struct blocks *blks);
53+
void merge_free_block(struct block_register *blks);
54+
55+
struct block_register *init_nodes_same_size(unsigned short nb_nodes, size_t size);
3856

39-
struct blocks *init_nodes_same_size(unsigned short nb_nodes, size_t size);
57+
/**
58+
* Splited half 2 is free = 0
59+
* @param b
60+
* @param size
61+
* @return
62+
*/
63+
struct block *split_block_u(struct block *b, size_t size);
4064

4165
#endif /* !DISTRIBUTEDMALLOC_BLOCK_H */

include/leader.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
#include "block.h"
1010

1111
struct leader_resources {
12-
struct blocks *leader_blks;
12+
struct block_register *leader_blks;
13+
struct allocation_register *leader_reg;
1314
struct command_queue *leader_command_queue;
15+
// unsigned short id;
1416
};
1517

1618
struct address_search {

src/network/block.c

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
#include "block.h"
22

33

4-
struct blocks *generate_blocks(size_t nb_blks) {
5-
struct blocks *blks = malloc(sizeof(struct blocks));
6-
blks->blks = malloc(nb_blks * sizeof(struct block*));
4+
struct block_register *generate_blocks(size_t nb_blks) {
5+
struct block_register *blks = malloc(sizeof(struct block_register));
6+
blks->blks = malloc(nb_blks * sizeof(struct block *));
77
blks->nb_blocks = nb_blks;
88
return blks;
99
}
1010

1111
struct block *generate_block(unsigned short id, size_t size, size_t node_address,
12-
size_t virtual_address, char free) {
12+
size_t virtual_address, char free) {
1313
struct block *blk = malloc(sizeof(struct block));
1414
blk->id = id;
1515
blk->size = size;
@@ -27,11 +27,11 @@ void add_block(struct block *blk, unsigned short id, size_t size, size_t node_ad
2727
(void) blk;
2828
}
2929

30-
void merge_free_block(struct blocks *blks);
30+
void merge_free_block(struct block_register *blks);
3131

32-
struct blocks *init_nodes_same_size(unsigned short nb_nodes, size_t size) {
33-
struct blocks *blks = generate_blocks(nb_nodes);
34-
size_t v_address = 0;
32+
struct block_register *init_nodes_same_size(unsigned short nb_nodes, size_t size) {
33+
struct block_register *blks = generate_blocks(nb_nodes);
34+
size_t v_address = 0;
3535
for (size_t i = 0; i < blks->nb_blocks; i++) {
3636
// Skip 0 (user), so from 1 to nb_nodes + 1
3737
blks->blks[i] = generate_block(i + 1, size, 0, v_address, 0);
@@ -40,3 +40,39 @@ struct blocks *init_nodes_same_size(unsigned short nb_nodes, size_t size) {
4040
printf("Global init has memory size of %zu bytes", v_address);
4141
return blks;
4242
}
43+
44+
struct block *split_block_u(struct block *b, size_t size) {
45+
if (!b) {
46+
printf("FATAL ALLOCATION ERROR\n");
47+
}
48+
if (b->size < size) {
49+
b->size = size;
50+
size_t su = size - b->size;
51+
struct block *b_next = b->next;
52+
add_block(b, b->id, su, b->node_address + size, b->virtual_address + size, 0);
53+
b->next->next = b_next;
54+
return b;
55+
}
56+
return NULL;
57+
}
58+
59+
struct allocation_register *generate_allocs(size_t size_alloc) {
60+
struct allocation_register *a = malloc(sizeof(struct allocation_register));
61+
a->size_alloc = size_alloc;
62+
a->count_alloc = 0;
63+
a->allocs = malloc(sizeof(struct allocation) * size_alloc);
64+
return a;
65+
}
66+
67+
void add_allocation(struct allocation_register *a_r, struct allocation *a) {
68+
if (a_r->count_alloc >= a_r->size_alloc) {
69+
a_r->allocs[a_r->count_alloc] = a;
70+
} else {
71+
// x2 size
72+
a_r->size_alloc = a_r->size_alloc * 2;
73+
a_r->allocs = realloc(a_r->allocs, a_r->size_alloc * sizeof(struct allocation));
74+
75+
}
76+
a_r->allocs[a_r->count_alloc] = a;
77+
a_r->count_alloc++;
78+
}

src/network/leader.c

Lines changed: 86 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,76 @@
66

77
#include <mpi.h>
88

9-
struct leader_resources *generate_leader_resources(size_t nb_nodes) {
9+
struct leader_resources *generate_leader_resources(size_t nb_nodes /*, struct node *n*/) {
1010
struct leader_resources *l_r = malloc(sizeof(struct leader_resources));
1111
l_r->leader_blks = init_nodes_same_size(nb_nodes, 8);
1212
l_r->leader_command_queue = NULL;
13+
l_r->leader_reg = generate_allocs(4);
14+
//l_r->id = n->id;
1315
return l_r;
1416
}
1517

18+
int check_block_for_alloc(size_t *res_addr, struct block *b, size_t size, struct leader_resources *l_r) {
19+
if (0 == b->free) {
20+
if (size == b->size) {
21+
b->free = 1;
22+
struct allocation *a = malloc(sizeof(struct allocation));
23+
a->number_parts = 1;
24+
a->v_address_start = b->virtual_address;
25+
a->parts = malloc(a->number_parts * sizeof(struct allocation*));
26+
a->parts[0] = b;
27+
add_allocation(l_r->leader_reg, a);
28+
*res_addr = b->virtual_address;
29+
return 1;
30+
}
31+
else if (size < b->size) {
32+
b->free = 1;
33+
b = split_block_u(b, size);
34+
struct allocation *a = malloc(sizeof(struct allocation));
35+
a->number_parts = 1;
36+
a->v_address_start = b->virtual_address;
37+
a->parts = malloc(a->number_parts * sizeof(struct allocation*));
38+
a->parts[0] = b;
39+
add_allocation(l_r->leader_reg, a);
40+
*res_addr = b->virtual_address;
41+
return 1;
42+
}
43+
else {
44+
45+
}
46+
47+
}
48+
return 0;
49+
}
50+
1651
/**
1752
* Allocated memory for the User, using free space of nodes
53+
* | X1 | | X2 | X1 |
1854
* @param size
1955
* @param l_r
2056
* @return 1 if okay, 0 if no blocks possible for this size
2157
*/
22-
int alloc_memory(size_t size, struct leader_resources *l_r) {
23-
struct blocks *blks = l_r->leader_blks;
24-
(void) blks;
25-
(void) size;
58+
size_t alloc_memory(size_t size, struct leader_resources *l_r) {
59+
struct block_register *blks = l_r->leader_blks;
60+
if (!blks && blks->nb_blocks > 0) {
61+
debug("ERROR not malloc blockS !!!", 0); //l_r->id);
62+
return 999;
63+
}
64+
size_t address = 0;
65+
for (size_t i = 0; i < blks->nb_blocks; i++) {
66+
struct block *b = blks->blks[i];
67+
if (!b) {
68+
debug("ERROR not malloc block !!!", 0); // l_r->id);
69+
return 1999;
70+
}
71+
if (1 == check_block_for_alloc(&address, b, size, l_r))
72+
return address;
73+
}
2674
return 0;
2775
}
2876

2977
struct address_search *search_at_address(size_t address, struct leader_resources *l_r) {
30-
struct blocks *bs = l_r->leader_blks;
78+
struct block_register *bs = l_r->leader_blks;
3179
for (size_t i = 0; i < bs->nb_blocks; i++) {
3280
struct block *b = bs->blks[i];
3381
if (b->virtual_address >= address && b->virtual_address + b->size < address) {
@@ -101,8 +149,25 @@ void get_command(struct node *n, struct leader_resources *l_r, unsigned short us
101149
}
102150

103151
void execute_malloc(struct node *n, struct leader_resources *l_r) {
104-
(void) n;
105-
(void) l_r;
152+
struct data_size *d_s = peek_command(l_r->leader_command_queue);
153+
if (!d_s) {
154+
debug("ERROR allocation data_size for OP MALLOC execution [LEADER]", n->id);
155+
}
156+
size_t v_addr = alloc_memory(d_s->size, l_r);
157+
if (v_addr == 999 || v_addr == 1999) {
158+
debug("FATAL ERROR", n->id);
159+
if (v_addr == 1999) {
160+
debug("SEC", n->id);
161+
}
162+
return;
163+
}
164+
debug("Allocation at ", n->id);
165+
printf("%zu\n", v_addr);
166+
struct message *m = generate_message(n->id, DEF_NODE_USER, DEF_NODE_USER, v_addr, d_s->size, OP_MALLOC);
167+
168+
MPI_Request r;
169+
MPI_Isend((void *) m, sizeof(struct message), MPI_BYTE, m->id_t, 0, MPI_COMM_WORLD, &r);
170+
free(m);
106171
}
107172

108173
void execute_read(struct node *n, struct leader_resources *l_r) {
@@ -128,14 +193,18 @@ void execute_command(struct node *n, struct leader_resources *l_r) {
128193

129194
switch (peek_user_command(l_r->leader_command_queue)) {
130195
case OP_MALLOC:
196+
debug("EXECUTE OP MALLOC LEADER", n->id);
131197
execute_malloc(n, l_r);
132198
break;
133199
case OP_FREE:
200+
debug("EXECUTE OP FREE LEADER", n->id);
134201
break;
135202
case OP_WRITE:
203+
debug("EXECUTE OP WRITE LEADER", n->id);
136204
execute_write(n, l_r);
137205
break;
138206
case OP_READ:
207+
debug("EXECUTE OP READ LEADER", n->id);
139208
execute_read(n, l_r);
140209
break;
141210
case OP_DUMP:
@@ -153,13 +222,19 @@ void execute_command(struct node *n, struct leader_resources *l_r) {
153222
default:
154223
break;
155224
}
225+
pop_command(l_r->leader_command_queue);
156226
}
157227
}
158228

159229

160230
void leader_loop(struct node *n, unsigned short terminal_id, unsigned short nb_nodes) {
161231
// Init leader resource
162-
struct leader_resources *l_r = generate_leader_resources(nb_nodes);
232+
struct leader_resources *l_r = generate_leader_resources(nb_nodes/*, n*/);
233+
234+
for (size_t i = 0; i < l_r->leader_blks->nb_blocks; i++) {
235+
struct block *b = l_r->leader_blks->blks[i];
236+
printf("%u\n", b->id);
237+
}
163238

164239
/*
165240
// MPI_Isend();
@@ -176,10 +251,10 @@ void leader_loop(struct node *n, unsigned short terminal_id, unsigned short nb_n
176251
while (1) {
177252
// Get command from user
178253
get_command(n, l_r, terminal_id);
179-
254+
debug("COMMANDS LISTEN DONE", n->id);
180255
// Execute Commands
181256
execute_command(n, l_r);
182-
257+
debug("COMMANDS EXEC DONE", n->id);
183258
// Break on death
184259
if (die == 1)
185260
break;

0 commit comments

Comments
 (0)