Sqlite源码解读(十一)

本文详细解析了SQLite在Windows系统中对共享内存的管理,包括连接的建立、关闭、内存屏障以及映射和取消映射等操作,涉及到互斥锁、引用计数等关键机制。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

接着winShmNode继续讲。

PShmNode上的引用计数已经在winShmEnterMutex()互斥体的覆盖下递增,并且指向pShmNode的新对象的指针已经设置。剩下要做的就是将新对象链接到从pShmNode->pFirst开始的链接列表中,这必须在持有pShmNode->mutex互斥时完成。

  sqlite3_mutex_enter(pShmNode->mutex);

  p->pNext = pShmNode->pFirst;

  pShmNode->pFirst = p;

  sqlite3_mutex_leave(pShmNode->mutex);

  return rc;

跳到任何错误上

shm_open_err:

  winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);

  winShmPurge(pDbFd->pVfs, 0);      /* 如果需要的话,此调用将释放pShmNode */

  sqlite3_free(p);

  sqlite3_free(pNew);

  winShmLeaveMutex();

  return rc;

}

关闭到共享内存的连接。如果删除标志为true,则删除底层存储。

static int winShmUnmap(

  sqlite3_file *fd,             /*持有共享内存的数据库 */

  int deleteFlag              /* 如果true则在关闭后删除 */

){

  winFile *pDbFd;            /* 持有共享内存的数据库*/

  winShm *p;               /*将要关闭的连接*/

  winShmNode *pShmNode;  /* 底层的共享内存文件 */

  winShm **pp;             /* 在兄弟连接上循环 */

  pDbFd = (winFile*)fd;

  p = pDbFd->pShm;

  if( p==0 ) return SQLITE_OK;

  pShmNode = p->pShmNode;

从与pShmNode关联的一组连接中删除连接p

sqlite3_mutex_enter(pShmNode->mutex);

  for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}

  *pp = p->pNext;

释放连接P

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路过好

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

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

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

打赏作者

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

抵扣说明:

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

余额充值