[Beignet] [PATCH 1/9] Add list operation to utils.

2016-09-21 Thread junyan . he
From: Junyan He 

We need to add and delete CL objects into container frequently,
so add the list operation to ease this.

V2:
  Init the list head after spliced.

Signed-off-by: Junyan He 
---
 src/cl_utils.h | 93 +-
 1 file changed, 92 insertions(+), 1 deletion(-)

diff --git a/src/cl_utils.h b/src/cl_utils.h
index dc7a3d6..4af727e 100644
--- a/src/cl_utils.h
+++ b/src/cl_utils.h
@@ -358,5 +358,96 @@ static INLINE int atomic_read(atomic_t *v) {
 static INLINE int atomic_inc(atomic_t *v) { return atomic_add(v, 1); }
 static INLINE int atomic_dec(atomic_t *v) { return atomic_add(v, -1); }
 
-#endif /* __CL_UTILS_H__ */
+/* The list. */
+typedef struct list_head {
+  struct list_head *next, *prev;
+} list_head;
+
+static inline void list_init(struct list_head *head)
+{
+  head->next = head->prev = head;
+}
+static inline void list_add(struct list_head *the_new,
+struct list_head *prev, struct list_head *next)
+{
+  next->prev = the_new;
+  the_new->next = next;
+  the_new->prev = prev;
+  prev->next = the_new;
+}
+static inline void list_add_tail(struct list_head *the_new, struct list_head 
*head)
+{
+  list_add(the_new, head->prev, head);
+}
+static inline void list_del(struct list_head *node)
+{
+  node->next->prev = node->prev;
+  node->prev->next = node->next;
+  node->prev = node->next = node;
+}
+static inline void list_replace(struct list_head *the_old, struct list_head 
*the_new)
+{
+  the_new->next = the_old->next;
+  the_new->next->prev = the_new;
+  the_new->prev = the_old->prev;
+  the_new->prev->next = the_new;
+}
+static inline int list_empty(const struct list_head *head)
+{
+  return head->next == head;
+}
+static inline int list_is_last(const struct list_head *list, const struct 
list_head *head)
+{
+  return list->next == head;
+}
+static inline void __list_splice(struct list_head *list,
+ struct list_head *prev, struct list_head 
*next)
+{
+  struct list_head *first = list->next;
+  struct list_head *last = list->prev;
 
+  first->prev = prev;
+  prev->next = first;
+
+  last->next = next;
+  next->prev = last;
+
+  list_init(list);
+}
+/**
+ * list_splice - join two lists
+ */
+static inline void list_splice(struct list_head *list, struct list_head *head)
+{
+  if (!list_empty(list))
+__list_splice(list, head, head->next);
+}
+
+/**
+ * list_splice_tail - join two lists, each list being a queue
+ */
+static inline void list_splice_tail(struct list_head *list, struct list_head 
*head)
+{
+  if (!list_empty(list))
+__list_splice(list, head->prev, head);
+}
+
+#undef offsetof
+#ifdef __compiler_offsetof
+#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
+#else
+#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER)
+#endif
+#define container_of(ptr, type, member) ({  \
+  const typeof( ((type *)0)->member ) *__mptr = (ptr);  \
+  (type *)( (char *)__mptr - offsetof(type,member) ); })
+#define list_entry(ptr, type, member) container_of(ptr, type, member)
+
+#define list_for_each(pos, head) \
+  for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define list_for_each_safe(pos, n, head) \
+  for (pos = (head)->next, n = pos->next; pos != (head); \
+   pos = n, n = pos->next)
+
+#endif /* __CL_UTILS_H__ */
-- 
2.7.4



___
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet


Re: [Beignet] [PATCH 1/9] Add list operation to utils.

2016-09-06 Thread Yang, Rong R
One comment.

> -Original Message-
> From: Beignet [mailto:beignet-boun...@lists.freedesktop.org] On Behalf Of
> junyan...@inbox.com
> Sent: Tuesday, August 2, 2016 19:39
> To: beignet@lists.freedesktop.org
> Subject: [Beignet] [PATCH 1/9] Add list operation to utils.
> 
> From: Junyan He 
> 
> We need to add and delete CL objects into container frequently, so add the
> list operation to ease this.
> 
> Signed-off-by: Junyan He 
> ---
>  src/cl_utils.h | 91
> +-
>  1 file changed, 90 insertions(+), 1 deletion(-)
> 
> diff --git a/src/cl_utils.h b/src/cl_utils.h index 77b9bd8..24a71cd 100644
> --- a/src/cl_utils.h
> +++ b/src/cl_utils.h
> @@ -355,5 +355,94 @@ static INLINE int atomic_add(atomic_t *v, const int c)
> {  static INLINE int atomic_inc(atomic_t *v) { return atomic_add(v, 1); }  
> static
> INLINE int atomic_dec(atomic_t *v) { return atomic_add(v, -1); }
> 
> -#endif /* __CL_UTILS_H__ */
> +/* The list. */
> +typedef struct list_head {
> +  struct list_head *next, *prev;
> +} list_head;
> +
> +static inline void list_init(struct list_head *head) {
> +  head->next = head->prev = head;
> +}
> +static inline void list_add(struct list_head *the_new,
> +struct list_head *prev, struct list_head
> +*next) {
> +  next->prev = the_new;
> +  the_new->next = next;
> +  the_new->prev = prev;
> +  prev->next = the_new;
> +}
> +static inline void list_add_tail(struct list_head *the_new, struct
> +list_head *head) {
> +  list_add(the_new, head->prev, head);
> +}
> +static inline void list_del(struct list_head *node) {
> +  node->next->prev = node->prev;
> +  node->prev->next = node->next;
> +  node->prev = node->next = node;
> +}
> +static inline void list_replace(struct list_head *the_old, struct
> +list_head *the_new) {
> +  the_new->next = the_old->next;
> +  the_new->next->prev = the_new;
> +  the_new->prev = the_old->prev;
> +  the_new->prev->next = the_new;
> +}
> +static inline int list_empty(const struct list_head *head) {
> +  return head->next == head;
> +}
> +static inline int list_is_last(const struct list_head *list, const
> +struct list_head *head) {
> +  return list->next == head;
> +}
> +static inline void __list_splice(const struct list_head *list,
> + struct list_head *prev, struct
> +list_head *next) {
> +  struct list_head *first = list->next;
> +  struct list_head *last = list->prev;

Is this function correct? list->next is not changed, but list->next->prev is 
changed, so list->next->prev != list, seem not double link list.

> 
> +  first->prev = prev;
> +  prev->next = first;
> +
> +  last->next = next;
> +  next->prev = last;
> +}
> +/**
> + * list_splice - join two lists
> + */
> +static inline void list_splice(const struct list_head *list, struct
> +list_head *head) {
> +  if (!list_empty(list))
> +__list_splice(list, head, head->next); }
> +
> +/**
> + * list_splice_tail - join two lists, each list being a queue  */
> +static inline void list_splice_tail(struct list_head *list, struct
> +list_head *head) {
> +  if (!list_empty(list))
> +__list_splice(list, head->prev, head); }
> +
> +#undef offsetof
> +#ifdef __compiler_offsetof
> +#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
> #else
> +#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER) #endif
> +#define container_of(ptr, type, member) ({  \
> +  const typeof( ((type *)0)->member ) *__mptr = (ptr);  \
> +  (type *)( (char *)__mptr - offsetof(type,member) ); }) #define
> +list_entry(ptr, type, member) container_of(ptr, type, member)
> +
> +#define list_for_each(pos, head) \
> +  for (pos = (head)->next; pos != (head); pos = pos->next)
> +
> +#define list_for_each_safe(pos, n, head) \
> +  for (pos = (head)->next, n = pos->next; pos != (head); \
> +   pos = n, n = pos->next)
> +
> +#endif /* __CL_UTILS_H__ */
> --
> 2.7.4
> 
> __
> __
> FREE 3D EARTH SCREENSAVER - Watch the Earth right on your desktop!
> Check it out at http://www.inbox.com/earth
> 
> 
> ___
> Beignet mailing list
> Beignet@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet
___
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet


[Beignet] [PATCH 1/9] Add list operation to utils.

2016-08-02 Thread junyan . he
From: Junyan He 

We need to add and delete CL objects into container frequently,
so add the list operation to ease this.

Signed-off-by: Junyan He 
---
 src/cl_utils.h | 91 +-
 1 file changed, 90 insertions(+), 1 deletion(-)

diff --git a/src/cl_utils.h b/src/cl_utils.h
index 77b9bd8..24a71cd 100644
--- a/src/cl_utils.h
+++ b/src/cl_utils.h
@@ -355,5 +355,94 @@ static INLINE int atomic_add(atomic_t *v, const int c) {
 static INLINE int atomic_inc(atomic_t *v) { return atomic_add(v, 1); }
 static INLINE int atomic_dec(atomic_t *v) { return atomic_add(v, -1); }
 
-#endif /* __CL_UTILS_H__ */
+/* The list. */
+typedef struct list_head {
+  struct list_head *next, *prev;
+} list_head;
+
+static inline void list_init(struct list_head *head)
+{
+  head->next = head->prev = head;
+}
+static inline void list_add(struct list_head *the_new,
+struct list_head *prev, struct list_head *next)
+{
+  next->prev = the_new;
+  the_new->next = next;
+  the_new->prev = prev;
+  prev->next = the_new;
+}
+static inline void list_add_tail(struct list_head *the_new, struct list_head 
*head)
+{
+  list_add(the_new, head->prev, head);
+}
+static inline void list_del(struct list_head *node)
+{
+  node->next->prev = node->prev;
+  node->prev->next = node->next;
+  node->prev = node->next = node;
+}
+static inline void list_replace(struct list_head *the_old, struct list_head 
*the_new)
+{
+  the_new->next = the_old->next;
+  the_new->next->prev = the_new;
+  the_new->prev = the_old->prev;
+  the_new->prev->next = the_new;
+}
+static inline int list_empty(const struct list_head *head)
+{
+  return head->next == head;
+}
+static inline int list_is_last(const struct list_head *list, const struct 
list_head *head)
+{
+  return list->next == head;
+}
+static inline void __list_splice(const struct list_head *list,
+ struct list_head *prev, struct list_head 
*next)
+{
+  struct list_head *first = list->next;
+  struct list_head *last = list->prev;
 
+  first->prev = prev;
+  prev->next = first;
+
+  last->next = next;
+  next->prev = last;
+}
+/**
+ * list_splice - join two lists
+ */
+static inline void list_splice(const struct list_head *list, struct list_head 
*head)
+{
+  if (!list_empty(list))
+__list_splice(list, head, head->next);
+}
+
+/**
+ * list_splice_tail - join two lists, each list being a queue
+ */
+static inline void list_splice_tail(struct list_head *list, struct list_head 
*head)
+{
+  if (!list_empty(list))
+__list_splice(list, head->prev, head);
+}
+
+#undef offsetof
+#ifdef __compiler_offsetof
+#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
+#else
+#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER)
+#endif
+#define container_of(ptr, type, member) ({  \
+  const typeof( ((type *)0)->member ) *__mptr = (ptr);  \
+  (type *)( (char *)__mptr - offsetof(type,member) ); })
+#define list_entry(ptr, type, member) container_of(ptr, type, member)
+
+#define list_for_each(pos, head) \
+  for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define list_for_each_safe(pos, n, head) \
+  for (pos = (head)->next, n = pos->next; pos != (head); \
+   pos = n, n = pos->next)
+
+#endif /* __CL_UTILS_H__ */
-- 
2.7.4


FREE 3D EARTH SCREENSAVER - Watch the Earth right on your desktop!
Check it out at http://www.inbox.com/earth


___
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet