Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

подтекает память ( из UDF ? )

$
0
0
Стоит на линуксе firebird2.5-super-server 2.5.0.26054 - текущая последняя версия из дистрибутива дебиан 7.
Некоторое время назад размер процессов начал расти. Подтекает весьма интенсивно. В сутки 1-1.5 гб. Так что уже приходится перезапускать процесс.

Конфиг firebird.conf почти не трогался даже. Там только насчет UDF изменения.
Про то, что можно для каждой базы поменять настройки памяти никто в этой инсталляции не знает даже. То есть, все дефолтное.
Очевидная причина - самописные UDF.
Как бы определить утекает она из-за особенностей UDF или просто растет потому что так и должно быть ?

В базе всегда были UDF . библиотечка называлась ibu.c и меня уверяют, что все написано по канонам.
Код, вероятно, общеизвестный . Есть выделение памяти :
void* ib_util_malloc(long size)
{
        return malloc(size);
}

и такого рода несколько процедур, где этот malloc потом используется:
char * upcase(const char *s)
{
  if (!s)
    return 0;

  char* buf = (char *) ib_util_malloc(strlen(s) + 1);
  char* p = buf;
  while (*s)
  {

..
  *p = '\0';
  return buf;
}

Однако мне не понятно каким образом эта память должна освобождаться.
FB получает результат, использует, а дальше что ?
Это вообще правильно написано ?

допустим, я нашел примеры написания udf,
там в том же ключе функции написаны. например такое :
+

/*====================================================================
  File Name:	udflib.c
  Description:
  This module contains some user defined functions (UDF).  
  The test suite for UDF will use udf.sql
  to define UDF to the database using SQL statements.
 * The contents of this file are subject to the Interbase Public


....
char* EXPORT fn_lower_c(char* s) /* VARCHAR input */
{
	char *buf;
	short length = 0;

	char *buffer = (char *)malloc(256);

	length = (short)*s;
	s += 2;
	buf = buffer;
	while (*s)
		if (*s >= 'A' && *s <= 'Z')
			*buf++ = *s++ - 'A' + 'a';
		else
			*buf++ = *s++;

	*buf = '\0';
	buffer [length] = '\0';

	return buffer;
}



Но кто обещал что примеры udf правильные ? какие еще могут быть причины ?

Куда теперь копать ?

Viewing all articles
Browse latest Browse all 1677

Trending Articles