]> mj.ucw.cz Git - libucw.git/blob - ucw/res-mem.c
Resources: Allow res_free(NULL) and res_detach(NULL)
[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/respool.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   ASSERT(r);
48   ((struct res_mem *) r) -> size = size;
49   if (ptr)
50     *ptr = r;
51   return p;
52 }
53
54 void *
55 res_malloc_zero(size_t size, struct resource **ptr)
56 {
57   void *p = res_malloc(size, ptr);
58   bzero(p, size);
59   return p;
60 }
61
62 void *
63 res_realloc(struct resource *r, size_t size)
64 {
65   struct res_mem *rm = (struct res_mem *) r;
66   r->priv = xrealloc(r->priv, size);
67   rm->size = size;
68   return r->priv;
69 }
70
71 #ifdef TEST
72
73 int main(void)
74 {
75   struct respool *rp = rp_new("test", NULL);
76   rp_switch(rp);
77   struct resource *r;
78   char *p = res_malloc(3, &r);
79   p[0] = p[1] = p[2] = 1;
80   rp_dump(rp, 0);
81   p = res_realloc(r, 5);
82   p[3] = p[4] = 2;
83   rp_dump(rp, 0);
84   rp_delete(rp);
85   return 0;
86 }
87
88 #endif