This source file includes following definitions.
- rf_ShutdownMemChunk
- rf_ConfigureMemChunk
- rf_NewMemChunk
- rf_GetMemChunk
- rf_ReleaseMemChunk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #include "rf_types.h"
63 #include "rf_threadstuff.h"
64 #include "rf_debugMem.h"
65 #include "rf_memchunk.h"
66 #include "rf_general.h"
67 #include "rf_options.h"
68 #include "rf_shutdown.h"
69
70 typedef struct RF_ChunkHdr_s RF_ChunkHdr_t;
71 struct RF_ChunkHdr_s {
72 int size;
73 RF_ChunkDesc_t *list;
74 RF_ChunkHdr_t *next;
75 };
76
77 static RF_ChunkHdr_t *chunklist, *chunk_hdr_free_list;
78 static RF_ChunkDesc_t *chunk_desc_free_list;
79 RF_DECLARE_STATIC_MUTEX(chunkmutex);
80 void rf_ShutdownMemChunk(void *);
81 RF_ChunkDesc_t *rf_NewMemChunk(int, char *);
82
83
84 void rf_ShutdownMemChunk(ignored)
85 void *ignored;
86 {
87 RF_ChunkDesc_t *pt, *p;
88 RF_ChunkHdr_t *hdr, *ht;
89
90 if (rf_memChunkDebug)
91 printf("Chunklist:\n");
92 for (hdr = chunklist; hdr;) {
93 for (p = hdr->list; p;) {
94 if (rf_memChunkDebug)
95 printf("Size %d reuse count %d\n", p->size, p->reuse_count);
96 pt = p;
97 p = p->next;
98 RF_Free(pt->buf, pt->size);
99 RF_Free(pt, sizeof(*pt));
100 }
101 ht = hdr;
102 hdr = hdr->next;
103 RF_Free(ht, sizeof(*ht));
104 }
105
106 rf_mutex_destroy(&chunkmutex);
107 }
108
109 int
110 rf_ConfigureMemChunk(listp)
111 RF_ShutdownList_t **listp;
112 {
113 int rc;
114
115 chunklist = NULL;
116 chunk_hdr_free_list = NULL;
117 chunk_desc_free_list = NULL;
118 rc = rf_mutex_init(&chunkmutex);
119 if (rc) {
120 RF_ERRORMSG3("Unable to init mutex file %s line %d rc=%d\n", __FILE__,
121 __LINE__, rc);
122 }
123 rc = rf_ShutdownCreate(listp, rf_ShutdownMemChunk, NULL);
124 if (rc) {
125 RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n", __FILE__,
126 __LINE__, rc);
127 rf_mutex_destroy(&chunkmutex);
128 }
129 return (rc);
130 }
131
132
133
134
135
136 RF_ChunkDesc_t *
137 rf_NewMemChunk(size, buf)
138 int size;
139 char *buf;
140 {
141 RF_ChunkDesc_t *p;
142
143 if (chunk_desc_free_list) {
144 p = chunk_desc_free_list;
145 chunk_desc_free_list = p->next;
146 } else
147 RF_Malloc(p, sizeof(RF_ChunkDesc_t), (RF_ChunkDesc_t *));
148 p->size = size;
149 p->buf = buf;
150 p->next = NULL;
151 p->reuse_count = 0;
152 return (p);
153 }
154
155
156
157
158 RF_ChunkDesc_t *
159 rf_GetMemChunk(size)
160 int size;
161 {
162 RF_ChunkHdr_t *hdr = chunklist;
163 RF_ChunkDesc_t *p = NULL;
164 char *buf;
165
166 RF_LOCK_MUTEX(chunkmutex);
167 for (hdr = chunklist; hdr; hdr = hdr->next)
168 if (hdr->size >= size) {
169 p = hdr->list;
170 if (p) {
171 hdr->list = p->next;
172 p->next = NULL;
173 p->reuse_count++;
174 }
175 break;
176 }
177 if (!p) {
178 RF_Malloc(buf, size, (char *));
179 p = rf_NewMemChunk(size, buf);
180 }
181 RF_UNLOCK_MUTEX(chunkmutex);
182 (void) bzero(p->buf, size);
183 return (p);
184 }
185
186 void
187 rf_ReleaseMemChunk(chunk)
188 RF_ChunkDesc_t *chunk;
189 {
190 RF_ChunkHdr_t *hdr, *ht = NULL, *new;
191
192 RF_LOCK_MUTEX(chunkmutex);
193 for (hdr = chunklist; hdr && hdr->size < chunk->size; ht = hdr, hdr = hdr->next);
194 if (hdr && hdr->size == chunk->size) {
195 chunk->next = hdr->list;
196 hdr->list = chunk;
197 } else {
198 RF_Malloc(new, sizeof(RF_ChunkHdr_t), (RF_ChunkHdr_t *));
199 new->size = chunk->size;
200 new->list = chunk;
201 chunk->next = NULL;
202 if (ht) {
203 new->next = ht->next;
204 ht->next = new;
205 } else {
206 new->next = hdr;
207 chunklist = new;
208 }
209 }
210 RF_UNLOCK_MUTEX(chunkmutex);
211 }