Server Programming in C: palloc() and pfree()

From: Rodrigo Hjort <rodrigo(dot)hjort(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Server Programming in C: palloc() and pfree()
Date: 2006-02-09 18:16:51
Message-ID: 731083980602091016v6b894306y@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I'm having some problems when using "pfree()" on functions in C.
Calling it on "psql" gives the exception below on both versions of function
"insert()" [1,2] if "pfree()" is enabled:

server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
conexão com servidor foi perdida
(connection to the server was lost)

The strange is that it doesn't happen with the function "delstr()" [3],
which has "pfree()".
What could am I doing wrong?

// 1)
void insert(char *str, const int start, const char *piece)
{
int lstr = strlen(str);
int lnew = lstr + strlen(piece) + 1;
char* temp = palloc(lnew);
memset((void*) temp, 0, lnew);

/*
FILE *debug;
debug = fopen("/dev/xconsole", "w");
fprintf(debug, "insert('%s', %d, '%s')\n", str, start, piece);
//fprintf(debug, "0) '%s'\n", temp);
*/

if (start <= lstr + 1)
{
strncpy(temp, str, start - 1);
strcat(temp, piece);
char* ptr = str + start - 1;
strcat(temp, ptr);
strcpy(str, temp);
}
// pfree(temp); // <-- here it doesn't work...

/*
fprintf(debug, "-> '%s'\n", str);
fflush(debug);
fclose(debug);
*/
}

// 2)
void insert(char *str, const int start, const char *piece)
{
int i, j;
char* temp = palloc(strlen(str) + strlen(piece) + 1);

if (start - 1 <= strlen(str))
{
for (i = 0; i < start - 1; i++)
temp[i] = str[i];

for (j = i; j < strlen(piece) + i; j++)
temp[j] = piece[j - i];

for (; i < strlen(str); i++, j++)
temp[j] = str[i];

temp[j] = '\0';
strcpy(str, temp);
}
// pfree(temp); // doesn't work...
}

// 3)
void delstr(char *str, const int start, const int size)
{
int i, j;
char* temp = palloc(strlen(str) - size + 1);

for (i = 0; (i < start - 1) && (i < strlen(str)); i++)
temp[i] = str[i];

for (j = start + size - 1; j < strlen(str); i++, j++)
temp[i] = str[j];

temp[i] = '\0';
strcpy(str, temp);
pfree(temp); // <-- here it works!
}

--

Regards,

Rodrigo Hjort
GTI - Projeto PostgreSQL
CELEPAR - Cia de Informática do Paraná
http://www.pr.gov.br

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Jim C. Nasby 2006-02-09 18:18:58 Re: streamlined standby procedure
Previous Message Tom Lane 2006-02-09 18:13:17 Re: PostgreSQL 8.0.6 crash