mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
Additional field name changes and commit fixes associated with shared-memory
locking in the unix VFS, to improve maintainability. No logic changes. FossilOrigin-Name: 9280774a4bbc665d70f346d258768cbcca3e0e77791473aecfd7d0e87810ab31
This commit is contained in:
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\scomments\sand\srefactor\ssome\snames\sassociated\swith\sshared-memory\slocking\nin\sthe\sUnix\sVFS.\s\sNo\slogical\schanges.
|
C Additional\sfield\sname\schanges\sand\scommit\sfixes\sassociated\swith\sshared-memory\nlocking\sin\sthe\sunix\sVFS,\sto\simprove\smaintainability.\s\sNo\slogic\schanges.
|
||||||
D 2018-10-02T19:36:40.212
|
D 2018-10-02T19:58:08.325
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F Makefile.in 01e95208a78b57d056131382c493c963518f36da4c42b12a97eb324401b3a334
|
F Makefile.in 01e95208a78b57d056131382c493c963518f36da4c42b12a97eb324401b3a334
|
||||||
@@ -487,7 +487,7 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de
|
|||||||
F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
|
F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432
|
||||||
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
|
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
|
||||||
F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
|
F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
|
||||||
F src/os_unix.c 3acd41af1334d7d2af8ca8ce684ccc73eeab7fe907ddab630963fd54102b4be4
|
F src/os_unix.c fd755a51cc621b14c6b5816912e8e103ccc28c46d64f8173f22ba992ddbe9fd3
|
||||||
F src/os_win.c 070cdbb400097c6cda54aa005356095afdc2f3ee691d17192c54724ef146a971
|
F src/os_win.c 070cdbb400097c6cda54aa005356095afdc2f3ee691d17192c54724ef146a971
|
||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b
|
F src/pager.c a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b
|
||||||
@@ -1770,7 +1770,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P defa0515b8fd50ed9be699542f8c6695dd4a60c02f310665db6657ec5b6b67d0
|
P 3e9f1635271c92dce5324728b4ee1cc1a1856ec3c60b1b512a652c21e010e63e
|
||||||
R 9097a8d83ca39760ec0a01128c0dade1
|
R 4c540d033fc87107981e8569f09af526
|
||||||
U drh
|
U drh
|
||||||
Z 3fc014f602248e5c82ae5fe3e9828c74
|
Z d5d2b74c6598d9bd4b46abde946440e8
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
3e9f1635271c92dce5324728b4ee1cc1a1856ec3c60b1b512a652c21e010e63e
|
9280774a4bbc665d70f346d258768cbcca3e0e77791473aecfd7d0e87810ab31
|
||||||
@@ -4215,10 +4215,10 @@ static int unixGetpagesize(void){
|
|||||||
**
|
**
|
||||||
** The following fields are read-only after the object is created:
|
** The following fields are read-only after the object is created:
|
||||||
**
|
**
|
||||||
** fid
|
** hShm
|
||||||
** zFilename
|
** zFilename
|
||||||
**
|
**
|
||||||
** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and
|
** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and
|
||||||
** unixMutexHeld() is true when reading or writing any other field
|
** unixMutexHeld() is true when reading or writing any other field
|
||||||
** in this structure.
|
** in this structure.
|
||||||
*/
|
*/
|
||||||
@@ -4226,7 +4226,7 @@ struct unixShmNode {
|
|||||||
unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
|
unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
|
||||||
sqlite3_mutex *pShmMutex; /* Mutex to access this object */
|
sqlite3_mutex *pShmMutex; /* Mutex to access this object */
|
||||||
char *zFilename; /* Name of the mmapped file */
|
char *zFilename; /* Name of the mmapped file */
|
||||||
int h; /* Open file descriptor */
|
int hShm; /* Open file descriptor */
|
||||||
int szRegion; /* Size of shared-memory regions */
|
int szRegion; /* Size of shared-memory regions */
|
||||||
u16 nRegion; /* Size of array apRegion */
|
u16 nRegion; /* Size of array apRegion */
|
||||||
u8 isReadonly; /* True if read-only */
|
u8 isReadonly; /* True if read-only */
|
||||||
@@ -4295,13 +4295,13 @@ static int unixShmSystemLock(
|
|||||||
/* Locks are within range */
|
/* Locks are within range */
|
||||||
assert( n>=1 && n<=SQLITE_SHM_NLOCK );
|
assert( n>=1 && n<=SQLITE_SHM_NLOCK );
|
||||||
|
|
||||||
if( pShmNode->h>=0 ){
|
if( pShmNode->hShm>=0 ){
|
||||||
/* Initialize the locking parameters */
|
/* Initialize the locking parameters */
|
||||||
f.l_type = lockType;
|
f.l_type = lockType;
|
||||||
f.l_whence = SEEK_SET;
|
f.l_whence = SEEK_SET;
|
||||||
f.l_start = ofst;
|
f.l_start = ofst;
|
||||||
f.l_len = n;
|
f.l_len = n;
|
||||||
rc = osSetPosixAdvisoryLock(pShmNode->h, &f, pFile);
|
rc = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile);
|
||||||
rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
|
rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4375,16 +4375,16 @@ static void unixShmPurge(unixFile *pFd){
|
|||||||
assert( p->pInode==pFd->pInode );
|
assert( p->pInode==pFd->pInode );
|
||||||
sqlite3_mutex_free(p->pShmMutex);
|
sqlite3_mutex_free(p->pShmMutex);
|
||||||
for(i=0; i<p->nRegion; i+=nShmPerMap){
|
for(i=0; i<p->nRegion; i+=nShmPerMap){
|
||||||
if( p->h>=0 ){
|
if( p->hShm>=0 ){
|
||||||
osMunmap(p->apRegion[i], p->szRegion);
|
osMunmap(p->apRegion[i], p->szRegion);
|
||||||
}else{
|
}else{
|
||||||
sqlite3_free(p->apRegion[i]);
|
sqlite3_free(p->apRegion[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_free(p->apRegion);
|
sqlite3_free(p->apRegion);
|
||||||
if( p->h>=0 ){
|
if( p->hShm>=0 ){
|
||||||
robust_close(pFd, p->h, __LINE__);
|
robust_close(pFd, p->hShm, __LINE__);
|
||||||
p->h = -1;
|
p->hShm = -1;
|
||||||
}
|
}
|
||||||
p->pInode->pShmNode = 0;
|
p->pInode->pShmNode = 0;
|
||||||
sqlite3_free(p);
|
sqlite3_free(p);
|
||||||
@@ -4426,7 +4426,7 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){
|
|||||||
lock.l_start = UNIX_SHM_DMS;
|
lock.l_start = UNIX_SHM_DMS;
|
||||||
lock.l_len = 1;
|
lock.l_len = 1;
|
||||||
lock.l_type = F_WRLCK;
|
lock.l_type = F_WRLCK;
|
||||||
if( osFcntl(pShmNode->h, F_GETLK, &lock)!=0 ) {
|
if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) {
|
||||||
rc = SQLITE_IOERR_LOCK;
|
rc = SQLITE_IOERR_LOCK;
|
||||||
}else if( lock.l_type==F_UNLCK ){
|
}else if( lock.l_type==F_UNLCK ){
|
||||||
if( pShmNode->isReadonly ){
|
if( pShmNode->isReadonly ){
|
||||||
@@ -4434,7 +4434,7 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){
|
|||||||
rc = SQLITE_READONLY_CANTINIT;
|
rc = SQLITE_READONLY_CANTINIT;
|
||||||
}else{
|
}else{
|
||||||
rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1);
|
rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1);
|
||||||
if( rc==SQLITE_OK && robust_ftruncate(pShmNode->h, 0) ){
|
if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 0) ){
|
||||||
rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename);
|
rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4540,7 +4540,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
|
|||||||
sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath);
|
sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath);
|
||||||
sqlite3FileSuffix3(pDbFd->zPath, zShm);
|
sqlite3FileSuffix3(pDbFd->zPath, zShm);
|
||||||
#endif
|
#endif
|
||||||
pShmNode->h = -1;
|
pShmNode->hShm = -1;
|
||||||
pDbFd->pInode->pShmNode = pShmNode;
|
pDbFd->pInode->pShmNode = pShmNode;
|
||||||
pShmNode->pInode = pDbFd->pInode;
|
pShmNode->pInode = pDbFd->pInode;
|
||||||
if( sqlite3GlobalConfig.bCoreMutex ){
|
if( sqlite3GlobalConfig.bCoreMutex ){
|
||||||
@@ -4553,11 +4553,11 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
|
|||||||
|
|
||||||
if( pInode->bProcessLock==0 ){
|
if( pInode->bProcessLock==0 ){
|
||||||
if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
|
if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
|
||||||
pShmNode->h = robust_open(zShm, O_RDWR|O_CREAT, (sStat.st_mode&0777));
|
pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT,(sStat.st_mode&0777));
|
||||||
}
|
}
|
||||||
if( pShmNode->h<0 ){
|
if( pShmNode->hShm<0 ){
|
||||||
pShmNode->h = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777));
|
pShmNode->hShm = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777));
|
||||||
if( pShmNode->h<0 ){
|
if( pShmNode->hShm<0 ){
|
||||||
rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm);
|
rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm);
|
||||||
goto shm_open_err;
|
goto shm_open_err;
|
||||||
}
|
}
|
||||||
@@ -4568,7 +4568,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
|
|||||||
** is owned by the same user that owns the original database. Otherwise,
|
** is owned by the same user that owns the original database. Otherwise,
|
||||||
** the original owner will not be able to connect.
|
** the original owner will not be able to connect.
|
||||||
*/
|
*/
|
||||||
robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid);
|
robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid);
|
||||||
|
|
||||||
rc = unixLockSharedMemory(pDbFd, pShmNode);
|
rc = unixLockSharedMemory(pDbFd, pShmNode);
|
||||||
if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
|
if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
|
||||||
@@ -4654,8 +4654,8 @@ static int unixShmMap(
|
|||||||
}
|
}
|
||||||
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
|
assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
|
||||||
assert( pShmNode->pInode==pDbFd->pInode );
|
assert( pShmNode->pInode==pDbFd->pInode );
|
||||||
assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
|
assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 );
|
||||||
assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
|
assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 );
|
||||||
|
|
||||||
/* Minimum number of regions required to be mapped. */
|
/* Minimum number of regions required to be mapped. */
|
||||||
nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap;
|
nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap;
|
||||||
@@ -4667,12 +4667,12 @@ static int unixShmMap(
|
|||||||
|
|
||||||
pShmNode->szRegion = szRegion;
|
pShmNode->szRegion = szRegion;
|
||||||
|
|
||||||
if( pShmNode->h>=0 ){
|
if( pShmNode->hShm>=0 ){
|
||||||
/* The requested region is not mapped into this processes address space.
|
/* The requested region is not mapped into this processes address space.
|
||||||
** Check to see if it has been allocated (i.e. if the wal-index file is
|
** Check to see if it has been allocated (i.e. if the wal-index file is
|
||||||
** large enough to contain the requested region).
|
** large enough to contain the requested region).
|
||||||
*/
|
*/
|
||||||
if( osFstat(pShmNode->h, &sStat) ){
|
if( osFstat(pShmNode->hShm, &sStat) ){
|
||||||
rc = SQLITE_IOERR_SHMSIZE;
|
rc = SQLITE_IOERR_SHMSIZE;
|
||||||
goto shmpage_out;
|
goto shmpage_out;
|
||||||
}
|
}
|
||||||
@@ -4700,7 +4700,7 @@ static int unixShmMap(
|
|||||||
assert( (nByte % pgsz)==0 );
|
assert( (nByte % pgsz)==0 );
|
||||||
for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){
|
for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){
|
||||||
int x = 0;
|
int x = 0;
|
||||||
if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){
|
if( seekAndWriteFd(pShmNode->hShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){
|
||||||
const char *zFile = pShmNode->zFilename;
|
const char *zFile = pShmNode->zFilename;
|
||||||
rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile);
|
rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile);
|
||||||
goto shmpage_out;
|
goto shmpage_out;
|
||||||
@@ -4723,10 +4723,10 @@ static int unixShmMap(
|
|||||||
int nMap = szRegion*nShmPerMap;
|
int nMap = szRegion*nShmPerMap;
|
||||||
int i;
|
int i;
|
||||||
void *pMem;
|
void *pMem;
|
||||||
if( pShmNode->h>=0 ){
|
if( pShmNode->hShm>=0 ){
|
||||||
pMem = osMmap(0, nMap,
|
pMem = osMmap(0, nMap,
|
||||||
pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE,
|
pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE,
|
||||||
MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion
|
MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion
|
||||||
);
|
);
|
||||||
if( pMem==MAP_FAILED ){
|
if( pMem==MAP_FAILED ){
|
||||||
rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename);
|
rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename);
|
||||||
@@ -4789,8 +4789,8 @@ static int unixShmLock(
|
|||||||
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
|
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
|
||||||
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
|
|| flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
|
||||||
assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
|
assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
|
||||||
assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
|
assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 );
|
||||||
assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
|
assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 );
|
||||||
|
|
||||||
mask = (1<<(ofst+n)) - (1<<ofst);
|
mask = (1<<(ofst+n)) - (1<<ofst);
|
||||||
assert( n>1 || mask==(1<<ofst) );
|
assert( n>1 || mask==(1<<ofst) );
|
||||||
@@ -4933,7 +4933,7 @@ static int unixShmUnmap(
|
|||||||
assert( pShmNode->nRef>0 );
|
assert( pShmNode->nRef>0 );
|
||||||
pShmNode->nRef--;
|
pShmNode->nRef--;
|
||||||
if( pShmNode->nRef==0 ){
|
if( pShmNode->nRef==0 ){
|
||||||
if( deleteFlag && pShmNode->h>=0 ){
|
if( deleteFlag && pShmNode->hShm>=0 ){
|
||||||
osUnlink(pShmNode->zFilename);
|
osUnlink(pShmNode->zFilename);
|
||||||
}
|
}
|
||||||
unixShmPurge(pDbFd);
|
unixShmPurge(pDbFd);
|
||||||
|
|||||||
Reference in New Issue
Block a user