2012-10-18 17:33:53

by Yann E. MORIN

[permalink] [raw]
Subject: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
They were removed in Y2000 from FreeBSD:
http://svnweb.freebsd.org/base?view=revision&revision=70469

The reason was that TAILQ are perfectly capable of doing the exact
same things:
http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes

(Thank Yaakov for the pointers!)

So, switch to using TAILQ instead, which are more portable.

Reported-by: Tetsuo Handa <[email protected]>
Reported-by: Benjamin Poirier <[email protected]>
Signed-off-by: "Yann E. MORIN" <[email protected]>
Cc: Yaakov Selkowitz <[email protected]>
---
scripts/kconfig/expr.h | 4 ++--
scripts/kconfig/mconf.c | 4 ++--
scripts/kconfig/menu.c | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index bd2e098..c6a8b99 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -175,12 +175,12 @@ struct menu {
#define MENU_ROOT 0x0002

struct jump_key {
- CIRCLEQ_ENTRY(jump_key) entries;
+ TAILQ_ENTRY(jump_key) entries;
size_t offset;
struct menu *target;
int index;
};
-CIRCLEQ_HEAD(jk_head, jump_key);
+TAILQ_HEAD(jk_head, jump_key);

#define JUMP_NB 9

diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 48f6744..f1ee1c9 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -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) {
+ TAILQ_FOREACH(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);
+ struct jk_head head = TAILQ_HEAD_INITIALIZER(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..9eff451 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -544,12 +544,12 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
} else
jump->target = location;

- if (CIRCLEQ_EMPTY(head))
+ if (TAILQ_EMPTY(head))
jump->index = 0;
else
- jump->index = CIRCLEQ_LAST(head)->index + 1;
+ jump->index = TAILQ_LAST(head, jk_head)->index + 1;

- CIRCLEQ_INSERT_TAIL(head, jump, entries);
+ TAILQ_INSERT_TAIL(head, jump, entries);
}

if (i > 0) {
--
1.7.2.5


2012-10-18 17:55:56

by Yaakov (Cygwin/X)

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

On Thu, 2012-10-18 at 19:33 +0200, Yann E. MORIN wrote:
> Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
> They were removed in Y2000 from FreeBSD:
> http://svnweb.freebsd.org/base?view=revision&revision=70469
>
> The reason was that TAILQ are perfectly capable of doing the exact
> same things:
> http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes
>
> (Thank Yaakov for the pointers!)

And thank you again for the heads-up.

> So, switch to using TAILQ instead, which are more portable.
>
> Reported-by: Tetsuo Handa <[email protected]>
> Reported-by: Benjamin Poirier <[email protected]>
> Signed-off-by: "Yann E. MORIN" <[email protected]>

Tested-by: Yaakov Selkowitz <[email protected]>

2012-10-18 19:12:26

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Yaakov, All,

On Thursday 18 October 2012 Yaakov (Cygwin/X) wrote:
> On Thu, 2012-10-18 at 19:33 +0200, Yann E. MORIN wrote:
> > Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
> > They were removed in Y2000 from FreeBSD:
> > http://svnweb.freebsd.org/base?view=revision&revision=70469
> >
> > The reason was that TAILQ are perfectly capable of doing the exact
> > same things:
> > http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes
> >
> > (Thank Yaakov for the pointers!)
>
> And thank you again for the heads-up.
>
> > So, switch to using TAILQ instead, which are more portable.
> >
> > Reported-by: Tetsuo Handa <[email protected]>
> > Reported-by: Benjamin Poirier <[email protected]>
> > Signed-off-by: "Yann E. MORIN" <[email protected]>
>
> Tested-by: Yaakov Selkowitz <[email protected]>

Out of curiosity: did you test on Cygwin?

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. |
'------------------------------^-------^------------------^--------------------'

2012-10-19 08:59:14

by Yaakov (Cygwin/X)

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

On Thu, 2012-10-18 at 20:59 +0200, Yann E. MORIN wrote:
> On Thursday 18 October 2012 Yaakov (Cygwin/X) wrote:
> > Tested-by: Yaakov Selkowitz <[email protected]>
>
> Out of curiosity: did you test on Cygwin?

Yes, of course.


Yaakov
Cygwin Ports

2012-10-19 12:11:16

by Tetsuo Handa

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Yann E. MORIN wrote:
> Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
> They were removed in Y2000 from FreeBSD:
> http://svnweb.freebsd.org/base?view=revision&revision=70469
>
> The reason was that TAILQ are perfectly capable of doing the exact
> same things:
> http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes
>
> (Thank Yaakov for the pointers!)
>
> So, switch to using TAILQ instead, which are more portable.
>
> Reported-by: Tetsuo Handa <[email protected]>
> Reported-by: Benjamin Poirier <[email protected]>
> Signed-off-by: "Yann E. MORIN" <[email protected]>
> Cc: Yaakov Selkowitz <[email protected]>
> ---
> scripts/kconfig/expr.h | 4 ++--
> scripts/kconfig/mconf.c | 4 ++--
> scripts/kconfig/menu.c | 6 +++---
> 3 files changed, 7 insertions(+), 7 deletions(-)
>
Excuse me, but your patch does not solve my problem because kconfig started
using macros which does not exist in "@(#)queue.h 8.3 (Berkeley) 12/13/93".
Kconfig still fails after applying your patch:

HOSTCC scripts/kconfig/mconf.o
scripts/kconfig/mconf.c: In function `update_text':
scripts/kconfig/mconf.c:326: warning: implicit declaration of function `TAILQ_FOREACH'
scripts/kconfig/mconf.c:326: error: `entries' undeclared (first use in this function)
scripts/kconfig/mconf.c:326: error: (Each undeclared identifier is reported only once
scripts/kconfig/mconf.c:326: error: for each function it appears in.)
scripts/kconfig/mconf.c:326: error: syntax error before '{' token
scripts/kconfig/mconf.c:333: error: `header' undeclared (first use in this function)
scripts/kconfig/mconf.c: At top level:
scripts/kconfig/mconf.c:343: error: syntax error before '}' token
scripts/kconfig/mconf.c: In function `search_conf':
scripts/kconfig/mconf.c:378: warning: implicit declaration of function `TAILQ_HEAD_INITIALIZER'
scripts/kconfig/mconf.c:378: error: invalid initializer
make[1]: *** [scripts/kconfig/mconf.o] Error 1
make: *** [menuconfig] Error 2

So, would you add something which looks like "sed -e 's/CIRCLEQ/TAILQ/g'" upon
https://lkml.org/lkml/2012/10/16/274 ?

2012-10-19 14:54:29

by Michal Marek

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

On 19.10.2012 14:10, Tetsuo Handa wrote:
> Yann E. MORIN wrote:
>> So, switch to using TAILQ instead, which are more portable.
[...]
> Excuse me, but your patch does not solve my problem because kconfig started
> using macros which does not exist in "@(#)queue.h 8.3 (Berkeley) 12/13/93".
> Kconfig still fails after applying your patch:
>
> HOSTCC scripts/kconfig/mconf.o
> scripts/kconfig/mconf.c: In function `update_text':
> scripts/kconfig/mconf.c:326: warning: implicit declaration of function `TAILQ_FOREACH'
[...]
> scripts/kconfig/mconf.c:378: warning: implicit declaration of function `TAILQ_HEAD_INITIALIZER'
>
> So, would you add something which looks like "sed -e 's/CIRCLEQ/TAILQ/g'" upon
> https://lkml.org/lkml/2012/10/16/274 ?

Could you reduce that patch to not copy all of queue.h?
TAILQ_HEAD_INITIALIZER can be replaced by a TAILQ_INIT() call after
variable definitions, and we do not need stuff like
TAILQ_FOREACH_REVERSE. The other option is to reimplement the needed
operations under a different name, so that people don't accidentally use
other macros that are missing in old queue.h revisions.

Michal

2012-10-19 22:52:59

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Tetsuo, Michal, All,

On Friday 19 October 2012 Tetsuo Handa wrote:
> Yann E. MORIN wrote:
> > Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
[--SNIP--]
> > So, switch to using TAILQ instead, which are more portable.
[--SNIP--]
> Excuse me, but your patch does not solve my problem because kconfig started
> using macros which does not exist in "@(#)queue.h 8.3 (Berkeley) 12/13/93".

Whoa. That's old... :-/

Currently, kconfig uses (CIRCLEQ or TAILQ)

> Kconfig still fails after applying your patch:
[--SNIP--]
> So, would you add something which looks like "sed -e 's/CIRCLEQ/TAILQ/g'" upon
> https://lkml.org/lkml/2012/10/16/274 ?

Sorry, I did not see you had posted a patch.

Basically, I don't care what solution we choose. Using TAILQ looks like
being not the solution. So, here are the known options:
1- Michal pointed to tools/firewire/list.h, but those are different from
the CIRCLEQ/TAILQ, and switching is not easy (at least for me after a
quick glance);

1b- note also that drivers/scsi/aic7xxx/queue.h has all of both the CIRCLEQ
and TAILQ macros we're interested in, too, and it looks like it can be
used out of the kernel (eg. for userland);

2- carry the parts of CIRCLEQ (or TAILQ) that we need, and use them if
the system's sys/queue.h does not provide them, as Tetsuo proposed;

3- carry the parts of CIRCLEQ (or TAILQ) that we need, and do not rely
on the system's sys/queue.h to provide them at all.


Michal, what do you think would be the best route to go, to:
1- get a fix in 3.7 ?
2- if the fix for 3.7 is just a workaround, a proper fix for 3.8 ?

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. |
'------------------------------^-------^------------------^--------------------'

2012-10-20 14:44:07

by Tetsuo Handa

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Michal Marek wrote:
> On 19.10.2012 14:10, Tetsuo Handa wrote:
> > Yann E. MORIN wrote:
> >> So, switch to using TAILQ instead, which are more portable.
> [...]
> > Excuse me, but your patch does not solve my problem because kconfig started
> > using macros which does not exist in "@(#)queue.h 8.3 (Berkeley) 12/13/93".
> > Kconfig still fails after applying your patch:
> >
> > HOSTCC scripts/kconfig/mconf.o
> > scripts/kconfig/mconf.c: In function `update_text':
> > scripts/kconfig/mconf.c:326: warning: implicit declaration of function `TAILQ_FOREACH'
> [...]
> > scripts/kconfig/mconf.c:378: warning: implicit declaration of function `TAILQ_HEAD_INITIALIZER'
> >
> > So, would you add something which looks like "sed -e 's/CIRCLEQ/TAILQ/g'" upon
> > https://lkml.org/lkml/2012/10/16/274 ?
>
> Could you reduce that patch to not copy all of queue.h?
> TAILQ_HEAD_INITIALIZER can be replaced by a TAILQ_INIT() call after
> variable definitions, and we do not need stuff like
> TAILQ_FOREACH_REVERSE. The other option is to reimplement the needed
> operations under a different name, so that people don't accidentally use
> other macros that are missing in old queue.h revisions.
>
> Michal
>

I'm fine to manually add missing macros to /usr/include/sys/queue.h of
"@(#)queue.h 8.3 (Berkeley) 12/13/93" in my environment instead of adding
define-as-needed lines to scripts/kconfig/expr.h, for missing macros are
available with that of "@(#)queue.h 8.5 (Berkeley) 8/20/94".

2012-10-20 16:58:42

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Tetuso, All,

On Saturday 20 October 2012 Tetsuo Handa wrote:
> Michal Marek wrote:
> > On 19.10.2012 14:10, Tetsuo Handa wrote:
> > > Yann E. MORIN wrote:
> > >> So, switch to using TAILQ instead, which are more portable.
> > [...]
> > > Excuse me, but your patch does not solve my problem because kconfig started
> > > using macros which does not exist in "@(#)queue.h 8.3 (Berkeley) 12/13/93".
> > > Kconfig still fails after applying your patch:
> > >
> > > HOSTCC scripts/kconfig/mconf.o
> > > scripts/kconfig/mconf.c: In function `update_text':
> > > scripts/kconfig/mconf.c:326: warning: implicit declaration of function `TAILQ_FOREACH'
> > [...]
> > > scripts/kconfig/mconf.c:378: warning: implicit declaration of function `TAILQ_HEAD_INITIALIZER'
> > >
> > > So, would you add something which looks like "sed -e 's/CIRCLEQ/TAILQ/g'" upon
> > > https://lkml.org/lkml/2012/10/16/274 ?
> >
> > Could you reduce that patch to not copy all of queue.h?
> > TAILQ_HEAD_INITIALIZER can be replaced by a TAILQ_INIT() call after
> > variable definitions, and we do not need stuff like
> > TAILQ_FOREACH_REVERSE. The other option is to reimplement the needed
> > operations under a different name, so that people don't accidentally use
> > other macros that are missing in old queue.h revisions.
> >
> > Michal
> >
>
> I'm fine to manually add missing macros to /usr/include/sys/queue.h of
> "@(#)queue.h 8.3 (Berkeley) 12/13/93" in my environment instead of adding
> define-as-needed lines to scripts/kconfig/expr.h, for missing macros are
> available with that of "@(#)queue.h 8.5 (Berkeley) 8/20/94".

Are you OK with this s/CIRCLEQ/TAILQ/ patch, then?
http://marc.info/?l=linux-kbuild&m=135058165015518&w=2

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. |
'------------------------------^-------^------------------^--------------------'

2012-10-20 17:57:03

by Benjamin Poirier

[permalink] [raw]
Subject: [PATCH] menuconfig: Replace CIRCLEQ by list_head-style lists.

From: Benjamin Poirier <[email protected]>

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

Reported-by: Tetsuo Handa <[email protected]>
Signed-off-by: Benjamin Poirier <[email protected]>
---
scripts/kconfig/expr.h | 5 +--
scripts/kconfig/list.h | 90 +++++++++++++++++++++++++++++++++++++++++++
scripts/kconfig/lkc_proto.h | 4 +-
scripts/kconfig/mconf.c | 6 +--
scripts/kconfig/menu.c | 14 ++++---
5 files changed, 105 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..934bdba
--- /dev/null
+++ b/scripts/kconfig/list.h
@@ -0,0 +1,90 @@
+#ifndef LIST_H
+#define LIST_H
+
+/*
+ * Copied from include/linux/...
+ */
+
+#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))
+
+#endif
+
+/**
+ * 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);
+}
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

2012-10-20 21:22:13

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] menuconfig: Replace CIRCLEQ by list_head-style lists.

Benjamin, All,

On Saturday 20 October 2012 Benjamin Poirier wrote:
> From: Benjamin Poirier <[email protected]>
>
> sys/queue.h and CIRCLEQ in particular have proven to cause portability
> problems (reported on Debian Sarge, Cygwin and FreeBSD)
>
> Reported-by: Tetsuo Handa <[email protected]>
> Signed-off-by: Benjamin Poirier <[email protected]>

Tested-by: "Yann E. MORIN" <[email protected]>

Thank you for this patch! I guess it is the best solution we can get.

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. |
'------------------------------^-------^------------------^--------------------'

2012-10-20 22:19:10

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] menuconfig: Replace CIRCLEQ by list_head-style lists.

Benjamin, All,

On Saturday 20 October 2012 Benjamin Poirier wrote:
> From: Benjamin Poirier <[email protected]>
>
> sys/queue.h and CIRCLEQ in particular have proven to cause portability
> problems (reported on Debian Sarge, Cygwin and FreeBSD)
>
> Reported-by: Tetsuo Handa <[email protected]>
> Signed-off-by: Benjamin Poirier <[email protected]>

Sorry for my earlier optimistic reply, but...

While menuconfig got fixed with this patch, xconfig is now broken:

First issue:
In file included from /home/ymorin/dev/linux/scripts/kconfig/expr.h:15,
from /home/ymorin/dev/linux/scripts/kconfig/lkc.h:9,
from /home/ymorin/dev/linux/scripts/kconfig/qconf.cc:45:
/home/ymorin/dev/linux/scripts/kconfig/list.h:8:1: warning: "offsetof"
redefined
In file included from /usr/include/_G_config.h:15,
from /usr/include/libio.h:32,
from /usr/include/stdio.h:75,
from /usr/include/qt4/QtCore/qtextstream.h:57,
from /usr/include/qt4/Qt3Support/q3mainwindow.h:47,
from /home/ymorin/dev/linux/scripts/kconfig/qconf.cc:19:
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h:411:1: warning: this
is the location of the previous definition

[--SNIP--]
> diff --git a/scripts/kconfig/list.h b/scripts/kconfig/list.h
> new file mode 100644
> index 0000000..934bdba
> --- /dev/null
> +++ b/scripts/kconfig/list.h
> @@ -0,0 +1,90 @@
> +#ifndef LIST_H
> +#define LIST_H
> +
> +/*
> + * Copied from include/linux/...
> + */
> +
> +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

We could #include <stddef.h>, but then we may end up with issues with
old systems (which we are trying to fix!). I suggest we enclose the
definition between a
#ifndef offsetof
...
#endif


Second issue:
We have further issues with some variable names:
/home/ymorin/dev/linux/scripts/kconfig/list.h:69: error: expected ‘,’ or
‘...’ before ‘new’

[--SNIP--]
> +static inline void __list_add(struct list_head *new,

'new' is a reserved key-word in C++, and xconfig is using qconf, which is
written in C++.

I 'd suggest to:
1- rename the variable
2- enclose the whole header in:
#ifdef __cplusplus
extern "C" {
#endif
[.....]
#ifdef __cplusplus
}
#endif

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. |
'------------------------------^-------^------------------^--------------------'

2012-10-21 01:22:18

by Tetsuo Handa

[permalink] [raw]
Subject: Re: [PATCH] menuconfig: Replace CIRCLEQ by list_head-style lists.

Yann E. MORIN wrote:
> Benjamin, All,
>
> On Saturday 20 October 2012 Benjamin Poirier wrote:
> > From: Benjamin Poirier <[email protected]>
> >
> > sys/queue.h and CIRCLEQ in particular have proven to cause portability
> > problems (reported on Debian Sarge, Cygwin and FreeBSD)
> >
> > Reported-by: Tetsuo Handa <[email protected]>
> > Signed-off-by: Benjamin Poirier <[email protected]>
>
> Tested-by: "Yann E. MORIN" <[email protected]>
>
> Thank you for this patch! I guess it is the best solution we can get.
>
> Regards,
> Yann E. MORIN.

This patch solves my problem on Debian Sarge. Thank you.

Tested-by: Tetsuo Handa <[email protected]>

2012-10-21 01:54:07

by Yaakov (Cygwin/X)

[permalink] [raw]
Subject: Re: [PATCH] menuconfig: Replace CIRCLEQ by list_head-style lists.

On Sat, 2012-10-20 at 13:56 -0400, Benjamin Poirier wrote:
> From: Benjamin Poirier <[email protected]>
> menuconfig: Replace CIRCLEQ by list_head-style lists
>
> sys/queue.h and CIRCLEQ in particular have proven to cause portability
> problems (reported on Debian Sarge, Cygwin and FreeBSD)
>
> Reported-by: Tetsuo Handa <[email protected]>
> Signed-off-by: Benjamin Poirier <[email protected]>


> From: "Yann E. MORIN" <[email protected]>
> kconfig: fix building the qconf frontend
>
> Also, protect the whole file with the #ifdenf LIST_H, not only the
> macros
> defintions.
>
> Signed-off-by: "Yann E. MORIN" <[email protected]>

Squash these two together and all frontends build again on Cygwin.

Tested-by: Yaakov Selkowitz <[email protected]>

2012-10-23 13:12:53

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

On Thu, Oct 18, 2012 at 07:33:45PM +0200, Yann E. MORIN wrote:
> Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
> They were removed in Y2000 from FreeBSD:
> http://svnweb.freebsd.org/base?view=revision&revision=70469
>
> The reason was that TAILQ are perfectly capable of doing the exact
> same things:
> http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes
>
> (Thank Yaakov for the pointers!)
>
> So, switch to using TAILQ instead, which are more portable.

Why not use the kernels list.h?

2012-10-23 17:04:43

by Yann E. MORIN

[permalink] [raw]
Subject: Re: [PATCH] kconfig/menuconfig: use TAILQ instead of CIRCLEQ

Christoph, All,

On Tuesday 23 October 2012 Christoph Hellwig wrote:
> On Thu, Oct 18, 2012 at 07:33:45PM +0200, Yann E. MORIN wrote:
> > Some systems (eg. Cygwin, FreeBSD) are missing the CIRCLEQ macros.
> > They were removed in Y2000 from FreeBSD:
> > http://svnweb.freebsd.org/base?view=revision&revision=70469
> >
> > The reason was that TAILQ are perfectly capable of doing the exact
> > same things:
> > http://www.mavetju.org/mail/view_thread.php?list=freebsd-arch&id=915145&thread=yes
> >
> > (Thank Yaakov for the pointers!)
> >
> > So, switch to using TAILQ instead, which are more portable.
>
> Why not use the kernels list.h?

First, we can't use linux/list.h because it can't be included from userspace.
Second, it would not be convenient for those that use kconfig outside the
Linux kernel (thiord-party projects, eg. buildroot, uClibc, busybox...):
http://marc.info/?l=linux-kbuild&m=135065985609068&w=2

Also, this patch of mine is deprecated; Benjamin has posted another patch
which makes use of a stripped-down list.h, partially copied from linux/list.h:
http://marc.info/?t=135081179500001&r=1&w=4

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. |
'------------------------------^-------^------------------^--------------------'