Skip to content

Commit b2de01e

Browse files
committed
munmap only on large
1 parent b3fde3a commit b2de01e

10 files changed

Lines changed: 55 additions & 55 deletions

File tree

include/malloc.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
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)
2120

2221
#define ALIGNMENT 16 // 8 on 32 bits, 16 on 64 bits
2322
#define TINY_MMAP_SIZE (4 * getpagesize())
@@ -27,7 +26,7 @@
2726
// 4*4096 - 100*(1024+32) = 25472 free space
2827
#define SMALL_ALLOC_SIZE (1024)
2928

30-
typedef enum e_type { ANCHOR, TINY, SMALL, LARGE } t_type;
29+
typedef enum e_type { TINY, SMALL, LARGE } t_type;
3130

3231
typedef struct s_alloc t_alloc; // declare it here to use it in s_mmap
3332
typedef struct s_mmap {
@@ -58,7 +57,7 @@ void *_malloc(size_t size);
5857
void *malloc(size_t size);
5958

6059
// free.c
61-
void _free(void *mmap);
60+
void _free(void *ptr);
6261
void free(void *ptr);
6362

6463
// realloc.c

src/alloc.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
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-
if (TESTNULL(g_mmap))
7-
return NULL;
8-
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
6+
for (t_mmap *mmap = g_mmap; mmap; mmap = mmap->next) {
97
if (ptr < (void *)mmap || ptr > MMAP_SHIFT(mmap) + mmap->size)
108
continue;
119
for (t_alloc *alloc = mmap->alloc; alloc; alloc = alloc->next) {
@@ -60,9 +58,9 @@ t_alloc *new_alloc(t_mmap *mmap, void *ptr, size_t size) {
6058
}
6159

6260
t_alloc *find_alloc(size_t size) {
63-
if (TESTNULL(g_mmap))
61+
if (!g_mmap)
6462
return NULL;
65-
for (t_mmap *mmap = g_mmap; !TESTNULL(mmap); mmap = mmap->next) {
63+
for (t_mmap *mmap = g_mmap; mmap; mmap = mmap->next) {
6664
if (mmap->type != get_mmap_type(size))
6765
continue;
6866

src/free.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
#include "../include/malloc.h"
22
#include <stddef.h>
3-
#include <unistd.h>
43

54
void _free(void *ptr) {
6-
if (!ptr || TESTNULL(g_mmap))
5+
if (!ptr | !g_mmap)
76
return;
87
/* t_alloc *alloc = ptr - sizeof(t_alloc); */
98
t_alloc *alloc = find_alloc_ptr(ptr);
@@ -22,9 +21,7 @@ void _free(void *ptr) {
2221
alloc->parent->alloc = alloc->next;
2322

2423
// in case it's the only alloc in a t_mmap, free the mmap
25-
if (alloc->parent->type != LARGE)
26-
return;
27-
if (!alloc->next && !alloc->prev) {
24+
if (!alloc->next && !alloc->prev && alloc->parent->type == LARGE) {
2825
t_mmap *map = alloc->parent;
2926
if (map->prev)
3027
map->prev->next = map->next;
@@ -33,12 +30,13 @@ void _free(void *ptr) {
3330
// FIX: this cause page reclaims to skyrocket
3431
if (map == g_mmap)
3532
g_mmap = map->next;
36-
3733
munmap(map, map->size + sizeof(t_mmap));
3834
}
3935
}
4036

4137
void free(void *ptr) {
38+
(void)ptr;
39+
/* return; */
4240
if (LOGGING) {
4341
ft_dprintf(tmpfd(), "free(%p)\n", ptr);
4442
/* flog("free(): ", (size_t)ptr); */

src/global_init.c

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

4-
/* t_mmap g_mmap = {NULL, NULL, ANCHOR, 0, NULL}; */
54
t_mmap *g_mmap = NULL;
65

76
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;

src/malloc.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
#include "../include/malloc.h"
2-
#include <unistd.h>
32

43
void *_malloc(size_t size) {
54
t_alloc *res = find_alloc(size);
65
if (res)
76
return ALLOC_SHIFT(res);
8-
if (!new_mmap(size))
9-
return NULL;
7+
new_mmap(size);
108
res = find_alloc(size);
119
return ALLOC_SHIFT(res);
1210
}

src/mmap.c

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

1919
t_mmap *new_mmap(size_t size) {
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) {
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) {
2324
errno = ENOMEM;
2425
return NULL;
2526
}
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 (TESTNULL(g_mmap))
32+
if (!g_mmap)
3333
return g_mmap = map;
34-
for (t_mmap *tmp = g_mmap; !TESTNULL(tmp); tmp = tmp->next) {
34+
for (t_mmap *tmp = g_mmap; tmp; tmp = tmp->next) {
3535
if (map < tmp) {
3636
map->prev = tmp->prev;
3737
map->next = 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 (TESTNULL(g_mmap)) {
14+
if (!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; !TESTNULL(mmap); mmap = mmap->next) {
20+
for (t_mmap *mmap = g_mmap; 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 (TESTNULL(g_mmap)) {
73+
if (!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; !TESTNULL(mmap); mmap = mmap->next) {
79+
for (t_mmap *mmap = g_mmap; 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 (TESTNULL(g_mmap)) {
102+
if (!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; !TESTNULL(mmap); mmap = mmap->next) {
108+
for (t_mmap *mmap = g_mmap; 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.1 KB
Binary file not shown.

test2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
void print(char *s) { write(1, s, strlen(s)); }
66

7+
void test(void *p);
78
int main(void) {
89
int i;
910
char *addr;

test3.c

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

55
#define M (1024 * 1024)
66

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

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

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);
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);
3441
}

0 commit comments

Comments
 (0)