Re: [lxc-devel] [PATCH] do not allocate lxc_snapshot array if NULL is passed into snapshot_list as a ret_snaps parameter.

2013-10-15 Thread S . Çağlar Onur
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 

[lxc-devel] [PATCH] do not allocate lxc_snapshot array if NULL is passed into snapshot_list as a ret_snaps parameter.

2013-10-14 Thread S . Çağlar Onur
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


--
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=60135031iu=/4140/ostg.clktrk
___
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel