Spec-Zone.ru › SQLite

Процедуры распределения памяти

typedef struct sqlite3_mem_methods sqlite3_mem_methods;
struct sqlite3_mem_methods {
  void *(*xMalloc)(int);         /* Memory allocation function */
  void (*xFree)(void*);          /* Free a prior allocation */
  void *(*xRealloc)(void*,int);  /* Resize an allocation */
  int (*xSize)(void*);           /* Return the size of an allocation */
  int (*xRoundup)(int);          /* Round up request size to allocation size */
  int (*xInit)(void*);           /* Initialize the memory allocator */
  void (*xShutdown)(void*);      /* Deinitialize the memory allocator */
  void *pAppData;                /* Argument to xInit() and xShutdown() */
};

Экземпляр этого объекта определяет интерфейс между SQLite и процедурами распределения памяти низкого уровня.

Этот объект используется только в одном месте в интерфейсе SQLite. Указатель на экземпляр этого объекта является аргументом для sqlite3_config(), когда опция конфигурации равна SQLITE_CONFIG_MALLOC или SQLITE_CONFIG_GETMALLOC. Создав экземпляр этого объекта и передав его в sqlite3_config(SQLITE_CONFIG_MALLOC) во время конфигурации, приложение может указать альтернативную систему распределения памяти для SQLite, которую следует использовать для всех его динамических потребностей памяти.

Обратите внимание, что SQLite поставляется с несколькими встроенными распределятелями памяти, которые идеально подходят для подавляющего большинства приложений, и что этот объект полезен только для небольшой части приложений со специализированными требованиями к распределению памяти. Этот объект также используется во время тестирования SQLite для указания альтернативного распределятеля памяти, который моделирует ситуации с нехваткой памяти, чтобы проверить, как SQLite восстанавливается из таких ситуаций.

Методы xMalloc, xRealloc и xFree должны работать так же, как функции malloc(), realloc() и free() из стандартной библиотеки C. SQLite гарантирует, что второй аргумент xRealloc всегда является значением, возвращаемым предыдущим вызовом xRoundup.

xSize должен возвращать размер выделенной памяти, ранее полученной из xMalloc или xRealloc. Размер выделенной памяти всегда не меньше запрошенного размера, но может быть больше.

Метод xRoundup возвращает размер выделенной памяти, учитывая конкретный запрашиваемый размер. Большинство распределятелей памяти округляют выделение памяти до следующего кратного 8. Некоторые распределятели округляют до большего кратного или до степени двойки. Каждый запрос на выделение памяти, поступающий через sqlite3_malloc() или sqlite3_realloc(), сначала вызывает xRoundup. Если xRoundup возвращает 0, это приводит к отказу соответствующего выделения памяти.

Метод xInit инициализирует распределятель памяти. Например, он может выделить необходимые мьютексы или инициализировать внутренние структуры данных. Метод xShutdown вызывается (косвенно) sqlite3_shutdown() и должен освободить все ресурсы, полученные методом xInit. Указатель pAppData используется в качестве единственного параметра для xInit и xShutdown.

SQLite удерживает мьютекс SQLITE_MUTEX_STATIC_MAIN при вызове метода xInit, поэтому метод xInit не должен быть потокобезопасным. Метод xShutdown вызывается только из sqlite3_shutdown(), поэтому он также не должен быть потокобезопасным. Для всех остальных методов SQLite удерживает мьютекс SQLITE_MUTEX_STATIC_MEM, пока включена опция конфигурации SQLITE_CONFIG_MEMSTATUS (по умолчанию она включена), и поэтому методы автоматически сериализуются. Однако, если SQLITE_CONFIG_MEMSTATUS отключена, то другие методы должны быть потокобезопасными или же обеспечивать собственную сериализацию.

SQLite никогда не вызовет xInit() более одного раза без предварительного вызова xShutdown().

См. также списки объектов, констант и функций.

SQLite is in the Public Domain.
https://sqlite.org/c3ref/mem_methods.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API