fw/comm/msgb: Really panic (i.e. lockup) if we run out of msgb
[osmocom-bb.git] / src / target / firmware / comm / msgb.c
index 8245ed2..fbf874a 100644 (file)
 #include <sys/types.h>
 
 #include <debug.h>
+#include <delay.h>
 
-#include <comm/msgb.h>
-
-#include <calypso/backlight.h>
+#include <osmocom/core/msgb.h>
 
 #define NO_TALLOC
 
@@ -35,19 +34,21 @@ void *tall_msgb_ctx;
 
 #ifdef NO_TALLOC
 /* This is a poor mans static allocator for msgb objects */
-#define MSGB_DATA_SIZE 256
-#define MSGB_NUM       16
+#define MSGB_DATA_SIZE 256+4
+#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;
+
        for (i = 0; i < ARRAY_SIZE(msgs); i++) {
                if (!msgs[i].allocated) {
                        msgs[i].allocated = 1;
@@ -58,77 +59,14 @@ static void *_talloc_zero(void *ctx, unsigned int size, const char *name)
        }
 
 panic:
-       while (1) {
-               bl_level(++i % 50);
-               delay_ms(50);
-       }
-       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) {
-               cons_puts("unable to allocate msgb\n");
-               return NULL;
-       }
-
-       msg->data_len = size;
-       msg->len = 0;
-       msg->data = msg->_data;
-
-       msg->head = msg->data;
-       msg->data = msg->data;
-       /* reset tail pointer */
-       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->len = 0;
-       msg->data = msg->_data;
-
-       msg->head = msg->data;
-       msg->data = msg->data;
-       /* reset tail pointer */
-       msg->tail = msg->data;
-
-       /* reset pointers */
-       msg->l2h = NULL;
-       msg->l3h = NULL;
-}