接着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