Spec-Zone.ru › SQLite

Объект методов Mutex

typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
struct sqlite3_mutex_methods {
  int (*xMutexInit)(void);
  int (*xMutexEnd)(void);
  sqlite3_mutex *(*xMutexAlloc)(int);
  void (*xMutexFree)(sqlite3_mutex *);
  void (*xMutexEnter)(sqlite3_mutex *);
  int (*xMutexTry)(sqlite3_mutex *);
  void (*xMutexLeave)(sqlite3_mutex *);
  int (*xMutexHeld)(sqlite3_mutex *);
  int (*xMutexNotheld)(sqlite3_mutex *);
};

Экземпляр этой структуры определяет низкоуровневые функции, используемые для выделения и использования мьютексов.

Обычно, стандартные реализации мьютексов, предоставляемые SQLite, являются достаточными, однако приложение может заменить пользовательской реализацией для специализированных развертываний или систем, для которых SQLite не предоставляет подходящей реализации. В этом случае приложение создаёт и заполняет экземпляр этой структуры, чтобы передать его в sqlite3_config() вместе с параметром SQLITE_CONFIG_MUTEX. Кроме того, экземпляр этой структуры может быть использован как переменная вывода при запросе текущей реализации мьютекса у системы, используя параметр SQLITE_CONFIG_GETMUTEX.

Метод xMutexInit, определённый в этой структуре, вызывается в рамках инициализации системы функцией sqlite3_initialize(). Функция xMutexInit вызывается SQLite ровно один раз для каждого эффективного вызова sqlite3_initialize().

Метод xMutexEnd, определённый в этой структуре, вызывается в рамках завершения системы функцией sqlite3_shutdown(). Реализация этого метода должна освободить все заблокированные ресурсы, полученные реализацией методов мьютекса, особенно те, которые были получены методом xMutexInit. Интерфейс xMutexEnd() вызывается ровно один раз для каждого вызова sqlite3_shutdown().

Остальные семь методов, определённые в этой структуре (xMutexAlloc, xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld и xMutexNotheld), реализуют следующие интерфейсы (соответственно):

  • sqlite3_mutex_alloc()
  • sqlite3_mutex_free()
  • sqlite3_mutex_enter()
  • sqlite3_mutex_try()
  • sqlite3_mutex_leave()
  • sqlite3_mutex_held()
  • sqlite3_mutex_notheld()

Единственное отличие заключается в том, что общедоступные функции sqlite3_XXX, перечисленные выше, безмолвно игнорируют любые вызовы, которые передают указатель NULL вместо действительной дескриптора мьютекса. Реализации методов, определённых в этой структуре, не обязаны обрабатывать этот случай. Результаты передачи указателя NULL вместо действительного дескриптора мьютекса не определены (т. е. допустимо предоставить реализацию, которая даёт ошибку сегментации, если ей передаётся указатель NULL).

Метод xMutexInit() должен быть потокобезопасным. Вызов xMutexInit() несколько раз в одном процессе без промежуточных вызовов xMutexEnd() не должен приводить к ошибкам. Повторные вызовы xMutexInit() должны быть бездействующими.

xMutexInit() не должен использовать выделение памяти SQLite (sqlite3_malloc() и связанные с ним функции). Аналогично, xMutexAlloc() не должен использовать выделение памяти SQLite для статического мьютекса. Однако xMutexAlloc() может использовать выделение памяти SQLite для быстрого или рекурсивного мьютекса.

SQLite вызовет метод xMutexEnd(), когда будет вызван sqlite3_shutdown(), но только если предыдущий вызов xMutexInit вернул SQLITE_OK. Если xMutexInit завершится с ошибкой, ожидается, что он очистит за собой перед возвратом.

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

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

Spec-Zone.ru

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