RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Режимы выделения памяти

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. Некоторые распределители округляют к большему кратному числу или к степени 2. Каждый запрос выделения памяти, входящий через sqlite3_malloc() или sqlite3_realloc(), сначала вызывает xRoundup. Если xRoundup вернет 0, это заставляет соответствующее выделение памяти терпеть неудачу.

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

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

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