![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Экземпляр этой структуры определяет код
низкого уровня, используемый, чтобы ассигновать и использовать mutex. Обычно mutex, обеспеченный SQLite, достаточен, однако у приложения есть
выбор замены пользовательской реализацией для специализированного
развертывания или систем, для которых SQLite не обеспечивает подходящее
внедрение. В этом случае приложение создает и заполняет экземпляр
этой структуры, чтобы передать sqlite3_config() наряду с выбором
SQLITE_CONFIG_MUTEX.
Кроме того, экземпляр этой структуры может использоваться в качестве выходной
переменной, запрашивая систему для текущей реализации mutex, используя
опцию SQLITE_CONFIG_GETMUTEX. Метод xMutexInit, определенный этой структурой, вызван как часть системной
инициализации функции sqlite3_initialize(). xMutexInit вызывает SQLite точно
однажды для каждого эффективного вызова
sqlite3_initialize(). Метод xMutexEnd, определенный этой структурой, вызван как часть завершения
работы системного sqlite3_shutdown(). Внедрение этого метода, как ожидают,
высвободит все выдающиеся средства, полученные mutex внедрением методов,
особенно полученные xMutexInit. Интерфейс xMutexEnd() вызван точно однажды
для каждого sqlite3_shutdown(). Остальные семь методов, определенные этой структурой (xMutexAlloc,
xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld и
xMutexNotheld) осуществляет следующие интерфейсы (соответственно): Единственная разница: то, что функции public sqlite3_XXX, перечисленные
выше, тихо игнорируют любые вызовы, которые передают NULL
вместо действительного дескриптора mutex.
Внедрения методов, определенных этой структурой, не требуются, чтобы
обращаться с этим случаем. Результаты прохождения NULL
вместо действительного дескриптора mutex
не определены (то есть приемлемо обеспечить внедрение, которое выдаст
segfaults, если это передает NULL). xMutexInit() должен быть ориентирован на многопотоковое исполнение.
Это должно быть безопасно, чтобы вызвать xMutexInit()
многократно в рамках того же самого процесса и без прошедших вызовов
xMutexEnd(). Вторые и последующие обращения к
xMutexInit() не должны ничего делать. xMutexInit() не должен использовать выделение памяти SQLite
(sqlite3_malloc()).
Точно так же xMutexAlloc() не должен использовать выделение памяти SQLite для
статического mutex. Однако, xMutexAlloc() может использовать выделение памяти
SQLite для быстрого или рекурсивного mutex. SQLite вызовет xMutexEnd() когда вызван
sqlite3_shutdown(),
но только если предшествующий вызов xMutexInit вернул SQLITE_OK.
Если xMutexInit потерпит неудачу в каком-либо случае, он, как ожидают,
зачистит все ресурсы после себя до возвращения. Тип sqlite3_pcache непрозрачен. Это осуществляется pluggable модулем.
Ядро SQLite не знает о своем размере или внутренней структуре и никогда не
имеет дело с объектом sqlite3_pcache кроме хранения и передачи
указателей на него.
Choose any three.
SQLite C Interface
Методы объекта 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 *);
};
Объект заказного кэша страниц
typedef struct sqlite3_pcache sqlite3_pcache;