Skip to content

Commit 22fe75a

Browse files
committed
Solution to exercise 7-2 (resolved issue #2)
1 parent f89818f commit 22fe75a

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

07_Memory_Allocation/my_free_and_sbrk.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,13 @@ static const size_t min_allocation = sizeof(free_list_entry_t) - sizeof(size_t);
7171

7272
void *my_malloc(size_t size)
7373
{
74+
#ifdef DEBUG
75+
fprintf(stderr, "my_alloc(%ld)\n", (long int)size);
76+
#endif
7477
errno = 0;
7578
if (size <= 0) return NULL;
7679

77-
/* -----------------------------------------sizeof(free_list_entry_t) - sizeof(size_t)--------------------------------
80+
/* -------------------------------------------------------------------------
7881
* Implementation restriction - all allocation requests are to fit inside a
7982
* single chunk.
8083
* ---------------------------------------------------------------------- */
@@ -97,7 +100,10 @@ void *my_malloc(size_t size)
97100
{
98101
size += min_allocation - ((size + sizeof(size_t)) & mask);
99102
}
100-
}
103+
}
104+
#ifdef DEBUG
105+
fprintf(stderr, "my_alloc: adjusted size=%ld\n", (long int)size);
106+
#endif
101107

102108
/* -------------------------------------------------------------------------
103109
* If there is no free list yet, create a free area of one chunk only.
@@ -108,7 +114,16 @@ void *my_malloc(size_t size)
108114
free_list -> allocated = chunk_size - sizeof(size_t);
109115
free_list -> prev_free_area = NULL;
110116
free_list -> next_free_area = NULL;
117+
#ifdef DEBUG
118+
fprintf(stderr, "my_alloc: allocated free_list=%10p with size=0X%08lX\n", (void *)free_list, free_list -> allocated);
119+
#endif
120+
}
121+
#ifdef DEBUG
122+
else
123+
{
124+
fprintf(stderr, "my_alloc: free_list=%10p\n", (void *)free_list);
111125
}
126+
#endif
112127

113128
/* -------------------------------------------------------------------------
114129
* First fit allocation. (This is the simplest to implement.)
@@ -120,7 +135,13 @@ void *my_malloc(size_t size)
120135
candidate_area = candidate_area -> next_free_area)
121136
{
122137
last_free_area = candidate_area;
138+
#ifdef DEBUG
139+
fprintf(stderr, "my_alloc: candidate_area=%10p\n with size=0X%08lX", (void *)candidate_area, (long int)candidate_area -> allocated);
140+
#endif
123141
}
142+
#ifdef DEBUG
143+
fprintf(stderr, "my_alloc: candidate_area=%10p and last_free_area=%10p\n", (void *)candidate_area, (void *)last_free_area);
144+
#endif
124145

125146
/* -------------------------------------------------------------------------
126147
* If there is insufficient free space available, do NOT request any new
@@ -162,7 +183,14 @@ void *my_malloc(size_t size)
162183
split_free_area -> next_free_area = candidate_area -> next_free_area;
163184
if (last_free_area == NULL)
164185
{
165-
free_list = candidate_area -> next_free_area;
186+
if (candidate_area -> next_free_area != NULL)
187+
{
188+
free_list = candidate_area -> next_free_area;
189+
}
190+
else
191+
{
192+
free_list = split_free_area;
193+
}
166194
}
167195
else
168196
{

0 commit comments

Comments
 (0)