#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
#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;
}
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;
-}