Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
duk_alloc_hybrid.c File Reference
#include "duktape.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

Go to the source code of this file.

Data Structures

struct  pool_size_spec
 
struct  pool_free_entry
 
struct  pool_header
 
struct  pool_state
 

Macros

#define NUM_POOLS   (sizeof(pool_sizes) / sizeof(pool_size_spec))
 
#define ADDR_IN_STATE_ALLOC(st, p)    ((char *) (p) >= (st)->alloc_start && (char *) (p) < (st)->alloc_end)
 
#define ADDR_IN_HEADER_ALLOC(hdr, p)    ((char *) (p) >= (hdr)->alloc_start && (char *) (p) < (hdr)->alloc_end)
 

Typedefs

typedef struct pool_free_entry pool_free_entry
 

Functions

static void dump_pool_state (pool_state *st)
 
void * duk_alloc_hybrid_init (void)
 
void * duk_alloc_hybrid (void *udata, duk_size_t size)
 
void * duk_realloc_hybrid (void *udata, void *ptr, duk_size_t size)
 
void duk_free_hybrid (void *udata, void *ptr)
 

Variables

static pool_size_spec pool_sizes []
 

Macro Definition Documentation

◆ ADDR_IN_HEADER_ALLOC

#define ADDR_IN_HEADER_ALLOC ( hdr,
p )    ((char *) (p) >= (hdr)->alloc_start && (char *) (p) < (hdr)->alloc_end)

Definition at line 60 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

60#define ADDR_IN_HEADER_ALLOC(hdr,p) \
61 ((char *) (p) >= (hdr)->alloc_start && (char *) (p) < (hdr)->alloc_end)

Referenced by duk_free_hybrid(), and duk_realloc_hybrid().

◆ ADDR_IN_STATE_ALLOC

#define ADDR_IN_STATE_ALLOC ( st,
p )    ((char *) (p) >= (st)->alloc_start && (char *) (p) < (st)->alloc_end)

Definition at line 58 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

58#define ADDR_IN_STATE_ALLOC(st,p) \
59 ((char *) (p) >= (st)->alloc_start && (char *) (p) < (st)->alloc_end)

Referenced by duk_free_hybrid(), and duk_realloc_hybrid().

◆ NUM_POOLS

Typedef Documentation

◆ pool_free_entry

typedef struct pool_free_entry pool_free_entry

Function Documentation

◆ duk_alloc_hybrid()

void * duk_alloc_hybrid ( void * udata,
duk_size_t size )

Definition at line 151 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

151 {
152 pool_state *st = (pool_state *) udata;
153 int i;
154 void *new_ptr;
155
156#if 0
157 dump_pool_state(st);
158#endif
159
160 if (size == 0) {
161 return NULL;
162 }
163 if (size > st->pool_max_size) {
164#ifdef DUK_ALLOC_HYBRID_DEBUG
165 printf("alloc fallback: %ld\n", (long) size);
166#endif
167 return malloc(size);
168 }
169
170 for (i = 0; i < (int) NUM_POOLS; i++) {
171 pool_header *hdr = st->headers + i;
172 if (hdr->size < size) {
173 continue;
174 }
175
176 if (hdr->free) {
177#if 0
178 printf("alloc from pool: %ld -> pool size %ld\n", (long) size, (long) hdr->size);
179#endif
180 new_ptr = (void *) hdr->free;
181 hdr->free = hdr->free->next;
182 return new_ptr;
183 } else {
184#ifdef DUK_ALLOC_HYBRID_DEBUG
185 printf("alloc out of pool entries: %ld -> pool size %ld\n", (long) size, (long) hdr->size);
186#endif
187 break;
188 }
189 }
190
191#ifdef DUK_ALLOC_HYBRID_DEBUG
192 printf("alloc fallback (out of pool): %ld\n", (long) size);
193#endif
194 return malloc(size);
195}
#define malloc
Definition civetweb.c:1539
static void dump_pool_state(pool_state *st)
#define NULL
Definition gmacros.h:924
pool_free_entry * next
#define printf

References dump_pool_state(), pool_header::free, pool_state::headers, malloc, pool_free_entry::next, NULL, NUM_POOLS, pool_state::pool_max_size, printf, and pool_header::size.

Referenced by create_duktape_heap(), create_duktape_heap(), and duk_realloc_hybrid().

◆ duk_alloc_hybrid_init()

void * duk_alloc_hybrid_init ( void )

Definition at line 89 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

89 {
90 pool_state *st;
91 size_t total_size, max_size;
92 int i, j;
93 char *p;
94
95 st = (pool_state *) malloc(sizeof(pool_state));
96 if (!st) {
97 return NULL;
98 }
99 memset((void *) st, 0, sizeof(pool_state));
100 st->alloc_start = NULL;
101 st->alloc_end = NULL;
102
103 for (i = 0, total_size = 0, max_size = 0; i < (int) NUM_POOLS; i++) {
104#ifdef DUK_ALLOC_HYBRID_DEBUG
105 printf("Pool %d: size %ld, count %ld\n", i, (long) pool_sizes[i].size, (long) pool_sizes[i].count);
106#endif
107 total_size += pool_sizes[i].size * pool_sizes[i].count;
108 if (pool_sizes[i].size > max_size) {
109 max_size = pool_sizes[i].size;
110 }
111 }
112#ifdef DUK_ALLOC_HYBRID_DEBUG
113 printf("Total size %ld, max pool size %ld\n", (long) total_size, (long) max_size);
114#endif
115
116 st->alloc_start = (char *) malloc(total_size);
117 if (!st->alloc_start) {
118 free(st);
119 return NULL;
120 }
121 st->alloc_end = st->alloc_start + total_size;
122 st->pool_max_size = max_size;
123 memset((void *) st->alloc_start, 0, total_size);
124
125 for (i = 0, p = st->alloc_start; i < (int) NUM_POOLS; i++) {
126 pool_header *hdr = st->headers + i;
127
128 hdr->alloc_start = p;
129 hdr->alloc_end = p + pool_sizes[i].size * pool_sizes[i].count;
130 hdr->free = (pool_free_entry *) (void *) p;
131 hdr->size = pool_sizes[i].size;
132 hdr->count = pool_sizes[i].count;
133
134 for (j = 0; j < pool_sizes[i].count; j++) {
135 pool_free_entry *ent = (pool_free_entry *) (void *) p;
136 if (j == pool_sizes[i].count - 1) {
137 ent->next = (pool_free_entry *) NULL;
138 } else {
139 ent->next = (pool_free_entry *) (void *) (p + pool_sizes[i].size);
140 }
141 p += pool_sizes[i].size;
142 }
143 }
144
145 dump_pool_state(st);
146
147 /* Use 'st' as udata. */
148 return (void *) st;
149}
#define free
Definition civetweb.c:1542
static pool_size_spec pool_sizes[]

References pool_header::alloc_end, pool_state::alloc_end, pool_header::alloc_start, pool_state::alloc_start, pool_size_spec::count, pool_header::count, dump_pool_state(), free, pool_header::free, pool_state::headers, malloc, pool_free_entry::next, NULL, NUM_POOLS, pool_state::pool_max_size, pool_sizes, printf, pool_size_spec::size, and pool_header::size.

Referenced by create_duktape_heap(), and create_duktape_heap().

◆ duk_free_hybrid()

void duk_free_hybrid ( void * udata,
void * ptr )

Definition at line 259 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

259 {
260 pool_state *st = (pool_state *) udata;
261 int i;
262
263#if 0
264 dump_pool_state(st);
265#endif
266
267 if (!ADDR_IN_STATE_ALLOC(st, ptr)) {
268 if (ptr == NULL) {
269 return;
270 }
271#if 0
272 printf("free out of pool: %p\n", (void *) ptr);
273#endif
274 free(ptr);
275 return;
276 }
277
278 for (i = 0; i < (int) NUM_POOLS; i++) {
279 pool_header *hdr = st->headers + i;
280 if (ADDR_IN_HEADER_ALLOC(hdr, ptr)) {
281 ((pool_free_entry *) ptr)->next = hdr->free;
282 hdr->free = (pool_free_entry *) ptr;
283#if 0
284 printf("free from pool: %p\n", ptr);
285#endif
286 return;
287 }
288 }
289
290#ifdef DUK_ALLOC_HYBRID_DEBUG
291 printf("NEVER HERE\n");
292#endif
293}

References ADDR_IN_HEADER_ALLOC, ADDR_IN_STATE_ALLOC, dump_pool_state(), free, pool_header::free, pool_state::headers, NULL, NUM_POOLS, and printf.

Referenced by create_duktape_heap(), and create_duktape_heap().

◆ duk_realloc_hybrid()

void * duk_realloc_hybrid ( void * udata,
void * ptr,
duk_size_t size )

Definition at line 197 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

197 {
198 pool_state *st = (pool_state *) udata;
199 void *new_ptr;
200 int i;
201
202#if 0
203 dump_pool_state(st);
204#endif
205
206 if (ADDR_IN_STATE_ALLOC(st, ptr)) {
207 /* 'ptr' cannot be NULL. */
208 for (i = 0; i < (int) NUM_POOLS; i++) {
209 pool_header *hdr = st->headers + i;
210 if (ADDR_IN_HEADER_ALLOC(hdr, ptr)) {
211 if (size <= hdr->size) {
212 /* Still fits, no shrink support. */
213#if 0
214 printf("realloc original from pool: still fits, size %ld, pool size %ld\n",
215 (long) size, (long) hdr->size);
216#endif
217 return ptr;
218 }
219
220 new_ptr = duk_alloc_hybrid(udata, size);
221 if (!new_ptr) {
222#ifdef DUK_ALLOC_HYBRID_DEBUG
223 printf("realloc original from pool: needed larger size, failed to alloc\n");
224#endif
225 return NULL;
226 }
227 memcpy(new_ptr, ptr, hdr->size);
228
229 ((pool_free_entry *) ptr)->next = hdr->free;
230 hdr->free = (pool_free_entry *) ptr;
231#if 0
232 printf("realloc original from pool: size %ld, pool size %ld\n", (long) size, (long) hdr->size);
233#endif
234 return new_ptr;
235 }
236 }
237#ifdef DUK_ALLOC_HYBRID_DEBUG
238 printf("NEVER HERE\n");
239#endif
240 return NULL;
241 } else if (ptr != NULL) {
242 if (size == 0) {
243 free(ptr);
244 return NULL;
245 } else {
246#ifdef DUK_ALLOC_HYBRID_DEBUG
247 printf("realloc fallback: size %ld\n", (long) size);
248#endif
249 return realloc(ptr, size);
250 }
251 } else {
252#if 0
253 printf("realloc NULL ptr, call alloc: %ld\n", (long) size);
254#endif
255 return duk_alloc_hybrid(udata, size);
256 }
257}
#define realloc
Definition civetweb.c:1541
void * duk_alloc_hybrid(void *udata, duk_size_t size)

References ADDR_IN_HEADER_ALLOC, ADDR_IN_STATE_ALLOC, duk_alloc_hybrid(), dump_pool_state(), free, pool_header::free, pool_state::headers, NULL, NUM_POOLS, printf, realloc, and pool_header::size.

Referenced by create_duktape_heap(), and create_duktape_heap().

◆ dump_pool_state()

static void dump_pool_state ( pool_state * st)
static

Variable Documentation

◆ pool_sizes

pool_size_spec pool_sizes[]
static
Initial value:
= {
{ 32, 1024 },
{ 48, 2048 },
{ 64, 2048 },
{ 128, 2048 },
{ 256, 512 },
{ 1024, 64 },
{ 2048, 32 }
}

Definition at line 24 of file duktape-1.5.2/examples/alloc-hybrid/duk_alloc_hybrid.c.

24 {
25 { 32, 1024 },
26 { 48, 2048 },
27 { 64, 2048 },
28 { 128, 2048 },
29 { 256, 512 },
30 { 1024, 64 },
31 { 2048, 32 }
32};

Referenced by duk_alloc_hybrid_init().