Skip to content

Commit ec7f1a3

Browse files
committed
leader: try fix segvfault try
1 parent 8569eba commit ec7f1a3

1 file changed

Lines changed: 48 additions & 25 deletions

File tree

src/network/leader.c

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

116139
void 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

Comments
 (0)