Diff
Modified: trunk/Source/WebKit2/ChangeLog (181160 => 181161)
--- trunk/Source/WebKit2/ChangeLog 2015-03-06 17:25:54 UTC (rev 181160)
+++ trunk/Source/WebKit2/ChangeLog 2015-03-06 17:30:32 UTC (rev 181161)
@@ -1,5 +1,22 @@
2015-03-06 Antti Koivisto <an...@apple.com>
+ Don't use dispatch_semaphore in NetworkCacheStorage
+ https://bugs.webkit.org/show_bug.cgi?id=142395
+
+ Reviewed by Anders Carlsson.
+
+ * NetworkProcess/cache/NetworkCacheIOChannel.h:
+ * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm:
+ (WebKit::NetworkCache::IOChannel::read):
+ (WebKit::NetworkCache::IOChannel::readSync):
+
+ Add readSync to encapsulate the semaphore.
+
+ * NetworkProcess/cache/NetworkCacheStorageCocoa.mm:
+ (WebKit::NetworkCache::Storage::traverse):
+
+2015-03-06 Antti Koivisto <an...@apple.com>
+
Move dispatch_data use behind NetworkCache::Data abstraction
https://bugs.webkit.org/show_bug.cgi?id=142392
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h (181160 => 181161)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h 2015-03-06 17:25:54 UTC (rev 181160)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h 2015-03-06 17:30:32 UTC (rev 181161)
@@ -42,6 +42,7 @@
static Ref<IOChannel> open(const String& file, Type);
void read(size_t offset, size_t, std::function<void (Data&, int error)>);
+ void readSync(size_t offset, size_t, std::function<void (Data&, int error)>);
void write(size_t offset, const Data&, std::function<void (int error)>);
int fileDescriptor() const { return m_fileDescriptor; }
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm (181160 => 181161)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm 2015-03-06 17:25:54 UTC (rev 181160)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm 2015-03-06 17:30:32 UTC (rev 181161)
@@ -75,7 +75,7 @@
return adoptRef(*new IOChannel(fd));
}
-void IOChannel::read(size_t offset, size_t size, std::function<void ( Data&, int error)> completionHandler)
+void IOChannel::read(size_t offset, size_t size, std::function<void (Data&, int error)> completionHandler)
{
RefPtr<IOChannel> channel(this);
bool didCallCompletionHandler = false;
@@ -95,6 +95,17 @@
});
}
+// FIXME: It would be better to do without this.
+void IOChannel::readSync(size_t offset, size_t size, std::function<void (Data&, int error)> completionHandler)
+{
+ auto semaphore = adoptDispatch(dispatch_semaphore_create(0));
+ read(offset, size, [semaphore, &completionHandler](Data& data, int error) {
+ completionHandler(data, error);
+ dispatch_semaphore_signal(semaphore.get());
+ });
+ dispatch_semaphore_wait(semaphore.get(), DISPATCH_TIME_FOREVER);
+}
+
void IOChannel::write(size_t offset, const Data& data, std::function<void (int error)> completionHandler)
{
RefPtr<IOChannel> channel(this);
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm (181160 => 181161)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm 2015-03-06 17:25:54 UTC (rev 181160)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm 2015-03-06 17:30:32 UTC (rev 181161)
@@ -32,7 +32,6 @@
#include "NetworkCacheCoders.h"
#include "NetworkCacheFileSystemPosix.h"
#include "NetworkCacheIOChannel.h"
-#include <dispatch/dispatch.h>
#include <wtf/PageBlock.h>
#include <wtf/RandomNumber.h>
#include <wtf/RunLoop.h>
@@ -409,21 +408,19 @@
StringCapture cachePathCapture(m_directoryPath);
ioQueue().dispatch([this, cachePathCapture, traverseHandler] {
String cachePath = cachePathCapture.string();
- auto semaphore = adoptDispatch(dispatch_semaphore_create(0));
- traverseCacheFiles(cachePath, [this, &semaphore, &traverseHandler](const String& fileName, const String& partitionPath) {
+ traverseCacheFiles(cachePath, [this, &traverseHandler](const String& fileName, const String& partitionPath) {
auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
auto channel = IOChannel::open(filePath, IOChannel::Type::Read);
const size_t headerReadSize = 16 << 10;
- channel->read(0, headerReadSize, [this, &semaphore, &traverseHandler](Data& fileData, int) {
+ // FIXME: Traversal is slower than it should be due to lack of parallelism.
+ channel->readSync(0, headerReadSize, [this, &traverseHandler](Data& fileData, int) {
EntryMetaData metaData;
Data headerData;
if (decodeEntryHeader(fileData, metaData, headerData)) {
Entry entry { metaData.key, metaData.timeStamp, headerData, { } };
traverseHandler(&entry);
}
- dispatch_semaphore_signal(semaphore.get());
});
- dispatch_semaphore_wait(semaphore.get(), DISPATCH_TIME_FOREVER);
});
RunLoop::main().dispatch([this, traverseHandler] {
traverseHandler(nullptr);