104 lines
3.8 KiB
C
104 lines
3.8 KiB
C
|
/***************************************************************************
|
||
|
*
|
||
|
* Copyright 2015-2019 BES.
|
||
|
* All rights reserved. All unpublished rights reserved.
|
||
|
*
|
||
|
* No part of this work may be used or reproduced in any form or by any
|
||
|
* means, or stored in a database or retrieval system, without prior written
|
||
|
* permission of BES.
|
||
|
*
|
||
|
* Use of this work is governed by a license granted by BES.
|
||
|
* This work contains confidential and proprietary information of
|
||
|
* BES. which is protected by copyright, trade secret,
|
||
|
* trademark and other intellectual property rights.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
#ifndef __BT_CO_LIST_H__
|
||
|
#define __BT_CO_LIST_H__
|
||
|
|
||
|
#include "btlib_more.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#define ITER_WARN "list too much loop=%d!!!!"
|
||
|
|
||
|
#if !defined(ITER_ASSERT)
|
||
|
|
||
|
#if defined(ASSERT_SHOW_FILE_FUNC)
|
||
|
#define ITER_ASSERT(head) hal_trace_assert_dump(__FILE__, __FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
|
||
|
#elif defined(ASSERT_SHOW_FILE)
|
||
|
#define ITER_ASSERT(head) hal_trace_assert_dump(__FILE__, __FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
|
||
|
#elif defined(ASSERT_SHOW_FUNC)
|
||
|
#define ITER_ASSERT(head) hal_trace_assert_dump(__FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
|
||
|
#else
|
||
|
#define ITER_ASSERT(head) hal_trace_assert_dump(ITER_WARN, (head)->__iter__cnt)
|
||
|
#endif
|
||
|
|
||
|
#endif /* ITER_ASSERT */
|
||
|
|
||
|
#if 1
|
||
|
#define ITER_INIT(head) ,(head)->__iter__cnt = 0
|
||
|
#define ITER_CHK(head) ,((head)->__iter__cnt>100?ITER_ASSERT((head)):(void)((head)->__iter__cnt++))
|
||
|
#else
|
||
|
#define ITER_INIT(head)
|
||
|
#define ITER_CHK(head)
|
||
|
#endif
|
||
|
|
||
|
#ifndef OFFSETOF
|
||
|
#define OFFSETOF(type, member) ((unsigned int) &((type *)0)->member)
|
||
|
#endif
|
||
|
|
||
|
#ifndef CONTAINER_OF
|
||
|
#define CONTAINER_OF(ptr, type, member) ((type *)( (char *)ptr - OFFSETOF(type,member) ))
|
||
|
#endif
|
||
|
|
||
|
struct list_node {
|
||
|
struct list_node *next;
|
||
|
struct list_node *prev;
|
||
|
unsigned int __iter__cnt;
|
||
|
};
|
||
|
|
||
|
#define DEF_LIST_HEAD(head) \
|
||
|
struct list_node head = { &(head), &(head) }
|
||
|
|
||
|
#define INIT_LIST_HEAD(head) do { \
|
||
|
(head)->next = (head); (head)->prev = (head); \
|
||
|
} while (0)
|
||
|
|
||
|
void colist_addto_head(struct list_node *n, struct list_node *head);
|
||
|
void colist_addto_tail(struct list_node *n, struct list_node *head);
|
||
|
void colist_delete(struct list_node *entry);
|
||
|
void colist_moveto_head(struct list_node *list, struct list_node *head);
|
||
|
int colist_is_node_on_list(struct list_node *list, struct list_node *node);
|
||
|
struct list_node *colist_get_head(struct list_node *head);
|
||
|
int colist_is_list_empty(struct list_node *head);
|
||
|
|
||
|
#define colist_structure(ptr, type, member) \
|
||
|
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
|
||
|
#define colist_iterate(pos, head) \
|
||
|
for (pos = (head)->next ITER_INIT((head)); pos != (head); \
|
||
|
pos = pos->next ITER_CHK((head)))
|
||
|
#define colist_iterate_prev(pos, head) \
|
||
|
for (pos = (head)->prev ITER_INIT((head)); pos != (head); \
|
||
|
pos = pos->prev ITER_CHK((head))
|
||
|
#define colist_iterate_safe(pos, n, head) \
|
||
|
for (pos = (head)->next, n = pos->next ITER_INIT((head)); pos != (head); \
|
||
|
pos = n, n = pos->next ITER_CHK((head)))
|
||
|
#define colist_iterate_entry(pos, type, head, member) \
|
||
|
for (pos = colist_structure((head)->next, type, member) ITER_INIT((head)); \
|
||
|
&pos->member != (head); \
|
||
|
pos = colist_structure(pos->member.next, type, member) ITER_CHK((head)))
|
||
|
#define colist_iterate_entry_safe(pos, n, type, head, member) \
|
||
|
for (pos = colist_structure((head)->next, type, member), \
|
||
|
n = colist_structure(pos->member.next, type, member) ITER_INIT((head)); \
|
||
|
&pos->member != (head); \
|
||
|
pos = n, n = colist_structure(n->member.next, type, member) ITER_CHK((head)))
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __BT_CO_LIST_H__ */
|