summaryrefslogtreecommitdiffstats
path: root/third_party
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-26 19:58:51 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-26 19:58:51 +0000
commitba4b3a9e1f5931aa8e6127fe1fe7ca38f4a58c6f (patch)
tree5cd0f6982f3fd5302fb92f60d6ee2a8d39407534 /third_party
parent20477755e5b62e662b08e541d3cfc155622c387a (diff)
downloadchromium_src-ba4b3a9e1f5931aa8e6127fe1fe7ca38f4a58c6f.zip
chromium_src-ba4b3a9e1f5931aa8e6127fe1fe7ca38f4a58c6f.tar.gz
chromium_src-ba4b3a9e1f5931aa8e6127fe1fe7ca38f4a58c6f.tar.bz2
Prepare to revert WebKit patch http://trac.webkit.org/changeset/68310 because of stability issues (race conditions detected by tsan, possibly leading to crashes).
Revert "Update sqlite's README.chromium with a note to keep webkit side" (http://crrev.com/62151). Revert "Remove our local modifications to sqlite's os_unix.c now that" (http://crrev.com/60761). BUG=70589, 22208 TEST=none Review URL: http://codereview.chromium.org/6330011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72673 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party')
-rw-r--r--third_party/sqlite/README.chromium20
-rw-r--r--third_party/sqlite/src/src/os_unix.c92
2 files changed, 90 insertions, 22 deletions
diff --git a/third_party/sqlite/README.chromium b/third_party/sqlite/README.chromium
index 926abd7..45d0a8d 100644
--- a/third_party/sqlite/README.chromium
+++ b/third_party/sqlite/README.chromium
@@ -42,11 +42,6 @@ cd sqlite
# Run the google_generate_preprocessed.sh script:
./google_generate_preprocessed.sh
-# If there are any updates to os_unix.c, remember to keep
-# WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp in sync.
-# This means preparing a separate patch for WebKit.
-# If you have questions about this part, ask phajdan.jr and dumi.
-
# Find a sucker. Send review.
# TODO(shess) Describe an appropriate comment style. Seems like it
# should at least include the SQLite version number.
@@ -160,3 +155,18 @@ Changes from Chrome:
- Added a new function chromium_sqlite3_initialize_win_sqlite3_file()
at the end of os_win.c. It allows the Windows-specific Chromium VFS
to reuse most of the win32 SQLite VFS.
+ - Added a new function
+ chromium_sqlite3_initialize_unix_sqlite3_file() and made
+ fillInUnixFile() non-static in os_unix.c. It allows the
+ Linux-specific Chromium VFS to reuse most of the unix SQLite VFS.
+ - Exposed three functions that deal with unused file descriptors in
+ os_unix.c, to allow Chromium's Posix VFS implementation in
+ WebKit/WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp
+ to correctly implement the "unused file descriptors" logic in the
+ xDlOpen() method. The new functions are
+ chromium_sqlite3_get_reusable_file_handle(),
+ chromium_sqlite3_update_reusable_file_handle() and
+ chromium_sqlite3_destroy_reusable_file_handle(). Also, added the
+ chromium_sqlite3_fill_in_unix_sqlite3_file() function that calls
+ fillInUnixFile(), which will be made static again as soon as a
+ WebKit patch using the new function lands.
diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c
index 5bc6955..6ec2b88 100644
--- a/third_party/sqlite/src/src/os_unix.c
+++ b/third_party/sqlite/src/src/os_unix.c
@@ -3229,6 +3229,7 @@ static int unixDeviceCharacteristics(sqlite3_file *NotUsed){
********************** End sqlite3_file Methods *******************************
******************************************************************************/
+
/*
** This division contains definitions of sqlite3_io_methods objects that
** implement various file locking strategies. It also contains definitions
@@ -3826,6 +3827,73 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
}
/*
+** Initializes a unixFile structure with zeros.
+*/
+void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) {
+ memset(file, 0, sizeof(unixFile));
+}
+
+int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs,
+ int fd,
+ int dirfd,
+ sqlite3_file* file,
+ const char* fileName,
+ int noLock,
+ int isDelete) {
+ return fillInUnixFile(vfs, fd, dirfd, file, fileName, noLock, isDelete);
+}
+
+/*
+** Search for an unused file descriptor that was opened on the database file.
+** If a suitable file descriptor if found, then it is stored in *fd; otherwise,
+** *fd is not modified.
+**
+** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot
+** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned.
+*/
+int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file,
+ const char* fileName,
+ int flags,
+ int* fd) {
+ unixFile* unixSQLite3File = (unixFile*)file;
+ int fileType = flags & 0xFFFFFF00;
+ if (fileType == SQLITE_OPEN_MAIN_DB) {
+ UnixUnusedFd *unusedFd = findReusableFd(fileName, flags);
+ if (unusedFd) {
+ *fd = unusedFd->fd;
+ } else {
+ unusedFd = sqlite3_malloc(sizeof(*unusedFd));
+ if (!unusedFd) {
+ return SQLITE_NOMEM;
+ }
+ }
+ unixSQLite3File->pUnused = unusedFd;
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Marks 'fd' as the unused file descriptor for 'pFile'.
+*/
+void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file,
+ int fd,
+ int flags) {
+ unixFile* unixSQLite3File = (unixFile*)file;
+ if (unixSQLite3File->pUnused) {
+ unixSQLite3File->pUnused->fd = fd;
+ unixSQLite3File->pUnused->flags = flags;
+ }
+}
+
+/*
+** Destroys pFile's field that keeps track of the unused file descriptor.
+*/
+void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) {
+ unixFile* unixSQLite3File = (unixFile*)file;
+ sqlite3_free(unixSQLite3File->pUnused);
+}
+
+/*
** Open the file zPath.
**
** Previously, the SQLite OS layer used three functions in place of this
@@ -3907,20 +3975,13 @@ static int unixOpen(
|| eType==SQLITE_OPEN_TRANSIENT_DB
);
- memset(p, 0, sizeof(unixFile));
+ chromium_sqlite3_initialize_unix_sqlite3_file(pFile);
if( eType==SQLITE_OPEN_MAIN_DB ){
- UnixUnusedFd *pUnused;
- pUnused = findReusableFd(zName, flags);
- if( pUnused ){
- fd = pUnused->fd;
- }else{
- pUnused = sqlite3_malloc(sizeof(*pUnused));
- if( !pUnused ){
- return SQLITE_NOMEM;
- }
+ rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd);
+ if( rc!=SQLITE_OK ){
+ return rc;
}
- p->pUnused = pUnused;
}else if( !zName ){
/* If zName is NULL, the upper layer is requesting a temp file. */
assert(isDelete && !isOpenDirectory);
@@ -3963,10 +4024,7 @@ static int unixOpen(
*pOutFlags = flags;
}
- if( p->pUnused ){
- p->pUnused->fd = fd;
- p->pUnused->flags = flags;
- }
+ chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags);
if( isDelete ){
#if OS_VXWORKS
@@ -4038,11 +4096,11 @@ static int unixOpen(
}
}
#endif
-
+
rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, isDelete);
open_finished:
if( rc!=SQLITE_OK ){
- sqlite3_free(p->pUnused);
+ chromium_sqlite3_destroy_reusable_file_handle(pFile);
}
return rc;
}