comparison src/core/ngx_alloc.c @ 0:4eff17414a43

nginx-0.0.1-2002-08-06-20:39:45 import The first code that uses "ngx_" prefix, the previous one used "gx_" prefix. At that point the code is not yet usable. The first draft ideas are dated back to 23.10.2001.
author Igor Sysoev <igor@sysoev.ru>
date Tue, 06 Aug 2002 16:39:45 +0000
parents
children c5f071d376e5
comparison
equal deleted inserted replaced
-1:000000000000 0:4eff17414a43
1
2 #include <ngx_config.h>
3
4 #include <ngx_errno.h>
5 #include <ngx_log.h>
6 #include <ngx_alloc.h>
7
8
9 void *ngx_alloc(size_t size, ngx_log_t *log)
10 {
11 void *p;
12
13 p = malloc(size);
14 if (p == NULL)
15 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
16 "ngx_alloc: malloc %d bytes failed", size);
17 return p;
18 }
19
20 void *ngx_calloc(size_t size, ngx_log_t *log)
21 {
22 void *p;
23
24 p = ngx_alloc(size, log);
25 if (p)
26 ngx_memzero(p, size);
27
28 return p;
29 }
30
31 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
32 {
33 ngx_pool_t *p;
34
35 ngx_test_null(p, ngx_alloc(size, log), NULL);
36
37 p->last = (char *) p + sizeof(ngx_pool_t);
38 p->end = (char *) p + size;
39 p->next = NULL;
40 p->large = NULL;
41 p->log = log;
42
43 return p;
44 }
45
46 void ngx_destroy_pool(ngx_pool_t *pool)
47 {
48 ngx_pool_t *p, *n;
49 ngx_pool_large_t *l;
50
51 for (l = pool->large; l; l = l->next)
52 free(l->alloc);
53
54 for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
55 free(p);
56
57 if (n == NULL)
58 break;
59 }
60 }
61
62 void *ngx_palloc(ngx_pool_t *pool, size_t size)
63 {
64 void *m;
65 ngx_pool_t *p, *n;
66 ngx_pool_large_t *large, *last;
67
68 if (size <= NGX_MAX_ALLOC_FROM_POOL) {
69
70 for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
71 if ((size_t) (p->end - p->last) >= size) {
72 m = p->last;
73 p->last += size;
74
75 return m;
76 }
77
78 if (n == NULL)
79 break;
80 }
81
82 /* alloc new pool block */
83 ngx_test_null(n, ngx_create_pool(p->end - (char *) p, p->log), NULL);
84 p->next = n;
85 m = n->last;
86 n->last += size;
87 return m;
88
89 /* alloc large block */
90 } else {
91 large = NULL;
92 last = NULL;
93
94 if (pool->large) {
95 for (last = pool->large; /* void */; last = last->next) {
96 if (last->alloc == NULL) {
97 large = last;
98 last = NULL;
99 break;
100 }
101
102 if (last->next == NULL)
103 break;
104 }
105 }
106
107 if (large == NULL) {
108 ngx_test_null(large, ngx_palloc(pool, sizeof(ngx_pool_large_t)),
109 NULL);
110 }
111
112 ngx_test_null(p, ngx_alloc(size, pool->log), NULL);
113
114 if (pool->large == NULL) {
115 pool->large = large;
116
117 } else if (last) {
118 last->next = large;
119 }
120
121 large->alloc = p;
122
123 return p;
124 }
125 }
126
127 void *ngx_pcalloc(ngx_pool_t *pool, size_t size)
128 {
129 void *p;
130
131 p = ngx_palloc(pool, size);
132 if (p)
133 ngx_memzero(p, size);
134
135 return p;
136 }