dect
/
libdect
Archived
13
0
Fork 0

utils: use single-linked list for struct dect_msg_buf queues

Get rid of libdect.h dependency on list.h.

Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
Patrick McHardy 2010-10-11 23:16:00 +02:00
parent 4dd834843f
commit 11779ea5e8
6 changed files with 41 additions and 22 deletions

View File

@ -5,7 +5,7 @@
void dect_audio_queue(struct dect_audio_handle *ah, struct dect_msg_buf *mb)
{
SDL_LockAudio();
list_add_tail(&mb->list, &ah->queue);
ptrlist_add_tail(mb, &ah->queue);
SDL_UnlockAudio();
}
@ -31,9 +31,9 @@ static void dect_audio_dequeue(void *data, uint8_t *stream, int len)
len /= 4;
while (1) {
if (list_empty(&ah->queue))
if (ah->queue == NULL)
goto underrun;
mb = list_first_entry(&ah->queue, struct dect_msg_buf, list);
mb = ah->queue;
copy = mb->len;
if (copy > len)
copy = len;
@ -41,7 +41,7 @@ static void dect_audio_dequeue(void *data, uint8_t *stream, int len)
dect_decode_g721(&ah->codec, (int16_t *)stream, mb->data, copy);
dect_mbuf_pull(mb, copy);
if (mb->len == 0) {
list_del(&mb->list);
ah->queue = mb->next;
free(mb);
}
@ -70,7 +70,7 @@ struct dect_audio_handle *dect_audio_open(void)
ah = malloc(sizeof(*ah));
if (ah == NULL)
goto err1;
init_list_head(&ah->queue);
ptrlist_init(&ah->queue);
g72x_init_state(&ah->codec);
spec.userdata = ah;

View File

@ -45,7 +45,7 @@ extern void pexit(const char *str);
struct dect_audio_handle {
struct g72x_state codec;
struct list_head queue;
struct dect_msg_buf *queue;
};
extern struct dect_audio_handle *dect_audio_open(void);

View File

@ -24,14 +24,13 @@ extern "C" {
#include <dect/ss.h>
#include <dect/clms.h>
#include <dect/debug.h>
#include <list.h>
struct dect_handle;
/**
* DECT message buffer
*
* @arg list Data link TX queue node
* @arg next Data link TX queue node
* @arg refcnt Reference count
* @arg type Message type
* @arg len Data length
@ -39,7 +38,7 @@ struct dect_handle;
* @arg head Storage area for on-stack buffers
*/
struct dect_msg_buf {
struct list_head list;
struct dect_msg_buf *next;
uint8_t refcnt;
uint8_t type;
uint8_t len;

View File

@ -191,7 +191,7 @@ struct dect_data_link {
struct dect_timer *page_timer;
uint8_t page_count;
uint8_t flags;
struct list_head msg_queue;
struct dect_msg_buf *msg_queue;
struct list_head transactions;
};

View File

@ -66,4 +66,26 @@ static inline unsigned int fls(uint64_t v)
return len;
}
#define ptrlist_init(head) \
do { \
*(head) = NULL; \
} while (0)
#define ptrlist_add_tail(new, head) \
do { \
typeof(new) *pprev; \
pprev = (head); \
while (*pprev != NULL) \
pprev = &(*pprev)->next; \
*pprev = new; \
} while (0)
#define ptrlist_dequeue_head(head) \
({ \
typeof(*head) elem = *(head); \
if (elem != NULL) \
*(head) = elem->next; \
elem; \
})
#endif /* _LIBDECT_UTILS_H */

View File

@ -89,6 +89,7 @@ struct dect_msg_buf *dect_mbuf_alloc(const struct dect_handle *dh)
mb->len = 0;
mb->type = 0;
mb->refcnt = 1;
mb->next = NULL;
return mb;
}
EXPORT_SYMBOL(dect_mbuf_alloc);
@ -319,7 +320,7 @@ static struct dect_data_link *dect_ddl_alloc(const struct dect_handle *dh)
ddl->state = DECT_DATA_LINK_RELEASED;
init_list_head(&ddl->list);
init_list_head(&ddl->transactions);
init_list_head(&ddl->msg_queue);
ptrlist_init(&ddl->msg_queue);
ddl_debug(ddl, "alloc");
return ddl;
@ -331,7 +332,7 @@ err1:
static void dect_ddl_destroy(struct dect_handle *dh, struct dect_data_link *ddl)
{
struct dect_msg_buf *mb, *next;
struct dect_msg_buf *mb;
unsigned int i;
ddl_debug(ddl, "destroy");
@ -343,7 +344,8 @@ static void dect_ddl_destroy(struct dect_handle *dh, struct dect_data_link *ddl)
}
list_del(&ddl->list);
list_for_each_entry_safe(mb, next, &ddl->msg_queue, list)
while ((mb = ptrlist_dequeue_head(&ddl->msg_queue)))
dect_mbuf_free(dh, mb);
if (ddl->dfd != NULL) {
@ -580,7 +582,7 @@ int dect_lce_send(const struct dect_handle *dh,
case DECT_DATA_LINK_ESTABLISHED:
return dect_ddl_send(dh, ddl, mb);
case DECT_DATA_LINK_ESTABLISH_PENDING:
list_add_tail(&mb->list, &ddl->msg_queue);
ptrlist_add_tail(mb, &ddl->msg_queue);
return 0;
default:
ddl_debug(ddl, "Invalid state: %u\n", ddl->state);
@ -696,7 +698,7 @@ static void dect_ddl_rcv_msg(struct dect_handle *dh, struct dect_data_link *ddl)
static void dect_ddl_complete_direct_establish(struct dect_handle *dh,
struct dect_data_link *ddl)
{
struct dect_msg_buf *mb, *mb_next;
struct dect_msg_buf *mb;
ddl->state = DECT_DATA_LINK_ESTABLISHED;
ddl_debug(ddl, "complete direct link establishment");
@ -706,10 +708,8 @@ static void dect_ddl_complete_direct_establish(struct dect_handle *dh,
return dect_ddl_shutdown(dh, ddl);
/* Send queued messages */
list_for_each_entry_safe(mb, mb_next, &ddl->msg_queue, list) {
list_del(&mb->list);
while ((mb = ptrlist_dequeue_head(&ddl->msg_queue)))
dect_ddl_send(dh, ddl, mb);
}
}
static void dect_ddl_complete_indirect_establish(struct dect_handle *dh,
@ -717,7 +717,7 @@ static void dect_ddl_complete_indirect_establish(struct dect_handle *dh,
struct dect_data_link *req)
{
struct dect_transaction *ta, *ta_next;
struct dect_msg_buf *mb, *mb_next;
struct dect_msg_buf *mb;
unsigned int i;
/* Stop page timer */
@ -740,10 +740,8 @@ static void dect_ddl_complete_indirect_establish(struct dect_handle *dh,
}
/* Send queued messages */
list_for_each_entry_safe(mb, mb_next, &req->msg_queue, list) {
list_del(&mb->list);
while ((mb = ptrlist_dequeue_head(&req->msg_queue)))
dect_ddl_send(dh, ddl, mb);
}
/* Release pending link */
dect_ddl_destroy(dh, req);