]> mj.ucw.cz Git - libucw.git/blob - ucw/res-mem.c
UCW::CGI: Announce supported methods correctly
[libucw.git] / ucw / res-mem.c
1 /*
2  *      The UCW Library -- Resources for Memory Blocks
3  *
4  *      (c) 2008 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #include <ucw/lib.h>
11 #include <ucw/resource.h>
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16
17 struct res_mem {
18   struct resource r;
19   size_t size;                  // Just for sake of readable resource dumps
20 };
21
22 static void
23 mem_res_free(struct resource *r)
24 {
25   xfree(r->priv);
26 }
27
28 static void
29 mem_res_dump(struct resource *r, uns indent UNUSED)
30 {
31   struct res_mem *rm = (struct res_mem *) r;
32   printf(" size=%zu, ptr=%p\n", rm->size, r->priv);
33 }
34
35 static const struct res_class mem_res_class = {
36   .name = "mem",
37   .dump = mem_res_dump,
38   .free = mem_res_free,
39   .res_size = sizeof(struct res_mem),
40 };
41
42 void *
43 res_malloc(size_t size, struct resource **ptr)
44 {
45   void *p = xmalloc(size);
46   struct resource *r = res_new(&mem_res_class, p);
47   ((struct res_mem *) r) -> size = size;
48   if (ptr)
49     *ptr = r;
50   return p;
51 }
52
53 void *
54 res_malloc_zero(size_t size, struct resource **ptr)
55 {
56   void *p = res_malloc(size, ptr);
57   bzero(p, size);
58   return p;
59 }
60
61 void *
62 res_realloc(struct resource *r, size_t size)
63 {
64   struct res_mem *rm = (struct res_mem *) r;
65   r->priv = xrealloc(r->priv, size);
66   rm->size = size;
67   return r->priv;
68 }
69
70 #ifdef TEST
71
72 int main(void)
73 {
74   struct respool *rp = rp_new("test", NULL);
75   rp_switch(rp);
76   struct resource *r;
77   char *p = res_malloc(3, &r);
78   p[0] = p[1] = p[2] = 1;
79   rp_dump(rp, 0);
80   p = res_realloc(r, 5);
81   p[3] = p[4] = 2;
82   rp_dump(rp, 0);
83   rp_delete(rp);
84   return 0;
85 }
86
87 #endif