Sqlite 3.7.10 и статическое связывание в Delphi - PullRequest
4 голосов
/ 18 января 2012

В последней версии Sqlite (3.7.10) требуется связать функцию __msize, и поскольку менеджер памяти Delphi не может сообщить размер блока памяти, мне пришлось ввести хак (совместимый с d5)

function __msize(p: pointer): Cardinal;cdecl;
begin
  Result:=PInteger(integer(p)-4)^-6;
end;

Есть ли другие решения внутри Sqlite (определяет?) Или Delphi, чтобы исправить это, чтобы не было никаких недокументированных возможностей.

Ответы [ 2 ]

8 голосов
/ 18 января 2012

Вокруг строки # 15195 в исходном коде прокомментируйте следующие строки:

/*
** Windows systems have malloc_usable_size() but it is called _msize()
*/
#if !defined(HAVE_MALLOC_USABLE_SIZE) && SQLITE_OS_WIN
# define HAVE_MALLOC_USABLE_SIZE 1
# define malloc_usable_size _msize
#endif

в

/*
** Windows systems have malloc_usable_size() but it is called _msize()
#if !defined(HAVE_MALLOC_USABLE_SIZE) && SQLITE_OS_WIN
# define HAVE_MALLOC_USABLE_SIZE 1
# define malloc_usable_size _msize
#endif
*/

Он отключит повторное использование памяти в SQLite3 malloc и будет опираться на лучшую реализацию FastMM4 reallocmem ().

См. этот коммит например. для нашей реализации с открытым исходным кодом статического связывания SQLite3.

Дополнительная информация:

Я думаю, что мы избавимся от этой проблемы в 3.7.11, как указано этим коммитом : будет добавлен новый глобальный символ SQLITE_WITHOUT_MSIZE, который сможет создать объединение исходный код без изменения его содержимого, просто установив соответствующий SQLITE_WITHOUT_MSIZE define. Между тем проще всего прокомментировать приведенные выше строки.

2 голосов
/ 19 января 2012

Вы можете использовать SizeOfMem из JCL JclSysUtils unit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...