Workshop o mikrokontrolérech na SKSP 2024.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
1.6 KiB

2 months ago
/*
* The UCW Library -- Resources for Memory Blocks
*
* (c) 2008 Martin Mares <mj@ucw.cz>
*
* This software may be freely distributed and used according to the terms
* of the GNU Lesser General Public License.
*/
#include <ucw/lib.h>
#include <ucw/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct res_mem {
struct resource r;
size_t size; // Just for sake of readable resource dumps
};
static void
mem_res_free(struct resource *r)
{
xfree(r->priv);
}
static void
mem_res_dump(struct resource *r, uint indent UNUSED)
{
struct res_mem *rm = (struct res_mem *) r;
printf(" size=%zu, ptr=%p\n", rm->size, r->priv);
}
static const struct res_class mem_res_class = {
.name = "mem",
.dump = mem_res_dump,
.free = mem_res_free,
.res_size = sizeof(struct res_mem),
};
void *
res_malloc(size_t size, struct resource **ptr)
{
void *p = xmalloc(size);
struct resource *r = res_new(&mem_res_class, p);
((struct res_mem *) r) -> size = size;
if (ptr)
*ptr = r;
return p;
}
void *
res_malloc_zero(size_t size, struct resource **ptr)
{
void *p = res_malloc(size, ptr);
bzero(p, size);
return p;
}
void *
res_realloc(struct resource *r, size_t size)
{
struct res_mem *rm = (struct res_mem *) r;
r->priv = xrealloc(r->priv, size);
rm->size = size;
return r->priv;
}
#ifdef TEST
int main(void)
{
struct respool *rp = rp_new("test", NULL);
rp_switch(rp);
struct resource *r;
char *p = res_malloc(3, &r);
p[0] = p[1] = p[2] = 1;
rp_dump(rp, 0);
p = res_realloc(r, 5);
p[3] = p[4] = 2;
rp_dump(rp, 0);
rp_delete(rp);
return 0;
}
#endif