Re: Persistence problem

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "I(dot) B(dot)" <i(dot)bre(at)live(dot)com>
Cc: kleptog(at)svana(dot)org, dalroi(at)solfertje(dot)student(dot)utwente(dot)nl, pgsql-general(at)postgresql(dot)org
Subject: Re: Persistence problem
Date: 2010-05-14 22:34:14
Message-ID: 24615.1273876454@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

"I. B." <i(dot)bre(at)live(dot)com> writes:
> OK, here is the part of the code.

Well, as suspected, you're doing this

> typedef struct {
> void *units;
> } mapping_t;

and this

> units = (uPoint *) realloc(units, result->noOfUnits * sizeof(uPoint)); // EXPLAINED AT THE END OF THE POST

which means that the array isn't contiguous with the mPoint struct.
You can certainly do that and then rearrange things to make it so
afterwards, but you're not doing so now. Personally though I'd avoid
having two different representations. You'd be better off with

typedef struct {
int4 length;
int noOfUnits;
uPoint units[1]; /* actually, a variable length array */
} mPoint;

and then allocating or reallocating the result struct with a size
calculation like this:

offsetof(mPoint, units) + noOfUnits * sizeof(uPoint)

BTW, realloc (as opposed to repalloc) doesn't seem like a tremendously
good idea here. You are leaking that memory for the life of the session.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Stephen Frost 2010-05-14 22:36:27 Re: Poor query performance on one of two "like" databases in production.
Previous Message I. B. 2010-05-14 22:08:22 Re: Persistence problem