Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Sep 2016 16:52:08 -0700
From:      Conrad Meyer <cem@freebsd.org>
To:        Marcel Moolenaar <marcel@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r306325 - head/usr.bin/mkimg
Message-ID:  <CAG6CVpWSKH9683qiC4PDnuxa43rf2R8k_CoR41uOn11Bonh7gQ@mail.gmail.com>
In-Reply-To: <201609252257.u8PMvxUx047428@repo.freebsd.org>
References:  <201609252257.u8PMvxUx047428@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
What's the motivation for this?  This seems worse.

Best,
Conrad

On Sun, Sep 25, 2016 at 3:57 PM, Marcel Moolenaar <marcel@freebsd.org> wrote:
> Author: marcel
> Date: Sun Sep 25 22:57:59 2016
> New Revision: 306325
> URL: https://svnweb.freebsd.org/changeset/base/306325
>
> Log:
>   Replace the use of linker sets with constructors for both the
>   formats and schemes.  Formats and schemes are registered at
>   runtime now, rather than collected at link time.
>
> Modified:
>   head/usr.bin/mkimg/format.c
>   head/usr.bin/mkimg/format.h
>   head/usr.bin/mkimg/mkimg.c
>   head/usr.bin/mkimg/scheme.c
>   head/usr.bin/mkimg/scheme.h
>
> Modified: head/usr.bin/mkimg/format.c
> ==============================================================================
> --- head/usr.bin/mkimg/format.c Sun Sep 25 22:17:46 2016        (r306324)
> +++ head/usr.bin/mkimg/format.c Sun Sep 25 22:57:59 2016        (r306325)
> @@ -28,8 +28,6 @@
>  __FBSDID("$FreeBSD$");
>
>  #include <sys/types.h>
> -#include <sys/linker_set.h>
> -#include <sys/queue.h>
>  #include <sys/stat.h>
>  #include <err.h>
>  #include <errno.h>
> @@ -42,8 +40,24 @@ __FBSDID("$FreeBSD$");
>  #include "format.h"
>  #include "mkimg.h"
>
> +static struct mkimg_format *first;
>  static struct mkimg_format *format;
>
> +struct mkimg_format *
> +format_iterate(struct mkimg_format *f)
> +{
> +
> +       return ((f == NULL) ? first : f->next);
> +}
> +
> +void
> +format_register(struct mkimg_format *f)
> +{
> +
> +       f->next = first;
> +       first = f;
> +}
> +
>  int
>  format_resize(lba_t end)
>  {
> @@ -56,10 +70,10 @@ format_resize(lba_t end)
>  int
>  format_select(const char *spec)
>  {
> -       struct mkimg_format *f, **iter;
> +       struct mkimg_format *f;
>
> -       SET_FOREACH(iter, formats) {
> -               f = *iter;
> +       f = NULL;
> +       while ((f = format_iterate(f)) != NULL) {
>                 if (strcasecmp(spec, f->name) == 0) {
>                         format = f;
>                         return (0);
>
> Modified: head/usr.bin/mkimg/format.h
> ==============================================================================
> --- head/usr.bin/mkimg/format.h Sun Sep 25 22:17:46 2016        (r306324)
> +++ head/usr.bin/mkimg/format.h Sun Sep 25 22:57:59 2016        (r306325)
> @@ -29,21 +29,24 @@
>  #ifndef _MKIMG_FORMAT_H_
>  #define        _MKIMG_FORMAT_H_
>
> -#include <sys/linker_set.h>
> -
>  struct mkimg_format {
> +       struct mkimg_format *next;
>         const char      *name;
>         const char      *description;
>         int             (*resize)(lba_t);
>         int             (*write)(int);
>  };
>
> -SET_DECLARE(formats, struct mkimg_format);
> -#define        FORMAT_DEFINE(nm)       DATA_SET(formats, nm)
> +#define        FORMAT_DEFINE(nm)                                               \
> +static void format_register_##nm(void) __attribute__((constructor));   \
> +static void format_register_##nm(void) { format_register(&nm); }
>
> -int    format_resize(lba_t);
> +struct mkimg_format *format_iterate(struct mkimg_format *);
> +void   format_register(struct mkimg_format *);
>  int    format_select(const char *);
>  struct mkimg_format *format_selected(void);
> +
> +int    format_resize(lba_t);
>  int    format_write(int);
>
>  #endif /* _MKIMG_FORMAT_H_ */
>
> Modified: head/usr.bin/mkimg/mkimg.c
> ==============================================================================
> --- head/usr.bin/mkimg/mkimg.c  Sun Sep 25 22:17:46 2016        (r306324)
> +++ head/usr.bin/mkimg/mkimg.c  Sun Sep 25 22:57:59 2016        (r306325)
> @@ -27,7 +27,6 @@
>  #include <sys/cdefs.h>
>  __FBSDID("$FreeBSD$");
>
> -#include <sys/linker_set.h>
>  #include <sys/queue.h>
>  #include <sys/stat.h>
>  #include <sys/types.h>
> @@ -77,20 +76,20 @@ u_int blksz = 0;
>  static void
>  print_formats(int usage)
>  {
> -       struct mkimg_format *f, **f_iter;
> +       struct mkimg_format *f;
>         const char *sep;
>
>         if (usage) {
>                 fprintf(stderr, "    formats:\n");
> -               SET_FOREACH(f_iter, formats) {
> -                       f = *f_iter;
> +               f = NULL;
> +               while ((f = format_iterate(f)) != NULL) {
>                         fprintf(stderr, "\t%s\t-  %s\n", f->name,
>                             f->description);
>                 }
>         } else {
>                 sep = "";
> -               SET_FOREACH(f_iter, formats) {
> -                       f = *f_iter;
> +               f = NULL;
> +               while ((f = format_iterate(f)) != NULL) {
>                         printf("%s%s", sep, f->name);
>                         sep = " ";
>                 }
> @@ -101,20 +100,20 @@ print_formats(int usage)
>  static void
>  print_schemes(int usage)
>  {
> -       struct mkimg_scheme *s, **s_iter;
> +       struct mkimg_scheme *s;
>         const char *sep;
>
>         if (usage) {
>                 fprintf(stderr, "    schemes:\n");
> -               SET_FOREACH(s_iter, schemes) {
> -                       s = *s_iter;
> +               s = NULL;
> +               while ((s = scheme_iterate(s)) != NULL) {
>                         fprintf(stderr, "\t%s\t-  %s\n", s->name,
>                             s->description);
>                 }
>         } else {
>                 sep = "";
> -               SET_FOREACH(s_iter, schemes) {
> -                       s = *s_iter;
> +               s = NULL;
> +               while ((s = scheme_iterate(s)) != NULL) {
>                         printf("%s%s", sep, s->name);
>                         sep = " ";
>                 }
>
> Modified: head/usr.bin/mkimg/scheme.c
> ==============================================================================
> --- head/usr.bin/mkimg/scheme.c Sun Sep 25 22:17:46 2016        (r306324)
> +++ head/usr.bin/mkimg/scheme.c Sun Sep 25 22:57:59 2016        (r306325)
> @@ -28,8 +28,6 @@
>  __FBSDID("$FreeBSD$");
>
>  #include <sys/types.h>
> -#include <sys/linker_set.h>
> -#include <sys/queue.h>
>  #include <sys/stat.h>
>  #include <assert.h>
>  #include <err.h>
> @@ -65,6 +63,7 @@ static struct {
>         { NULL, ALIAS_NONE }            /* Keep last! */
>  };
>
> +static struct mkimg_scheme *first;
>  static struct mkimg_scheme *scheme;
>  static void *bootcode;
>
> @@ -82,13 +81,27 @@ scheme_parse_alias(const char *name)
>         return (ALIAS_NONE);
>  }
>
> +struct mkimg_scheme *
> +scheme_iterate(struct mkimg_scheme *s)
> +{
> +
> +       return ((s == NULL) ? first : s->next);
> +}
> +
> +void
> +scheme_register(struct mkimg_scheme *s)
> +{
> +       s->next = first;
> +       first = s;
> +}
> +
>  int
>  scheme_select(const char *spec)
>  {
> -       struct mkimg_scheme *s, **iter;
> +       struct mkimg_scheme *s;
>
> -       SET_FOREACH(iter, schemes) {
> -               s = *iter;
> +       s = NULL;
> +       while ((s = scheme_iterate(s)) != NULL) {
>                 if (strcasecmp(spec, s->name) == 0) {
>                         scheme = s;
>                         return (0);
>
> Modified: head/usr.bin/mkimg/scheme.h
> ==============================================================================
> --- head/usr.bin/mkimg/scheme.h Sun Sep 25 22:17:46 2016        (r306324)
> +++ head/usr.bin/mkimg/scheme.h Sun Sep 25 22:57:59 2016        (r306325)
> @@ -29,8 +29,6 @@
>  #ifndef _MKIMG_SCHEME_H_
>  #define        _MKIMG_SCHEME_H_
>
> -#include <sys/linker_set.h>
> -
>  enum alias {
>         ALIAS_NONE,             /* Keep first! */
>         /* start */
> @@ -62,6 +60,7 @@ struct mkimg_alias {
>  };
>
>  struct mkimg_scheme {
> +       struct mkimg_scheme *next;
>         const char      *name;
>         const char      *description;
>         struct mkimg_alias *aliases;
> @@ -77,9 +76,12 @@ struct mkimg_scheme {
>         u_int           maxsecsz;
>  };
>
> -SET_DECLARE(schemes, struct mkimg_scheme);
> -#define        SCHEME_DEFINE(nm)       DATA_SET(schemes, nm)
> +#define        SCHEME_DEFINE(nm)                                               \
> +static void scheme_register_##nm(void) __attribute__((constructor));   \
> +static void scheme_register_##nm(void) { scheme_register(&nm); }
>
> +struct mkimg_scheme *scheme_iterate(struct mkimg_scheme *);
> +void   scheme_register(struct mkimg_scheme *);
>  int    scheme_select(const char *);
>  struct mkimg_scheme *scheme_selected(void);
>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAG6CVpWSKH9683qiC4PDnuxa43rf2R8k_CoR41uOn11Bonh7gQ>