@@ -23,14 +23,7 @@ int free_memory(size_t address, struct leader_resources *l_r) {
2323 return 0 ;
2424}
2525
26- /**
27- * Allocated memory for the User, using free space of nodes
28- * | X1 | | X2 | X1 |
29- * @param size
30- * @param l_r
31- * @return 1 if okay, 0 if no blocks possible for this size
32- */
33- size_t alloc_memory (size_t size , struct leader_resources * l_r ) {
26+ size_t single_part (size_t size , struct leader_resources * l_r ) {
3427 if (size >= l_r -> max_memory || size >= l_r -> availaible_memory )
3528 return SIZE_MAX ;
3629 struct block_register * blks = l_r -> leader_blks ;
@@ -75,33 +68,47 @@ size_t alloc_memory(size_t size, struct leader_resources *l_r) {
7568 b = b -> next ;
7669 }
7770 }
71+ return SIZE_MAX ;
72+ }
73+
74+ size_t multiple_part (size_t size , struct leader_resources * l_r ) {
75+ if (size >= l_r -> max_memory || size >= l_r -> availaible_memory )
76+ return SIZE_MAX ;
77+ struct block_register * blks = l_r -> leader_blks ;
78+ // Merge free blocks (reform big blocks after frees)
79+ merge_free_block (blks );
80+ if (!blks && blks -> nb_blocks > 0 ) {
81+ debug ("ERROR not malloc blockS !!!" , 0 ); //l_r->id);
82+ return 999 ;
83+ }
7884 // Multi - Parts
7985 struct allocation * a = malloc (60 + sizeof (struct allocation ));
8086 a -> number_parts = 0 ;
8187 a -> parts = NULL ;
8288 a -> v_address_start = SIZE_MAX ;
89+ a -> parts = malloc ((200 ) * sizeof (struct allocation * ));
8390 ssize_t m_size = size ;
8491 size_t m_t_size = 0 ;
8592 for (size_t i = 0 ; i < blks -> nb_blocks ; i ++ ) {
86- struct block * b = blks -> blks [i ];
87- while (b && b -> id != l_r -> id && m_size > 0 ) {
88- if (b -> free == 0 ) {
89- b -> free = 1 ;
90- if ((ssize_t ) b -> size >= m_size ) {
91- m_t_size = m_size ;
92- m_size = 0 ;
93- b = split_block_u (b , m_t_size );
94- } else {
95- m_t_size = m_size - b -> size ;
96- m_size -= b -> size ;
93+ if (blks -> blks && blks -> blks [i ]) {
94+ struct block * b = blks -> blks [i ];
95+ while (b && b -> id != l_r -> id && m_size > 0 ) {
96+ if (b && b -> free == 0 ) {
97+ b -> free = 1 ;
98+ if ((ssize_t ) b -> size >= m_size ) {
99+ m_t_size = m_size ;
100+ m_size = 0 ;
101+ b = split_block_u (b , m_t_size );
102+ } else {
103+ m_size -= b -> size ;
104+ }
105+ if (a -> v_address_start == SIZE_MAX )
106+ a -> v_address_start = b -> virtual_address ;
107+ a -> number_parts ++ ;
108+ a -> parts [a -> number_parts - 1 ] = b ;
97109 }
98- if (a -> v_address_start == SIZE_MAX )
99- a -> v_address_start = b -> virtual_address ;
100- a -> number_parts ++ ;
101- a -> parts = realloc (a -> parts , (4 + a -> number_parts ) * sizeof (struct allocation * ));
102- a -> parts [a -> number_parts - 1 ] = b ;
110+ b = b -> next ;
103111 }
104- b = b -> next ;
105112 }
106113 if (m_size <= 0 ) {
107114 add_allocation (l_r -> leader_reg , a );
@@ -112,6 +119,22 @@ size_t alloc_memory(size_t size, struct leader_resources *l_r) {
112119 return SIZE_MAX ;
113120}
114121
122+ /**
123+ * Allocated memory for the User, using free space of nodes
124+ * | X1 | | X2 | X1 |
125+ * @param size
126+ * @param l_r
127+ * @return 1 if okay, 0 if no blocks possible for this size
128+ */
129+ size_t alloc_memory (size_t size , struct leader_resources * l_r ) {
130+ size_t t = single_part (size , l_r );
131+ if (t == SIZE_MAX ) {
132+ return multiple_part (size , l_r );
133+ } else {
134+ return t ;
135+ }
136+ }
137+
115138
116139void get_command (struct leader_resources * l_r , unsigned short user ) {
117140 // int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source,
0 commit comments