Hi,
I just realized that the only reason of not being able to pass native data
types to C world was my mistake so I believe you can ignore this patch :)
Best,
On Tue, Oct 15, 2013 at 12:32 AM, S.Çağlar Onur <cag...@10ur.org> wrote:
> All the other (similar) API calls behaves this way, aka passing NULL
> returns the count.
> This patch both provides consistency to calling conventions and
> also may make binding's life little easier cause we need to call those
> function two times.
> First to get the length and then get the data itself. This is required
> because we cannot
> pass our native data types directly to C world, at least Go can't for now.
>
> Right now a function that returns size only has to do something like that
> to free returned array;
>
> int i;
> struct lxc_snapshot *s;
>
> int n = c->snapshot_list(c, &s);
> if (n < 1)
> return 0;
>
> for (i = 0; i < n; i++) {
> s[i].free(&s[i]);
> }
> free(s);
> return n;
>
> whereas following should be enough.
>
> return c->snapshot_list(c, NULL);
> ---
> src/lxc/lxccontainer.c | 37 ++++++++++++++++++++-----------------
> src/lxc/lxccontainer.h | 4 ++--
> 2 files changed, 22 insertions(+), 19 deletions(-)
>
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 6f97879..391e4cd 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -2516,23 +2516,25 @@ static int lxcapi_snapshot_list(struct
> lxc_container *c, struct lxc_snapshot **r
> }
> if (!file_exists(path2))
> continue;
> - nsnaps = realloc(snaps, (count + 1)*sizeof(*snaps));
> - if (!nsnaps) {
> - SYSERROR("Out of memory");
> - goto out_free;
> - }
> - snaps = nsnaps;
> - snaps[count].free = lxcsnap_free;
> - snaps[count].name = strdup(direntp->d_name);
> - if (!snaps[count].name)
> - goto out_free;
> - snaps[count].lxcpath = strdup(snappath);
> - if (!snaps[count].lxcpath) {
> - free(snaps[count].name);
> - goto out_free;
> + if(ret_snaps != NULL) {
> + nsnaps = realloc(snaps, (count +
> 1)*sizeof(*snaps));
> + if (!nsnaps) {
> + SYSERROR("Out of memory");
> + goto out_free;
> + }
> + snaps = nsnaps;
> + snaps[count].free = lxcsnap_free;
> + snaps[count].name = strdup(direntp->d_name);
> + if (!snaps[count].name)
> + goto out_free;
> + snaps[count].lxcpath = strdup(snappath);
> + if (!snaps[count].lxcpath) {
> + free(snaps[count].name);
> + goto out_free;
> + }
> + snaps[count].comment_pathname =
> get_snapcomment_path(snappath, direntp->d_name);
> + snaps[count].timestamp = get_timestamp(snappath,
> direntp->d_name);
> }
> - snaps[count].comment_pathname =
> get_snapcomment_path(snappath, direntp->d_name);
> - snaps[count].timestamp = get_timestamp(snappath,
> direntp->d_name);
> count++;
> }
>
> @@ -2541,7 +2543,8 @@ static int lxcapi_snapshot_list(struct lxc_container
> *c, struct lxc_snapshot **r
> WARN("failed to close directory");
> process_unlock();
>
> - *ret_snaps = snaps;
> + if (ret_snaps != NULL)
> + *ret_snaps = snaps;
> return count;
>
> out_free:
> diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> index 5901066..bb77126 100644
> --- a/src/lxc/lxccontainer.h
> +++ b/src/lxc/lxccontainer.h
> @@ -197,12 +197,12 @@ struct lxc_container {
>
> /*
> * snapshot_list() will return a description of all snapshots of c
> in
> - * a simple array. See src/tests/snapshot.c for the proper way to
> + * a simple array, if ret_snaps is not null. See
> src/tests/snapshot.c for the proper way to
> * free the allocated results.
> *
> * Returns the number of snapshots.
> */
> - int (*snapshot_list)(struct lxc_container *, struct lxc_snapshot
> **);
> + int (*snapshot_list)(struct lxc_container *c, struct lxc_snapshot
> **ret_snaps);
>
> /*
> * snapshot_restore() will create a new container based on a
> snapshot.
> --
> 1.8.1.2
>
>
--
S.Çağlar Onur <cag...@10ur.org>
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135031&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel