Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | When a VFS.xOpen fails, make sure the pMethods pointer is zeroed on the sqlite3_file object so that subsequent xClose() operations against that same file handler are no-ops. Bug in the test_async.c module only - not in the core library. Ticket #3744. (CVS 6384) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
c32b454118f4b0cc615edb9b35f749db |
User & Date: | drh 2009-03-25 14:24:42.000 |
Context
2009-03-25
| ||
15:43 | Fix a problem preventing sqlite3_extended_errcode() from working correctly. (CVS 6385) (check-in: de469c46f5 user: danielk1977 tags: trunk) | |
14:24 | When a VFS.xOpen fails, make sure the pMethods pointer is zeroed on the sqlite3_file object so that subsequent xClose() operations against that same file handler are no-ops. Bug in the test_async.c module only - not in the core library. Ticket #3744. (CVS 6384) (check-in: c32b454118 user: drh tags: trunk) | |
01:06 | Use fdatasync() only on linux, unless -Dfdatasync=fdatasync is set at compilation time. (CVS 6383) (check-in: cbf2ca4cc4 user: drh tags: trunk) | |
Changes
Changes to src/os.c.
︙ | ︙ | |||
9 10 11 12 13 14 15 | ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** This file contains OS interface code that is common to all ** architectures. ** | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** This file contains OS interface code that is common to all ** architectures. ** ** $Id: os.c,v 1.126 2009/03/25 14:24:42 drh Exp $ */ #define _SQLITE_OS_C_ 1 #include "sqliteInt.h" #undef _SQLITE_OS_C_ /* ** The default SQLite sqlite3_vfs implementations do not allocate |
︙ | ︙ | |||
108 109 110 111 112 113 114 115 | int sqlite3OsOpen( sqlite3_vfs *pVfs, const char *zPath, sqlite3_file *pFile, int flags, int *pFlagsOut ){ DO_OS_MALLOC_TEST; | > | > > | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | int sqlite3OsOpen( sqlite3_vfs *pVfs, const char *zPath, sqlite3_file *pFile, int flags, int *pFlagsOut ){ int rc; DO_OS_MALLOC_TEST; rc = pVfs->xOpen(pVfs, zPath, pFile, flags, pFlagsOut); assert( rc==SQLITE_OK || pFile->pMethods==0 ); return rc; } int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ return pVfs->xDelete(pVfs, zPath, dirSync); } int sqlite3OsAccess( sqlite3_vfs *pVfs, const char *zPath, |
︙ | ︙ |
Changes to src/test_async.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* ** 2005 December 14 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* ** 2005 December 14 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** ** $Id: test_async.c,v 1.51 2009/03/25 14:24:42 drh Exp $ ** ** This file contains an example implementation of an asynchronous IO ** backend for SQLite. ** ** WHAT IS ASYNCHRONOUS I/O? ** ** With asynchronous I/O, write requests are handled by a separate thread |
︙ | ︙ | |||
415 416 417 418 419 420 421 | struct AsyncFileData { char *zName; /* Underlying OS filename - used for debugging */ int nName; /* Number of characters in zName */ sqlite3_file *pBaseRead; /* Read handle to the underlying Os file */ sqlite3_file *pBaseWrite; /* Write handle to the underlying Os file */ AsyncFileLock lock; /* Lock state for this handle */ AsyncLock *pLock; /* AsyncLock object for this file system entry */ | | | 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 | struct AsyncFileData { char *zName; /* Underlying OS filename - used for debugging */ int nName; /* Number of characters in zName */ sqlite3_file *pBaseRead; /* Read handle to the underlying Os file */ sqlite3_file *pBaseWrite; /* Write handle to the underlying Os file */ AsyncFileLock lock; /* Lock state for this handle */ AsyncLock *pLock; /* AsyncLock object for this file system entry */ AsyncWrite closeOp; /* Preallocated close operation */ }; /* ** The following async_XXX functions are debugging wrappers around the ** corresponding pthread_XXX functions: ** ** pthread_mutex_lock(); |
︙ | ︙ | |||
697 698 699 700 701 702 703 | AsyncFileData *p = ((AsyncFile *)pFile)->pData; /* Unlock the file, if it is locked */ pthread_mutex_lock(&async.lockMutex); p->lock.eLock = 0; pthread_mutex_unlock(&async.lockMutex); | | | 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 | AsyncFileData *p = ((AsyncFile *)pFile)->pData; /* Unlock the file, if it is locked */ pthread_mutex_lock(&async.lockMutex); p->lock.eLock = 0; pthread_mutex_unlock(&async.lockMutex); addAsyncWrite(&p->closeOp); return SQLITE_OK; } /* ** Implementation of sqlite3OsWrite() for asynchronous files. Instead of ** writing to the underlying file, this function adds an entry to the end of ** the global AsyncWrite list. Either SQLITE_OK or SQLITE_NOMEM may be |
︙ | ︙ | |||
1093 1094 1095 1096 1097 1098 1099 | } memset(z, 0, nByte); pData = (AsyncFileData*)z; z += sizeof(pData[0]); pData->pBaseRead = (sqlite3_file*)z; z += pVfs->szOsFile; pData->pBaseWrite = (sqlite3_file*)z; | | | | 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 | } memset(z, 0, nByte); pData = (AsyncFileData*)z; z += sizeof(pData[0]); pData->pBaseRead = (sqlite3_file*)z; z += pVfs->szOsFile; pData->pBaseWrite = (sqlite3_file*)z; pData->closeOp.pFileData = pData; pData->closeOp.op = ASYNC_CLOSE; if( zName ){ z += pVfs->szOsFile; pData->zName = z; pData->nName = nName; memcpy(pData->zName, zName, nName); } |
︙ | ︙ | |||
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 | if( pOutFlags ) *pOutFlags = flags; }else{ pthread_mutex_lock(&async.lockMutex); unlinkAsyncFile(pData); pthread_mutex_unlock(&async.lockMutex); sqlite3_free(pData); } } return rc; } /* ** Implementation of sqlite3OsDelete. Add an entry to the end of the ** write-op queue to perform the delete. | > > > | 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 | if( pOutFlags ) *pOutFlags = flags; }else{ pthread_mutex_lock(&async.lockMutex); unlinkAsyncFile(pData); pthread_mutex_unlock(&async.lockMutex); sqlite3_free(pData); } } if( rc!=SQLITE_OK ){ p->pMethod = 0; } return rc; } /* ** Implementation of sqlite3OsDelete. Add an entry to the end of the ** write-op queue to perform the delete. |
︙ | ︙ |