blob: ead6ca03b9bfc4f7f063738ba43301f6795669f4 [file] [log] [blame]
Harald Welte8e7fca32017-05-07 16:14:33 +02001#include <stdint.h>
2
3#include "talloc.h"
4#include "trace.h"
5#include "osmocom/core/utils.h"
6
7#define NUM_RCTX_SMALL 10
8#define RCTX_SIZE_SMALL 348
9
10static uint8_t msgb_data[NUM_RCTX_SMALL][RCTX_SIZE_SMALL] __attribute__((aligned(sizeof(long))));
11static uint8_t msgb_inuse[NUM_RCTX_SMALL];
12
13void *_talloc_zero(const void *ctx, size_t size, const char *name)
14{
15 unsigned int i;
Harald Welte7b363062017-11-04 00:06:03 +010016 unsigned long x;
Harald Welte8e7fca32017-05-07 16:14:33 +020017
Harald Welte7b363062017-11-04 00:06:03 +010018 local_irq_save(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020019 if (size > RCTX_SIZE_SMALL) {
Harald Welte7b363062017-11-04 00:06:03 +010020 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020021 TRACE_ERROR("%s() request too large(%d > %d)\r\n", __func__, size, RCTX_SIZE_SMALL);
22 return NULL;
23 }
24
25 for (i = 0; i < ARRAY_SIZE(msgb_inuse); i++) {
26 if (!msgb_inuse[i]) {
27 uint8_t *out = msgb_data[i];
28 msgb_inuse[i] = 1;
29 memset(out, 0, size);
Harald Welte7b363062017-11-04 00:06:03 +010030 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020031 return out;
32 }
33 }
Harald Welte7b363062017-11-04 00:06:03 +010034 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020035 TRACE_ERROR("%s() out of memory!\r\n", __func__);
36 return NULL;
37}
38
39int _talloc_free(void *ptr, const char *location)
40{
41 unsigned int i;
Harald Welte7b363062017-11-04 00:06:03 +010042 unsigned long x;
43
44 local_irq_save(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020045 for (i = 0; i < ARRAY_SIZE(msgb_inuse); i++) {
46 if (ptr == msgb_data[i]) {
47 if (!msgb_inuse[i]) {
48 TRACE_ERROR("%s: double_free by \r\n", __func__, location);
49 } else {
50 msgb_inuse[i] = 0;
51 }
Harald Welte7b363062017-11-04 00:06:03 +010052 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020053 return 0;
54 }
55 }
56
Harald Welte7b363062017-11-04 00:06:03 +010057 local_irq_restore(x);
Harald Welte8e7fca32017-05-07 16:14:33 +020058 TRACE_ERROR("%s: invalid pointer %p from %s\r\n", __func__, ptr, location);
59 return -1;
60}
61
62void talloc_set_name_const(const void *ptr, const char *name)
63{
64 /* do nothing */
65}
66
67#if 0
68void *talloc_named_const(const void *context, size_t size, const char *name)
69{
70 if (size)
71 TRACE_ERROR("%s: called with size!=0 from %s\r\n", __func__, name);
72 return NULL;
73}
74
75void *talloc_pool(const void *context, size_t size)
76{
77}
78#endif
79