X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Ftarget%2Ffirmware%2Fcomm%2Fmsgb.c;h=fbf874a2ca9b8f1eff74f4cd5e6e1b79c6132d96;hb=fc16cbb578c7dcacf9d6dfc45625b4233570b659;hp=499060c30947e6dd3eb7fbe002e1e5b214c251ae;hpb=8c353991ed4b28b6cd9351c068a9aba1290dbd05;p=osmocom-bb.git diff --git a/src/target/firmware/comm/msgb.c b/src/target/firmware/comm/msgb.c index 499060c..fbf874a 100644 --- a/src/target/firmware/comm/msgb.c +++ b/src/target/firmware/comm/msgb.c @@ -24,10 +24,9 @@ #include #include +#include -#include - -#include +#include #define NO_TALLOC @@ -36,93 +35,38 @@ void *tall_msgb_ctx; #ifdef NO_TALLOC /* This is a poor mans static allocator for msgb objects */ #define MSGB_DATA_SIZE 256+4 -#define MSGB_NUM 16 +#define MSGB_NUM 32 struct supermsg { uint8_t allocated; struct msgb msg; uint8_t buf[MSGB_DATA_SIZE]; }; static struct supermsg msgs[MSGB_NUM]; -static void *_talloc_zero(void *ctx, unsigned int size, const char *name) +void *_talloc_zero(void *ctx, unsigned int size, const char *name) { unsigned int i; + if (size > sizeof(struct msgb) + MSGB_DATA_SIZE) goto panic; - while (1) { - for (i = 0; i < ARRAY_SIZE(msgs); i++) { - if (!msgs[i].allocated) { - msgs[i].allocated = 1; - memset(&msgs[i].msg, 0, sizeof(&msgs[i].msg)); - memset(&msgs[i].buf, 0, sizeof(&msgs[i].buf)); - return &msgs[i].msg; - } + for (i = 0; i < ARRAY_SIZE(msgs); i++) { + if (!msgs[i].allocated) { + msgs[i].allocated = 1; + memset(&msgs[i].msg, 0, sizeof(&msgs[i].msg)); + memset(&msgs[i].buf, 0, sizeof(&msgs[i].buf)); + return &msgs[i].msg; } - cons_puts("unable to allocate msgb\n"); - bl_level(++i % 50); - delay_ms(50); } + panic: - return NULL; + cons_puts("unable to allocate msgb\n"); + while (1); + + return NULL; /* not reached */ } -static void talloc_free(void *msg) +void talloc_free(void *msg) { struct supermsg *smsg = container_of(msg, struct supermsg, msg); smsg->allocated = 0; } #endif - -struct msgb *msgb_alloc(uint16_t size, const char *name) -{ - struct msgb *msg; - - msg = _talloc_zero(tall_msgb_ctx, sizeof(*msg) + size, name); - - if (!msg) { - return NULL; - } - - msg->data_len = size; - msg->len = 0; - - msg->data = msg->_data; - msg->head = msg->_data; - msg->tail = msg->_data; - - return msg; -} - -void msgb_free(struct msgb *m) -{ - talloc_free(m); -} - -void msgb_enqueue(struct llist_head *queue, struct msgb *msg) -{ - llist_add_tail(&msg->list, queue); -} - -struct msgb *msgb_dequeue(struct llist_head *queue) -{ - struct llist_head *lh; - - if (llist_empty(queue)) - return NULL; - - lh = queue->next; - llist_del(lh); - - return llist_entry(lh, struct msgb, list); -} - -void msgb_reset(struct msgb *msg) -{ - msg->len = 0; - - msg->data = msg->_data; - msg->head = msg->_data; - msg->tail = msg->_data; - - msg->l2h = NULL; - msg->l3h = NULL; -}