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:
parent
4dd834843f
commit
11779ea5e8
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
22
src/lce.c
22
src/lce.c
|
@ -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);
|
||||
|
|
Reference in New Issue