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
2977struct 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
103151void 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
108173void 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
160230void 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