Skip to content

Commit b3fde3a

Browse files
committed
working with TESTNULL
1 parent 446be9c commit b3fde3a

10 files changed

Lines changed: 56 additions & 63 deletions

File tree

include/malloc.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#define MMAP_SHIFT(mmap) ((void *)mmap + sizeof(t_mmap))
1919
#define ALLOC_SHIFT(alloc) ((void *)alloc + sizeof(t_alloc))
20+
#define TESTNULL(mmap) ((mmap == NULL || mmap == (void *)1) ? 1 : 0)
2021

2122
#define ALIGNMENT 16 // 8 on 32 bits, 16 on 64 bits
2223
#define TINY_MMAP_SIZE (4 * getpagesize())
@@ -44,7 +45,7 @@ typedef struct s_alloc {
4445
size_t size;
4546
} t_alloc;
4647

47-
extern t_mmap g_mmap;
48+
extern t_mmap *g_mmap;
4849

4950
// global_init.c
5051
void lock_mutex();
@@ -57,7 +58,7 @@ void *_malloc(size_t size);
5758
void *malloc(size_t size);
5859

5960
// free.c
60-
void _free(void *ptr);
61+
void _free(void *mmap);
6162
void free(void *ptr);
6263

6364
// realloc.c

perf.data

864 Bytes
Binary file not shown.

src/alloc.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
// alternative method to find alloc even if the ptr is in the middle of the
44
// alloc
55
t_alloc *find_alloc_ptr(void *ptr) {
6-
for (t_mmap *mmap = g_mmap.next; (size_t)mmap > 1; mmap = mmap->next) {
6+
if (TESTNULL(g_mmap))
7+
return NULL;
8+
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
79
if (ptr < (void *)mmap || ptr > MMAP_SHIFT(mmap) + mmap->size)
810
continue;
911
for (t_alloc *alloc = mmap->alloc; alloc; alloc = alloc->next) {
@@ -58,11 +60,9 @@ t_alloc *new_alloc(t_mmap *mmap, void *ptr, size_t size) {
5860
}
5961

6062
t_alloc *find_alloc(size_t size) {
61-
if ((size_t)g_mmap.next < 2)
63+
if (TESTNULL(g_mmap))
6264
return NULL;
63-
for (t_mmap *mmap = g_mmap.next; (size_t)mmap > 1; mmap = mmap->next) {
64-
if ((size_t)mmap < 2)
65-
return NULL;
65+
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
6666
if (mmap->type != get_mmap_type(size))
6767
continue;
6868

src/free.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <unistd.h>
44

55
void _free(void *ptr) {
6-
if (!ptr || (size_t)g_mmap.next < 2)
6+
if (!ptr || TESTNULL(g_mmap))
77
return;
88
/* t_alloc *alloc = ptr - sizeof(t_alloc); */
99
t_alloc *alloc = find_alloc_ptr(ptr);
@@ -22,20 +22,18 @@ void _free(void *ptr) {
2222
alloc->parent->alloc = alloc->next;
2323

2424
// in case it's the only alloc in a t_mmap, free the mmap
25+
if (alloc->parent->type != LARGE)
26+
return;
2527
if (!alloc->next && !alloc->prev) {
2628
t_mmap *map = alloc->parent;
2729
if (map->prev)
2830
map->prev->next = map->next;
2931
if (map->next)
3032
map->next->prev = map->prev;
3133
// FIX: this cause page reclaims to skyrocket
32-
/* if (map == g_mmap) */
33-
/* g_mmap = map->next; */
34+
if (map == g_mmap)
35+
g_mmap = map->next;
3436

35-
/* if (map == g_mmap.next) */
36-
/* g_mmap.next = map->next ? map->next : (void *)1; */
37-
if (map == g_mmap.next)
38-
g_mmap.next = (void *)1;
3937
munmap(map, map->size + sizeof(t_mmap));
4038
}
4139
}

src/global_init.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#include "../include/malloc.h"
22
#include <string.h>
33

4-
t_mmap g_mmap = {NULL, NULL, ANCHOR, 0, NULL};
4+
/* t_mmap g_mmap = {NULL, NULL, ANCHOR, 0, NULL}; */
5+
t_mmap *g_mmap = NULL;
56

67
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
78

src/mmap.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,29 @@ t_type get_mmap_type(size_t size) {
1717
}
1818

1919
t_mmap *new_mmap(size_t size) {
20-
t_mmap *map =
21-
mmap(NULL, get_mmap_size(size) + sizeof(t_mmap), PROT_READ | PROT_WRITE,
22-
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
23-
if (!map) {
20+
void *ptr = mmap(NULL, get_mmap_size(size) + sizeof(t_mmap),
21+
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
22+
if (!ptr) {
2423
errno = ENOMEM;
2524
return NULL;
2625
}
26+
t_mmap *map = ptr;
2727
map->type = get_mmap_type(size);
2828
map->size = get_mmap_size(size);
2929
map->next = NULL;
3030
map->prev = NULL;
3131
map->alloc = NULL;
32-
if ((size_t)g_mmap.next < 2)
33-
return g_mmap.next = map;
34-
for (t_mmap *tmp = g_mmap.next; (size_t)tmp > 1; tmp = tmp->next) {
32+
if (TESTNULL(g_mmap))
33+
return g_mmap = map;
34+
for (t_mmap *tmp = g_mmap; !TESTNULL(tmp); tmp = tmp->next) {
3535
if (map < tmp) {
3636
map->prev = tmp->prev;
3737
map->next = tmp;
3838
tmp->prev = map;
3939
if (map->prev)
4040
map->prev->next = map;
41-
if (g_mmap.next == tmp)
42-
g_mmap.next = map;
41+
if (g_mmap == tmp)
42+
g_mmap = map;
4343
break;
4444
} else if (map > tmp && (map < tmp->next || !tmp->next)) {
4545
map->prev = tmp;

src/show_alloc_mem.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ char *get_type_string(t_type type) {
1111

1212
void show_alloc_mem() {
1313
lock_mutex();
14-
if ((size_t)g_mmap.next < 2) {
14+
if (TESTNULL(g_mmap)) {
1515
ft_putstr("show_alloc_mem(): No memory allocated\n");
1616
unlock_mutex();
1717
return;
1818
}
1919
size_t total = 0;
20-
for (t_mmap *mmap = g_mmap.next; (size_t)mmap > 1; mmap = mmap->next) {
20+
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
2121
ft_printf("%s : %p\n", get_type_string(mmap->type), mmap);
2222
for (t_alloc *alloc = mmap->alloc; alloc; alloc = alloc->next) {
2323
if (!alloc)
@@ -70,13 +70,13 @@ void hexdump(void *ptr, size_t size) {
7070

7171
void show_alloc_mem_asciidump() {
7272
lock_mutex();
73-
if ((size_t)g_mmap.next < 2) {
73+
if (TESTNULL(g_mmap)) {
7474
ft_putstr("show_alloc_mem_ex(): No memory allocated\n");
7575
unlock_mutex();
7676
return;
7777
}
7878
size_t total = 0;
79-
for (t_mmap *mmap = g_mmap.next; (size_t)mmap > 1; mmap = mmap->next) {
79+
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
8080
ft_printf("%s : %p\n", get_type_string(mmap->type), mmap);
8181
for (t_alloc *alloc = mmap->alloc; alloc; alloc = alloc->next) {
8282
if (!alloc)
@@ -99,13 +99,13 @@ void show_alloc_mem_asciidump() {
9999

100100
void show_alloc_mem_hexdump() {
101101
lock_mutex();
102-
if ((size_t)g_mmap.next < 2) {
102+
if (TESTNULL(g_mmap)) {
103103
ft_putstr("show_alloc_mem_ex(): No memory allocated\n");
104104
unlock_mutex();
105105
return;
106106
}
107107
size_t total = 0;
108-
for (t_mmap *mmap = g_mmap.next; (size_t)mmap > 1; mmap = mmap->next) {
108+
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
109109
ft_printf("%s : %p\n", get_type_string(mmap->type), mmap);
110110
for (t_alloc *alloc = mmap->alloc; alloc; alloc = alloc->next) {
111111
if (!alloc)

test2

50.6 KB
Binary file not shown.

test2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "include/malloc.h"
1+
#include <stdlib.h>
22
#include <string.h>
33
#include <unistd.h>
44

test3.c

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,31 @@
44

55
#define M (1024 * 1024)
66

7-
void print(char *s)
8-
{
9-
write(1, s, strlen(s));
10-
}
7+
void print(char *s) { write(1, s, strlen(s)); }
118

12-
int main()
13-
{
14-
char *addr1;
15-
char *addr2;
16-
char *addr3;
9+
int main() {
10+
char *addr1;
11+
char *addr2;
12+
char *addr3;
1713

18-
addr1 = (char*)malloc(16*M);
19-
if (addr1 == NULL)
20-
{
21-
print("Failed to allocate memory\n");
22-
exit(1);
23-
}
24-
strcpy(addr1, "Hello world!\n");
25-
print(addr1);
26-
addr2 = (char*)malloc(16*M);
27-
if (addr2 == NULL)
28-
{
29-
print("Failed to allocate memory\n");
30-
exit(1);
31-
}
32-
addr3 = (char*)realloc(addr1, 128*M);
33-
if (addr3 == NULL)
34-
{
35-
print("Failed to reallocate memory\n");
36-
exit(1);
37-
}
38-
addr3[127*M] = 42;
39-
print(addr3);
40-
return (0);
14+
addr1 = (char *)malloc(16 * M);
15+
if (addr1 == NULL) {
16+
print("Failed to allocate memory\n");
17+
exit(1);
18+
}
19+
strcpy(addr1, "Hello world!\n");
20+
print(addr1);
21+
addr2 = (char *)malloc(16 * M);
22+
if (addr2 == NULL) {
23+
print("Failed to allocate memory\n");
24+
exit(1);
25+
}
26+
addr3 = (char *)realloc(addr1, 128 * M);
27+
if (addr3 == NULL) {
28+
print("Failed to reallocate memory\n");
29+
exit(1);
30+
}
31+
addr3[127 * M] = 42;
32+
print(addr3);
33+
return (0);
4134
}

0 commit comments

Comments
 (0)