On Tue, 5 Nov 2013 22:17:28 -0600
Serge Hallyn <serge.hal...@ubuntu.com> wrote:

> Quoting Serge Hallyn (serge.hal...@ubuntu.com):
> > Quoting Dwight Engen (dwight.en...@oracle.com):
> > > Signed-off-by: Dwight Engen <dwight.en...@oracle.com>
> > 
> > Hi,
> > 
> > One comment below:
> 
> fwiw there's no resulting error so
> 
> Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>
> 
> but if you don't see any reason not to i'll pull the qsort out.

You are correct, the qsort shouldn't be needed. I originally thought I
needed to sort after merging in the active list, but add_to_array does
it every time so it should be fine.

> 
> > 
> > > ---
> > >  src/lxc/lxccontainer.c | 97
> > > +++++++++++++++++++++++++++++++++++++++++++++++---
> > > src/lxc/lxccontainer.h | 10 ++++++ 2 files changed, 103
> > > insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> > > index 89b45ed..d7d3273 100644
> > > --- a/src/lxc/lxccontainer.c
> > > +++ b/src/lxc/lxccontainer.c
> > > @@ -1403,7 +1403,7 @@ static bool add_to_array(char ***names,
> > > char *cname, int pos) return true;
> > >  }
> > >  
> > > -static bool add_to_clist(struct lxc_container ***list, struct
> > > lxc_container *c, int pos) +static bool add_to_clist(struct
> > > lxc_container ***list, struct lxc_container *c, int pos, bool
> > > sort) { struct lxc_container **newlist = realloc(*list, (pos+1) *
> > > sizeof(struct lxc_container *)); if (!newlist) {
> > > @@ -1415,7 +1415,8 @@ static bool add_to_clist(struct
> > > lxc_container ***list, struct lxc_container *c, newlist[pos] = c;
> > >  
> > >   // sort the arrray as we will use binary search on it
> > > - qsort(newlist, pos + 1, sizeof(struct lxc_container *),
> > > (int (*)(const void *,const void *))container_cmp);
> > > + if (sort)
> > > +         qsort(newlist, pos + 1, sizeof(struct
> > > lxc_container *), (int (*)(const void *,const void
> > > *))container_cmp); return true;
> > >  }
> > > @@ -3066,7 +3067,7 @@ int list_defined_containers(const char
> > > *lxcpath, char ***names, struct lxc_conta continue;
> > >           }
> > >  
> > > -         if (!add_to_clist(cret, c, nfound)) {
> > > +         if (!add_to_clist(cret, c, nfound, true)) {
> > >                   lxc_container_put(c);
> > >                   goto free_bad;
> > >           }
> > > @@ -3169,7 +3170,7 @@ int list_active_containers(const char
> > > *lxcpath, char ***names, struct lxc_contai
> > >            * fact that the command socket exists.
> > >            */
> > >  
> > > -         if (!add_to_clist(cret, c, nfound)) {
> > > +         if (!add_to_clist(cret, c, nfound, true)) {
> > >                   lxc_container_put(c);
> > >                   goto free_bad;
> > >           }
> > > @@ -3206,3 +3207,91 @@ free_bad:
> > >   process_unlock();
> > >   return -1;
> > >  }
> > > +
> > > +int list_all_containers(const char *lxcpath, char ***nret,
> > > +                 struct lxc_container ***cret)
> > > +{
> > > + int i, ret, active_cnt, ct_cnt, ct_list_cnt;
> > > + char **active_name;
> > > + char **ct_name;
> > > + struct lxc_container **ct_list = NULL;
> > > +
> > > + ct_cnt = list_defined_containers(lxcpath, &ct_name,
> > > NULL);
> > > + if (ct_cnt < 0)
> > > +         return ct_cnt;
> > > +
> > > + active_cnt = list_active_containers(lxcpath,
> > > &active_name, NULL);
> > > + if (active_cnt < 0) {
> > > +         ret = active_cnt;
> > > +         goto free_ct_name;
> > > + }
> > > +
> > > + for (i = 0; i < active_cnt; i++) {
> > > +         if (!array_contains(&ct_name, active_name[i],
> > > ct_cnt)) {
> > > +                 if (!add_to_array(&ct_name,
> > > active_name[i], ct_cnt)) {
> > > +                         ret = -1;
> > > +                         goto free_active_name;
> > > +                 }
> > > +                 ct_cnt++;
> > > +         }
> > > +         free(active_name[i]);
> > > +         active_name[i] = NULL;
> > > + }
> > > + free(active_name);
> > > + active_name = NULL;
> > > + active_cnt = 0;
> > > +
> > > + qsort(ct_name, ct_cnt, sizeof(char *),
> > > +       (int (*)(const void *,const void *))string_cmp);
> > 
> > Is this qsort needed?  list_defined_containers() and the
> > add_to_array()s above should each be keeping ct_name ordered if I'm
> > thinking right.
> > 
> > > +
> > > + for (i = 0, ct_list_cnt = 0; i < ct_cnt && cret; i++) {
> > > +         struct lxc_container *c;
> > > +
> > > +         c = lxc_container_new(ct_name[i], lxcpath);
> > > +         if (!c) {
> > > +                 WARN("Container %s:%s could not be
> > > loaded", lxcpath, ct_name[i]);
> > > +                 remove_from_array(&ct_name, ct_name[i],
> > > ct_cnt--);
> > > +                 continue;
> > > +         }
> > > +
> > > +         if (!add_to_clist(&ct_list, c, ct_list_cnt,
> > > false)) {
> > > +                 lxc_container_put(c);
> > > +                 ret = -1;
> > > +                 goto free_ct_list;
> > > +         }
> > > +         ct_list_cnt++;
> > > + }
> > > +
> > > + if (cret)
> > > +         *cret = ct_list;
> > > +
> > > + if (nret)
> > > +         *nret = ct_name;
> > > + else {
> > > +         ret = ct_cnt;
> > > +         goto free_ct_name;
> > > + }
> > > + return ct_cnt;
> > > +
> > > +free_ct_list:
> > > + for (i = 0; i < ct_list_cnt; i++) {
> > > +         lxc_container_put(ct_list[i]);
> > > + }
> > > + if (ct_list)
> > > +         free(ct_list);
> > > +
> > > +free_active_name:
> > > + for (i = 0; i < active_cnt; i++) {
> > > +         if (active_name[i])
> > > +                 free(active_name[i]);
> > > + }
> > > + if (active_name)
> > > +         free(active_name);
> > > +
> > > +free_ct_name:
> > > + for (i = 0; i < ct_cnt; i++) {
> > > +         free(ct_name[i]);
> > > + }
> > > + free(ct_name);
> > > + return ret;
> > > +}
> > > diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> > > index 762e1b0..486035a 100644
> > > --- a/src/lxc/lxccontainer.h
> > > +++ b/src/lxc/lxccontainer.h
> > > @@ -277,6 +277,16 @@ int list_defined_containers(const char
> > > *lxcpath, char ***names, struct lxc_conta */
> > >  int list_active_containers(const char *lxcpath, char ***names,
> > > struct lxc_container ***cret); 
> > > +/*
> > > + * Get an array sorted by name of defined and active containers
> > > in a lxcpath.
> > > + * @lxcpath: lxcpath under which to look
> > > + * @names: if not null, then an array of container names will be
> > > returned here.
> > > + * @cret: if not null, then an array of lxc_containers will be
> > > returned here.
> > > + *
> > > + * Returns the number of containers found, or -1 on error.
> > > + */
> > > +int list_all_containers(const char *lxcpath, char ***names,
> > > struct lxc_container ***cret); +
> > >  #if 0
> > >  char ** lxc_get_valid_keys();
> > >  char ** lxc_get_valid_values(char *key);
> > > -- 
> > > 1.8.3.1
> > > 
> > > 
> > > ------------------------------------------------------------------------------
> > > November Webinars for C, C++, Fortran Developers
> > > Accelerate application performance with scalable programming
> > > models. Explore techniques for threading, error checking,
> > > porting, and tuning. Get the most from the latest Intel
> > > processors and coprocessors. See abstracts and register
> > > http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
> > > _______________________________________________ Lxc-devel mailing
> > > list Lxc-devel@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/lxc-devel
> > 
> > ------------------------------------------------------------------------------
> > November Webinars for C, C++, Fortran Developers
> > Accelerate application performance with scalable programming
> > models. Explore techniques for threading, error checking, porting,
> > and tuning. Get the most from the latest Intel processors and
> > coprocessors. See abstracts and register
> > http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
> > _______________________________________________ Lxc-devel mailing
> > list Lxc-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/lxc-devel


------------------------------------------------------------------------------
November Webinars for C, C++, Fortran Developers
Accelerate application performance with scalable programming models. Explore
techniques for threading, error checking, porting, and tuning. Get the most 
from the latest Intel processors and coprocessors. See abstracts and register
http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to