Skip to content

Commit 56a19ce

Browse files
Common-lib : Memory management (#14)
* memory mamnagement include file * Added memory manager code - memory init support memory finit (excluding destroying the main tracker list) * Fixed bugs - cleanup of code - test.c updated for testing allocations and free - included mem_init() and mem_finit() * Docs: Added Template for future commits Co-authored-by: ranganathvn <vnranganath.20@gmail.com>
1 parent c55ff14 commit 56a19ce

File tree

8 files changed

+192
-0
lines changed

8 files changed

+192
-0
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ clean:
6060
find ${PROJ_PATH} -name "*.out" -exec rm -v {} \;
6161

6262

63+
6364
help:
6465
@echo "Available build options"
6566
@echo "#> make <OPTIONS>"

common/Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,30 @@ common_ARCHIVE=$(PROJ_PATH)/common/bin/common.a
77
logger_SRC=src/logger.c
88
logger_OBJ=bin/logger.o
99

10+
mem_SRC=src/memory_manager.c
11+
mem_OBJ=bin/memory_manager.o
12+
1013
fault_SRC=src/fault_manager.c
1114
fault_OBJ=bin/fault_manager.o
1215

16+
1317
common_ARCHIVE=$(PROJ_PATH)/common/bin/common.a
1418

1519
OBJS=$(common_OBJ)
1620
OBJS+=$(logger_OBJ)
21+
OBJS+=$(mem_OBJ)
1722
OBJS+=$(fault_OBJ)
1823

24+
1925
$(common_OBJ): $(common_SRC)
2026
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
2127

2228
$(logger_OBJ): $(logger_SRC)
2329
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
2430

31+
$(mem_OBJ): $(mem_SRC)
32+
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
33+
2534
$(fault_OBJ): $(fault_SRC)
2635
$(CC) $(INCLUDES) -c $^ -o $@ $(CFLAGS)
2736

common/inc/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#include "os.h"
22
#include "typedefs.h"
33
#include "logger.h"
4+
#include "memory_manager.h"
45
#include "fault_manager.h"
6+

common/inc/memory_manager.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
3+
#define get_mem(nmemb, size) tag_alloc(nmemb, size, __FILE__, __LINE__)
4+
#define del_mem(mem_addr) untag_alloc(mem_addr, __FILE__, __LINE__)
5+
6+
typedef struct memory_record
7+
{
8+
void *mem;
9+
size_t nmemb;
10+
size_t block_size;
11+
char *file;
12+
int line;
13+
struct memory_record *next;
14+
}t_mem_record;
15+
16+
17+
typedef struct mem_mamnager{
18+
t_mem_record *mem_record;
19+
int alloc_count;
20+
int free_count;
21+
}t_mem_manager;
22+
23+
24+
void mem_init(void);
25+
void mem_finit(void);
26+
27+
void *tag_alloc(size_t nmemb, size_t size, char *file, int line);
28+
void untag_alloc(void *mem_addr, char *file, int line);
29+
30+
void mem_alloc_report(void);
31+

common/inc/os.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@
88
#include <pthread.h>
99
#include <signal.h>
1010
#include <sys/time.h>
11+
12+
13+
#ifndef CUSTOM_MALLOC
14+
#define os_alloc(nmemb, size) calloc((nmemb), (size))
15+
#define os_free(mem_addr) free((mem_addr))
16+
17+
#endif

common/src/memory_manager.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include "common.h"
2+
3+
static t_mem_manager memer;
4+
5+
void mem_init()
6+
{
7+
memer.mem_record = NULL;
8+
memer.alloc_count = 0;
9+
memer.free_count = 0;
10+
}
11+
12+
void mem_finit(void)
13+
{
14+
t_mem_record *iter = NULL;
15+
mem_alloc_report();
16+
if (memer.mem_record != NULL) {
17+
for (iter = memer.mem_record ; iter != NULL; iter = iter->next) {
18+
printf("cleaning up allocated memory space %p\n", iter);
19+
os_free(iter);
20+
}
21+
}
22+
memer.alloc_count = 0;
23+
memer.free_count = 0;
24+
25+
}
26+
27+
void *tag_alloc(size_t nmemb, size_t size, char *file, int line)
28+
{
29+
//TODO:add resource lock
30+
t_mem_record *new_mem = os_alloc(1, sizeof(t_mem_record));
31+
if (new_mem == NULL) {
32+
printf("Memory allocation for tracker failed\n");
33+
}
34+
new_mem->nmemb = nmemb;
35+
new_mem->block_size = size;
36+
new_mem->file = file;
37+
new_mem->line = line;
38+
new_mem->next = NULL;
39+
40+
new_mem->mem = os_alloc(nmemb, size);
41+
if (new_mem->mem == NULL) {
42+
printf("Memory allocation failed\n");
43+
}
44+
else {
45+
memer.alloc_count++;
46+
new_mem->next = memer.mem_record;
47+
memer.mem_record = new_mem;
48+
}
49+
50+
51+
return (new_mem->mem);
52+
53+
}
54+
55+
56+
57+
58+
void untag_alloc(void *mem_addr, char *file, int line)
59+
{
60+
t_mem_record * mem_list = NULL, *prev_addr = NULL;
61+
if (memer.mem_record == NULL)
62+
return;
63+
64+
for (mem_list = memer.mem_record; mem_list != NULL; prev_addr = mem_list, mem_list = mem_list->next) {
65+
if (mem_addr == mem_list->mem) {
66+
67+
if (mem_addr == memer.mem_record->mem) {
68+
memer.mem_record = mem_list->next;
69+
}
70+
else {
71+
prev_addr->next = mem_list->next;
72+
}
73+
74+
if (mem_addr) {
75+
os_free(mem_addr);
76+
memer.free_count++;
77+
}
78+
79+
os_free(mem_list);
80+
}
81+
}
82+
}
83+
84+
85+
void mem_alloc_report(void)
86+
{
87+
printf("allocations = %4d , freed allocations = %4d\n",
88+
memer.alloc_count, memer.free_count);
89+
}

doc/merge_template.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# **C EVERYTHING Merge**
2+
3+
## Commit details
4+
* **Description of code changes:**
5+
* .
6+
7+
## Milestone Details
8+
*
9+
10+
## Change category
11+
- [ ] Enhancement
12+
- [ ] Bug-Fix
13+
- [ ] Cosmetic
14+
- [ ] Documentation
15+
- [ ] Unit-testing-fixes
16+
- [ ] Automation-Scripts
17+
- [ ] Configuration-files
18+
- [x] New-feature-addition
19+
20+
## Issue Details
21+
*
22+
23+
## Review information
24+
* Reviewer Name : @jar3m
25+
- [x] All Review comments addressed.
26+
27+
## Pre Commit checklist
28+
- [x] Code build succeeded.
29+
- [x] Coding guidelines reviewed.
30+
- [ ] Added comment header for new functions.
31+
- [x] Code functional review completed.
32+
- [x] Unit tested the code changes.
33+
34+
## Unit test details
35+
*
36+
37+
Author <@jar3m>

test/src/test.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,22 @@
22

33
int main(int argc, char *argv[])
44
{
5+
6+
printf("Hello Memers\n");
7+
mem_init();
58
logger_init();
9+
size_t size = 0;
10+
int *ptr[100];
11+
for (int i = 0; i < 100; i ++) {
12+
ptr[i] = (int *)get_mem(1, sizeof(int));
13+
size += sizeof(*(ptr[i]));
14+
printf("address of allocated memory = %p\n", ptr[i]);
15+
}
16+
printf("size of allocated memory = %lu\n" , size);
17+
for (int i = 0; i < 100; i++) {
18+
del_mem(ptr[i]);
19+
}
20+
621

722
LOG_ERROR("COMMON", "Hello World\n");
823
LOG_WARN("COMMON", "Hello World\n");
@@ -12,6 +27,7 @@ int main(int argc, char *argv[])
1227
LOG_TRACE_OUT("COMMON", "Hello World\n");
1328

1429
fault_manager_init(NULL);
30+
mem_finit();
1531

1632
return 0;
1733

0 commit comments

Comments
 (0)