linux-kbuild.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
       [not found] <1350754935-20014-1-git-send-email-benjamin.poirier@gmail.com>
@ 2012-10-21  9:27 ` Benjamin Poirier
  2012-10-22 19:38   ` Yann E. MORIN
  0 siblings, 1 reply; 6+ messages in thread
From: Benjamin Poirier @ 2012-10-21  9:27 UTC (permalink / raw)
  To: Michal Marek
  Cc: Jean Sacren, Arnaud Lacombe, Wang YanQing, Paul Gortmaker,
	Davidlohr Bueso, linux-kbuild, linux-kernel, Yann E. MORIN,
	Tetsuo Handa, Yaakov Selkowitz

From: Benjamin Poirier <bpoirier@suse.de>

sys/queue.h and CIRCLEQ in particular have proven to cause portability
problems (reported on Debian Sarge, Cygwin and FreeBSD)

Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Tested-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
---

Changes v1-v2:
* integrate the patch/suggestion from Yann to fix problems related to the
  usage of list.h with xconfig/c++
	* "new" keyword
	* offsetof redefinition
* silly #endif placement mistake

Thanks to Tetsuo, Yann and Yaakov for thorough testing.

 scripts/kconfig/expr.h      |    5 +--
 scripts/kconfig/list.h      |   91 +++++++++++++++++++++++++++++++++++++++++++
 scripts/kconfig/lkc_proto.h |    4 +-
 scripts/kconfig/mconf.c     |    6 +--
 scripts/kconfig/menu.c      |   14 ++++---
 5 files changed, 106 insertions(+), 14 deletions(-)
 create mode 100644 scripts/kconfig/list.h

diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index bd2e098..cdd4860 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -12,7 +12,7 @@ extern "C" {
 
 #include <assert.h>
 #include <stdio.h>
-#include <sys/queue.h>
+#include "list.h"
 #ifndef __cplusplus
 #include <stdbool.h>
 #endif
@@ -175,12 +175,11 @@ struct menu {
 #define MENU_ROOT		0x0002
 
 struct jump_key {
-	CIRCLEQ_ENTRY(jump_key) entries;
+	struct list_head entries;
 	size_t offset;
 	struct menu *target;
 	int index;
 };
-CIRCLEQ_HEAD(jk_head, jump_key);
 
 #define JUMP_NB			9
 
diff --git a/scripts/kconfig/list.h b/scripts/kconfig/list.h
new file mode 100644
index 0000000..0ae730b
--- /dev/null
+++ b/scripts/kconfig/list.h
@@ -0,0 +1,91 @@
+#ifndef LIST_H
+#define LIST_H
+
+/*
+ * Copied from include/linux/...
+ */
+
+#undef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr:        the pointer to the member.
+ * @type:       the type of the container struct this is embedded in.
+ * @member:     the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({                      \
+	const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+	(type *)( (char *)__mptr - offsetof(type,member) );})
+
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+	struct list_head name = LIST_HEAD_INIT(name)
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr:	the &struct list_head pointer.
+ * @type:	the type of the struct this is embedded in.
+ * @member:	the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+	container_of(ptr, type, member)
+
+/**
+ * list_for_each_entry	-	iterate over list of given type
+ * @pos:	the type * to use as a loop cursor.
+ * @head:	the head for your list.
+ * @member:	the name of the list_struct within the struct.
+ */
+#define list_for_each_entry(pos, head, member)				\
+	for (pos = list_entry((head)->next, typeof(*pos), member);	\
+	     &pos->member != (head); 	\
+	     pos = list_entry(pos->member.next, typeof(*pos), member))
+
+/**
+ * list_empty - tests whether a list is empty
+ * @head: the list to test.
+ */
+static inline int list_empty(const struct list_head *head)
+{
+	return head->next == head;
+}
+
+/*
+ * Insert a new entry between two known consecutive entries.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_add(struct list_head *_new,
+			      struct list_head *prev,
+			      struct list_head *next)
+{
+	next->prev = _new;
+	_new->next = next;
+	_new->prev = prev;
+	prev->next = _new;
+}
+
+/**
+ * list_add_tail - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it before
+ *
+ * Insert a new entry before the specified head.
+ * This is useful for implementing queues.
+ */
+static inline void list_add_tail(struct list_head *_new, struct list_head *head)
+{
+	__list_add(_new, head->prev, head);
+}
+
+#endif
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index 1d1c085..ef1a738 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -21,9 +21,9 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu));
 P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 P(menu_has_help,bool,(struct menu *menu));
 P(menu_get_help,const char *,(struct menu *menu));
-P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head
+P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head
 			 *head));
-P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head
+P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head
 				   *head));
 P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
 
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 48f6744..53975cf 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -312,7 +312,7 @@ static void set_config_filename(const char *config_filename)
 
 
 struct search_data {
-	struct jk_head *head;
+	struct list_head *head;
 	struct menu **targets;
 	int *keys;
 };
@@ -323,7 +323,7 @@ static void update_text(char *buf, size_t start, size_t end, void *_data)
 	struct jump_key *pos;
 	int k = 0;
 
-	CIRCLEQ_FOREACH(pos, data->head, entries) {
+	list_for_each_entry(pos, data->head, entries) {
 		if (pos->offset >= start && pos->offset < end) {
 			char header[4];
 
@@ -375,7 +375,7 @@ again:
 
 	sym_arr = sym_re_search(dialog_input);
 	do {
-		struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head);
+		LIST_HEAD(head);
 		struct menu *targets[JUMP_NB];
 		int keys[JUMP_NB + 1], i;
 		struct search_data data = {
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index a3cade6..e98a05c 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -508,7 +508,7 @@ const char *menu_get_help(struct menu *menu)
 }
 
 static void get_prompt_str(struct gstr *r, struct property *prop,
-			   struct jk_head *head)
+			   struct list_head *head)
 {
 	int i, j;
 	struct menu *submenu[8], *menu, *location = NULL;
@@ -544,12 +544,13 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
 		} else
 			jump->target = location;
 
-		if (CIRCLEQ_EMPTY(head))
+		if (list_empty(head))
 			jump->index = 0;
 		else
-			jump->index = CIRCLEQ_LAST(head)->index + 1;
+			jump->index = list_entry(head->prev, struct jump_key,
+						 entries)->index + 1;
 
-		CIRCLEQ_INSERT_TAIL(head, jump, entries);
+		list_add_tail(&jump->entries, head);
 	}
 
 	if (i > 0) {
@@ -573,7 +574,8 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
 /*
  * head is optional and may be NULL
  */
-void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)
+void get_symbol_str(struct gstr *r, struct symbol *sym,
+		    struct list_head *head)
 {
 	bool hit;
 	struct property *prop;
@@ -612,7 +614,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)
 	str_append(r, "\n\n");
 }
 
-struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head)
+struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head)
 {
 	struct symbol *sym;
 	struct gstr res = str_new();
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
  2012-10-21  9:27 ` [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists Benjamin Poirier
@ 2012-10-22 19:38   ` Yann E. MORIN
  2012-10-25 13:34     ` Michal Marek
  0 siblings, 1 reply; 6+ messages in thread
From: Yann E. MORIN @ 2012-10-22 19:38 UTC (permalink / raw)
  To: Michal Marek
  Cc: linux-kbuild, Benjamin Poirier, Jean Sacren, Arnaud Lacombe,
	Wang YanQing, Paul Gortmaker, Davidlohr Bueso, linux-kernel,
	Tetsuo Handa, Yaakov Selkowitz

Benjamin, Michal, All,

On Sunday 21 October 2012 Benjamin Poirier wrote:
> From: Benjamin Poirier <bpoirier@suse.de>
> 
> sys/queue.h and CIRCLEQ in particular have proven to cause portability
> problems (reported on Debian Sarge, Cygwin and FreeBSD)

Benjamin,

Thank you for working on this! :-)

> Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> Tested-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
> Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> ---
> 
> Changes v1-v2:
> * integrate the patch/suggestion from Yann to fix problems related to the
>   usage of list.h with xconfig/c++
> 	* "new" keyword
> 	* offsetof redefinition
> * silly #endif placement mistake

Michal,

Any more comments on this patch?

If not, then I would suggest to push it for inclusion before 3.7 is released
(I believe it can go in, as it is a bugfix, not a new feature).

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
  2012-10-22 19:38   ` Yann E. MORIN
@ 2012-10-25 13:34     ` Michal Marek
  2012-11-11 16:02       ` Yann E. MORIN
  0 siblings, 1 reply; 6+ messages in thread
From: Michal Marek @ 2012-10-25 13:34 UTC (permalink / raw)
  To: Yann E. MORIN
  Cc: linux-kbuild, Benjamin Poirier, Jean Sacren, Arnaud Lacombe,
	Wang YanQing, Paul Gortmaker, Davidlohr Bueso, linux-kernel,
	Tetsuo Handa, Yaakov Selkowitz

On 22.10.2012 21:38, Yann E. MORIN wrote:
> Benjamin, Michal, All,
> 
> On Sunday 21 October 2012 Benjamin Poirier wrote:
>> From: Benjamin Poirier <bpoirier@suse.de>
>>
>> sys/queue.h and CIRCLEQ in particular have proven to cause portability
>> problems (reported on Debian Sarge, Cygwin and FreeBSD)
> 
> Benjamin,
> 
> Thank you for working on this! :-)

Yeah, thanks!


>>
>> Changes v1-v2:
>> * integrate the patch/suggestion from Yann to fix problems related to the
>>   usage of list.h with xconfig/c++
>> 	* "new" keyword
>> 	* offsetof redefinition
>> * silly #endif placement mistake
> 
> Michal,
> 
> Any more comments on this patch?
> 
> If not, then I would suggest to push it for inclusion before 3.7 is released
> (I believe it can go in, as it is a bugfix, not a new feature).

I pushed it to kbuild.git#rc-fixes now and will send it to Linus for 3.7
inclusion later.

Michal

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
  2012-10-25 13:34     ` Michal Marek
@ 2012-11-11 16:02       ` Yann E. MORIN
  2012-11-12 12:26         ` Willy Tarreau
  0 siblings, 1 reply; 6+ messages in thread
From: Yann E. MORIN @ 2012-11-11 16:02 UTC (permalink / raw)
  To: linux-kbuild
  Cc: Michal Marek, Benjamin Poirier, Jean Sacren, Arnaud Lacombe,
	Wang YanQing, Paul Gortmaker, Davidlohr Bueso, linux-kernel,
	Tetsuo Handa, Yaakov Selkowitz

Michal, All,

On Thursday 25 October 2012 Michal Marek wrote:
> On 22.10.2012 21:38, Yann E. MORIN wrote:
> > On Sunday 21 October 2012 Benjamin Poirier wrote:
> >> Changes v1-v2:
> >> * integrate the patch/suggestion from Yann to fix problems related to the
> >>   usage of list.h with xconfig/c++
> >> 	* "new" keyword
> >> 	* offsetof redefinition
> >> * silly #endif placement mistake
[--SNIP--]
> I pushed it to kbuild.git#rc-fixes now and will send it to Linus for 3.7
> inclusion later.

Not trying to sound like a nuisance, but this has still not been pushed
to Linus yet... ;-)

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
  2012-11-11 16:02       ` Yann E. MORIN
@ 2012-11-12 12:26         ` Willy Tarreau
  2012-11-12 13:35           ` Michal Marek
  0 siblings, 1 reply; 6+ messages in thread
From: Willy Tarreau @ 2012-11-12 12:26 UTC (permalink / raw)
  To: Yann E. MORIN
  Cc: linux-kbuild, Michal Marek, Benjamin Poirier, Jean Sacren,
	Arnaud Lacombe, Wang YanQing, Paul Gortmaker, Davidlohr Bueso,
	linux-kernel, Tetsuo Handa, Yaakov Selkowitz

On Sun, Nov 11, 2012 at 05:02:24PM +0100, Yann E. MORIN wrote:
> Michal, All,
> 
> On Thursday 25 October 2012 Michal Marek wrote:
> > On 22.10.2012 21:38, Yann E. MORIN wrote:
> > > On Sunday 21 October 2012 Benjamin Poirier wrote:
> > >> Changes v1-v2:
> > >> * integrate the patch/suggestion from Yann to fix problems related to the
> > >>   usage of list.h with xconfig/c++
> > >> 	* "new" keyword
> > >> 	* offsetof redefinition
> > >> * silly #endif placement mistake
> [--SNIP--]
> > I pushed it to kbuild.git#rc-fixes now and will send it to Linus for 3.7
> > inclusion later.
> 
> Not trying to sound like a nuisance, but this has still not been pushed
> to Linus yet... ;-)

Would love the patch to be merged too, as I can't build Linux on my Linux
laptop right now, very frustrating :-(

Willy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists.
  2012-11-12 12:26         ` Willy Tarreau
@ 2012-11-12 13:35           ` Michal Marek
  0 siblings, 0 replies; 6+ messages in thread
From: Michal Marek @ 2012-11-12 13:35 UTC (permalink / raw)
  To: Willy Tarreau
  Cc: Yann E. MORIN, linux-kbuild, Benjamin Poirier, Jean Sacren,
	Arnaud Lacombe, Wang YanQing, Paul Gortmaker, Davidlohr Bueso,
	linux-kernel, Tetsuo Handa, Yaakov Selkowitz

Dne 12.11.2012 13:26, Willy Tarreau napsal(a):
> On Sun, Nov 11, 2012 at 05:02:24PM +0100, Yann E. MORIN wrote:
>> Michal, All,
>>
>> On Thursday 25 October 2012 Michal Marek wrote:
>>> On 22.10.2012 21:38, Yann E. MORIN wrote:
>>>> On Sunday 21 October 2012 Benjamin Poirier wrote:
>>>>> Changes v1-v2:
>>>>> * integrate the patch/suggestion from Yann to fix problems related to the
>>>>>   usage of list.h with xconfig/c++
>>>>> 	* "new" keyword
>>>>> 	* offsetof redefinition
>>>>> * silly #endif placement mistake
>> [--SNIP--]
>>> I pushed it to kbuild.git#rc-fixes now and will send it to Linus for 3.7
>>> inclusion later.
>>
>> Not trying to sound like a nuisance, but this has still not been pushed
>> to Linus yet... ;-)
> 
> Would love the patch to be merged too, as I can't build Linux on my Linux
> laptop right now, very frustrating :-(

I just sent the pull request, sorry guys. I thought I had sent it
earlier, but apparently I hadn't.

Michal


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-11-12 13:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1350754935-20014-1-git-send-email-benjamin.poirier@gmail.com>
2012-10-21  9:27 ` [PATCH v2] menuconfig: Replace CIRCLEQ by list_head-style lists Benjamin Poirier
2012-10-22 19:38   ` Yann E. MORIN
2012-10-25 13:34     ` Michal Marek
2012-11-11 16:02       ` Yann E. MORIN
2012-11-12 12:26         ` Willy Tarreau
2012-11-12 13:35           ` Michal Marek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).