blob: c9722ba2bac6f53fa9ab6e23587b87b2522f5120 [file] [log] [blame]
Harald Welte8e7fca32017-05-07 16:14:33 +02001#include <stdint.h>
2
3#include "talloc.h"
4#include "trace.h"
Harald Welteba2ad562017-11-28 19:49:41 +01005#include "utils.h"
Harald Welte9d90d282018-06-29 22:25:42 +02006#include <osmocom/core/utils.h>
Harald Welte8e7fca32017-05-07 16:14:33 +02007
8#define NUM_RCTX_SMALL 10
9#define RCTX_SIZE_SMALL 348
10
11static uint8_t msgb_data[NUM_RCTX_SMALL][RCTX_SIZE_SMALL] __attribute__((aligned(sizeof(long))));
12static uint8_t msgb_inuse[NUM_RCTX_SMALL];
13
14void *_talloc_zero(const void *ctx, size_t size, const char *name)
15{
16 unsigned int i;
Harald Welte7b363062017-11-04 00:06:03 +010017 unsigned long x;
Harald Welte8e7fca32017-05-07 16:14:33 +020018
Harald Welte7b363062017-11-04 00:06:03 +010019 local_irq_save(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020020 if (size > RCTX_SIZE_SMALL) {
Harald Welte7b363062017-11-04 00:06:03 +010021 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020022 TRACE_ERROR("%s() request too large(%d > %d)\r\n", __func__, size, RCTX_SIZE_SMALL);
23 return NULL;
24 }
25
26 for (i = 0; i < ARRAY_SIZE(msgb_inuse); i++) {
27 if (!msgb_inuse[i]) {
28 uint8_t *out = msgb_data[i];
29 msgb_inuse[i] = 1;
30 memset(out, 0, size);
Harald Welte7b363062017-11-04 00:06:03 +010031 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020032 return out;
33 }
34 }
Harald Welte7b363062017-11-04 00:06:03 +010035 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020036 TRACE_ERROR("%s() out of memory!\r\n", __func__);
37 return NULL;
38}
39
40int _talloc_free(void *ptr, const char *location)
41{
42 unsigned int i;
Harald Welte7b363062017-11-04 00:06:03 +010043 unsigned long x;
44
45 local_irq_save(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020046 for (i = 0; i < ARRAY_SIZE(msgb_inuse); i++) {
47 if (ptr == msgb_data[i]) {
48 if (!msgb_inuse[i]) {
49 TRACE_ERROR("%s: double_free by \r\n", __func__, location);
50 } else {
51 msgb_inuse[i] = 0;
52 }
Harald Welte7b363062017-11-04 00:06:03 +010053 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020054 return 0;
55 }
56 }
57
Harald Welte7b363062017-11-04 00:06:03 +010058 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020059 TRACE_ERROR("%s: invalid pointer %p from %s\r\n", __func__, ptr, location);
60 return -1;
61}
62
63void talloc_set_name_const(const void *ptr, const char *name)
64{
65 /* do nothing */
66}
67
68#if 0
69void *talloc_named_const(const void *context, size_t size, const char *name)
70{
71 if (size)
72 TRACE_ERROR("%s: called with size!=0 from %s\r\n", __func__, name);
73 return NULL;
74}
75
76void *talloc_pool(const void *context, size_t size)
77{
78}
79#endif
80