2021SC@SDUSC
上次讲了各种字符串相互转换的方法及对应的公共包装器,接下来将讲解SQLITE_OS_WINCE,即sqlite在操作系统WinCE上的代码。
获取手柄上的锁
static void winceMutexAcquire(HANDLE h){
DWORD dwErr;
do {
dwErr = osWaitForSingleObject(h, INFINITE);
} while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED);
}
释放锁
#define winceMutexRelease(h) ReleaseMutex(h)
创建用于锁定文件描述符Pfile的互斥和共享内存
static int winceCreateLock(const char *zFilename, winFile *pFile){
LPWSTR zTok;
LPWSTR zName;
DWORD lastErrno;
BOOL bLogged = FALSE;
BOOL bInit = TRUE;
zName = winUtf8ToUnicode(zFilename);
if( zName==0 ){
/*内存不足*/
return SQLITE_IOERR_NOMEM_BKPT;
}
/*初始化本地锁数据*/
memset(&pFile->local, 0, sizeof(pFile->local));
替换文件名中的反斜杠,并将其小写以派生互斥名称。
zTok = osCharLowerW(zName);
for (;*zTok;zTok++){
if (*zTok == '\\') *zTok = '_';
}
创建或打开命名的互斥体
pFile->hMutex = osCreateMutexW(NULL, FALSE, zName);
if (!pFile->hMutex){
pFile->lastErrno = osGetLastError();
sqlite3_free(zName);
return winLogError(SQLITE_IOERR, pFile->lastErrno, "winceCreateLock1", zFilename);
}
/*在继续下一步之前获取互斥体*/
winceMutexAcquire(pFile->hMutex);
注:由于命名互斥体、信号量、文件映射等的名称都是区分大小写的,因此可以利用这一点,将互斥名称大写,并将其用作共享的文件映射名称。
osCharUpperW(zName);
pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, sizeof(winceLock),
zName);