Sqlite源码解读(七)

本文详细解析了SQLite在Windows CE平台上的源码,重点介绍了如何获取和释放锁,以及创建和销毁用于文件锁定的互斥体和共享内存。通过winceMutexAcquire和winceMutexRelease实现锁的获取和释放,winceCreateLock用于创建锁,而winceDestroyLock则负责销毁。此外,还展示了LockFile和UnlockFile的WinCE特定实现。
摘要由CSDN通过智能技术生成

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);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值