Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
garbage_collector.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* garbage_collector.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: hgenc <hgenc@student.42kocaeli.com.tr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2026/03/04 16:00:00 by hgenc #+# #+# */
9/* Updated: 2026/03/04 16:00:00 by hgenc ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13/**
14 * @file garbage_collector.c
15 * @brief Arena-based garbage collector — core fonksiyonlar
16 *
17 * Linked-list tabanlı basit bir GC.
18 * Her allocation gc_node olarak listeye eklenir,
19 * gc_free_all ile hepsi toplu serbest bırakılır.
20 */
21
23#include "../../libft/libft.h"
24#include <stdlib.h>
25
26/**
27 * @brief GC yapısını ilk duruma getirir
28 * @param gc GC yapısı pointer'ı
29 */
30void gc_init(t_gc *gc)
31{
32 gc->head = NULL;
33}
34
35/**
36 * @brief Yeni bir gc_node oluşturup ptr'yi kaydeder
37 * @param gc GC yapısı pointer'ı
38 * @param ptr Kaydedilecek pointer
39 * @return Kaydedilen pointer, başarısızsa NULL
40 */
41static t_gc_node *gc_add_node(t_gc *gc, void *ptr)
42{
43 t_gc_node *node;
44
45 if (!ptr)
46 return (NULL);
47 node = malloc(sizeof(t_gc_node));
48 if (!node)
49 {
50 free(ptr);
51 return (NULL);
52 }
53 node->ptr = ptr;
54 node->next = gc->head;
55 gc->head = node;
56 return (node);
57}
58
59/**
60 * @brief malloc + GC'ye kayıt — free gerekmez
61 * @param gc GC yapısı pointer'ı
62 * @param size Ayrılacak byte sayısı
63 * @return malloc'lanmış ve GC'ye kaydedilmiş pointer, başarısızsa NULL
64 */
65void *gc_alloc(t_gc *gc, size_t size)
66{
67 void *ptr;
68
69 ptr = malloc(size);
70 if (!ptr)
71 return (NULL);
72 if (!gc_add_node(gc, ptr))
73 return (NULL);
74 return (ptr);
75}
76
77/**
78 * @brief ft_calloc + GC'ye kayıt — sıfırlanmış bellek, free gerekmez
79 * @param gc GC yapısı pointer'ı
80 * @param nmemb Eleman sayısı
81 * @param size Her elemanın byte boyutu
82 * @return calloc'lanmış ve GC'ye kaydedilmiş pointer, başarısızsa NULL
83 *
84 * @note Örn: gc_calloc(&shell->gc, 100, sizeof(char)) → 100 char'lık buffer
85 */
86void *gc_calloc(t_gc *gc, size_t nmemb, size_t size)
87{
88 void *ptr;
89
90 ptr = ft_calloc(nmemb, size);
91 if (!ptr)
92 return (NULL);
93 if (!gc_add_node(gc, ptr))
94 return (NULL);
95 return (ptr);
96}
97
98/**
99 * @brief Mevcut bir pointer'ı GC'ye kaydeder (dışarıda malloc edilmiş)
100 * @param gc GC yapısı pointer'ı
101 * @param ptr Kaydedilecek pointer
102 * @return Kaydedilen pointer, başarısızsa NULL (ptr de free'lenir)
103 */
104void *gc_register(t_gc *gc, void *ptr)
105{
106 if (!ptr)
107 return (NULL);
108 if (!gc_add_node(gc, ptr))
109 return (NULL);
110 return (ptr);
111}
112
113/**
114 * @brief GC'deki tüm kayıtlı pointer'ları serbest bırakır
115 * @param gc GC yapısı pointer'ı
116 *
117 * Tüm node'ları ve içlerindeki ptr'leri free'ler.
118 * Çağrıdan sonra gc tekrar kullanılabilir (head = NULL).
119 */
121{
122 t_gc_node *current;
123 t_gc_node *next;
124
125 current = gc->head;
126 while (current)
127 {
128 next = current->next;
129 free(current->ptr);
130 free(current);
131 current = next;
132 }
133 gc->head = NULL;
134}
void * gc_register(t_gc *gc, void *ptr)
Mevcut bir pointer'ı GC'ye kaydeder (dışarıda malloc edilmiş).
void * gc_alloc(t_gc *gc, size_t size)
malloc + GC'ye kayıt — free gerekmez
static t_gc_node * gc_add_node(t_gc *gc, void *ptr)
Yeni bir gc_node oluşturup ptr'yi kaydeder.
void gc_init(t_gc *gc)
GC yapısını ilk duruma getirir.
void gc_free_all(t_gc *gc)
GC'deki tüm kayıtlı pointer'ları serbest bırakır.
void * gc_calloc(t_gc *gc, size_t nmemb, size_t size)
ft_calloc + GC'ye kayıt — sıfırlanmış bellek, free gerekmez
Arena-based garbage collector header.
struct s_gc t_gc
GC ana yapısı — allocation listesinin başını tutar.
struct s_gc_node t_gc_node
GC düğüm yapısı — tek bir allocation'ı temsil eder.
struct s_gc_node * next
t_gc_node * head