
On Mon, 2008-04-28 at 03:39 -0400, Daniel Veillard wrote:
#define VIR_REALLOC(ptr) virRealloc(&(ptr), sizeof(*(ptr)))
That i really don't understand. How do you expect to use that realloc without passing a new size.
#define VIR_REALLOC_N(ptr, count) virReallocN(&(ptr), sizeof(*(ptr)), (count))
That I can understand , but the previous one i can't.
#define VIR_FREE(ptr) virFree(&(ptr)) [...] Much less ugly:
if (VIR_ALLOC_N(guest->arch.defaultInfo.machines, nmachines) < 0) return -1;
if (VIR_REALLOC(migrateTrans, caps->host.nmigrateTrans+1) < 0) return -1;
how does sizeof(*(caps->host.nmigrateTrans+1)) increases the size ? Doesn't make sense to me, you take a pointer, increment it, so basically just pointing to the next element in the array, but the size of the pointed object would be identical and realloc() becomes a noop.
The proposal may help clean a lot of things, but VIR_REALLOC I don't understand, what did i missed ?
Looks to me like VIR_REALLOC() would be a rarely used API and Dan just had a typo in the above example - it should have used VIR_REALLOC_N() I'm having difficulty thinking of how VIR_REALLOC() might be interesting - e.g. the highly contrived example below. Cheers, Mark. struct foo { int i; }; struct bar { struct foo foo; int j; } struct foo *get_foo(int i) { struct foo *foo; if (!VIR_ALLOC(foo)) return NULL; foo->i = i; return foo; } struct bar *get_bar(int i, int j) { struct bar *bar; struct foo *foo; if (!(foo = get_foo(i))) return NULL; bar = (struct bar *) foo; if (!VIR_REALLOC(bar)) { VIR_FREE(foo); return NULL; } bar->j = j; return bar; }