Changeset 241468 in webkit
- Timestamp:
- Feb 13, 2019, 1:32:44 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
Modules/indexeddb/server/UniqueIDBDatabase.cpp (modified) (12 diffs)
-
Modules/indexeddb/server/UniqueIDBDatabase.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r241451 r241468 1 2019-02-13 Sihui Liu <sihui_liu@apple.com> 2 3 REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash 4 https://bugs.webkit.org/show_bug.cgi?id=194413 5 <rdar://problem/47897254> 6 7 Reviewed by Brady Eidson. 8 9 IDB clients expected transaction operations to be executed in order, but in 10 UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly. 11 This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order 12 as IDB Server receives the request. 13 14 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 15 (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError): 16 (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): 17 (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback): 18 (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback): 19 (WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback): 20 (WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback): 21 (WebCore::IDBServer::UniqueIDBDatabase::performCountCallback): 22 (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback): 23 * Modules/indexeddb/server/UniqueIDBDatabase.h: 24 1 25 2019-02-13 John Wilander <wilander@apple.com> 2 26 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r240358 r241468 424 424 ASSERT(!m_errorCallbacks.contains(identifier)); 425 425 m_errorCallbacks.add(identifier, WTFMove(callback)); 426 m_callbackQueue.append(identifier); 426 427 return identifier; 427 428 } … … 437 438 ASSERT(!m_keyDataCallbacks.contains(identifier)); 438 439 m_keyDataCallbacks.add(identifier, WTFMove(callback)); 440 m_callbackQueue.append(identifier); 439 441 return identifier; 440 442 } … … 450 452 ASSERT(!m_getResultCallbacks.contains(identifier)); 451 453 m_getResultCallbacks.add(identifier, WTFMove(callback)); 454 m_callbackQueue.append(identifier); 452 455 return identifier; 453 456 } … … 463 466 ASSERT(!m_getAllResultsCallbacks.contains(identifier)); 464 467 m_getAllResultsCallbacks.add(identifier, WTFMove(callback)); 468 m_callbackQueue.append(identifier); 465 469 return identifier; 466 470 } … … 476 480 ASSERT(!m_countCallbacks.contains(identifier)); 477 481 m_countCallbacks.add(identifier, WTFMove(callback)); 482 m_callbackQueue.append(identifier); 478 483 return identifier; 479 484 } … … 1829 1834 IDBKeyData keyData; 1830 1835 IDBGetResult getResult; 1831 1832 for (auto identifier : copyToVector(m_errorCallbacks.keys())) 1833 performErrorCallback(identifier, error); 1834 1835 for (auto identifier : copyToVector(m_keyDataCallbacks.keys())) 1836 performKeyDataCallback(identifier, error, keyData); 1837 1838 for (auto identifier : copyToVector(m_getResultCallbacks.keys())) 1839 performGetResultCallback(identifier, error, getResult); 1840 1841 for (auto identifier : copyToVector(m_countCallbacks.keys())) 1842 performCountCallback(identifier, error, 0); 1836 IDBGetAllResult getAllResult; 1837 1838 while (!m_callbackQueue.isEmpty()) { 1839 auto identifier = m_callbackQueue.first(); 1840 if (m_errorCallbacks.contains(identifier)) 1841 performErrorCallback(identifier, error); 1842 else if (m_keyDataCallbacks.contains(identifier)) 1843 performKeyDataCallback(identifier, error, keyData); 1844 else if (m_getResultCallbacks.contains(identifier)) 1845 performGetResultCallback(identifier, error, getResult); 1846 else if (m_countCallbacks.contains(identifier)) 1847 performCountCallback(identifier, error, 0); 1848 else if (m_getAllResultsCallbacks.contains(identifier)) 1849 performGetAllResultsCallback(identifier, error, getAllResult); 1850 else 1851 ASSERT_NOT_REACHED(); 1852 } 1843 1853 1844 1854 // Error out all IDBOpenDBRequests … … 1881 1891 auto callback = m_errorCallbacks.take(callbackIdentifier); 1882 1892 ASSERT(callback || m_hardClosedForUserDelete); 1883 if (callback) 1893 if (callback) { 1884 1894 callback(error); 1895 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1896 m_callbackQueue.removeFirst(); 1897 } 1885 1898 } 1886 1899 … … 1889 1902 auto callback = m_keyDataCallbacks.take(callbackIdentifier); 1890 1903 ASSERT(callback || m_hardClosedForUserDelete); 1891 if (callback) 1904 if (callback) { 1892 1905 callback(error, resultKey); 1906 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1907 m_callbackQueue.removeFirst(); 1908 } 1893 1909 } 1894 1910 … … 1897 1913 auto callback = m_getResultCallbacks.take(callbackIdentifier); 1898 1914 ASSERT(callback || m_hardClosedForUserDelete); 1899 if (callback) 1915 if (callback) { 1900 1916 callback(error, resultData); 1917 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1918 m_callbackQueue.removeFirst(); 1919 } 1901 1920 } 1902 1921 … … 1905 1924 auto callback = m_getAllResultsCallbacks.take(callbackIdentifier); 1906 1925 ASSERT(callback || m_hardClosedForUserDelete); 1907 if (callback) 1926 if (callback) { 1908 1927 callback(error, resultData); 1928 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1929 m_callbackQueue.removeFirst(); 1930 } 1909 1931 } 1910 1932 … … 1913 1935 auto callback = m_countCallbacks.take(callbackIdentifier); 1914 1936 ASSERT(callback || m_hardClosedForUserDelete); 1915 if (callback) 1937 if (callback) { 1916 1938 callback(error, count); 1939 ASSERT(m_callbackQueue.first() == callbackIdentifier); 1940 m_callbackQueue.removeFirst(); 1941 } 1917 1942 } 1918 1943 … … 1920 1945 { 1921 1946 ASSERT(m_errorCallbacks.contains(callbackIdentifier)); 1947 ASSERT(m_callbackQueue.last() == callbackIdentifier); 1948 m_callbackQueue.removeLast(); 1922 1949 m_errorCallbacks.remove(callbackIdentifier); 1923 1950 } -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r241183 r241468 251 251 HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks; 252 252 HashMap<uint64_t, CountCallback> m_countCallbacks; 253 Deque<uint64_t> m_callbackQueue; 253 254 254 255 Timer m_operationAndTransactionTimer;
Note:
See TracChangeset
for help on using the changeset viewer.