Changeset 179446 in webkit
- Timestamp:
- Jan 31, 2015, 12:43:33 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
NetworkProcess/cache/NetworkCacheStorage.h (modified) (5 diffs)
-
NetworkProcess/cache/NetworkCacheStorageCocoa.mm (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r179430 r179446 1 2015-01-31 Antti Koivisto <antti@apple.com> 2 3 OSObjectPtr does not work with dispatch_data_t on Maverics 4 https://bugs.webkit.org/show_bug.cgi?id=141081 5 6 Reviewed by Zalan Bujtas. 7 8 Previous attempt to special case dispatch_data_t in OSObjectPtr didn't work in all cases 9 probably due to the context sensitivity of the definition of the dispatch_data_t type. 10 11 For now, add DispatchPtr for the cache code and use it. 12 13 * NetworkProcess/cache/NetworkCacheStorage.h: 14 (WebKit::DispatchPtr::DispatchPtr): 15 (WebKit::DispatchPtr::~DispatchPtr): 16 (WebKit::DispatchPtr::operator=): 17 (WebKit::DispatchPtr::get): 18 (WebKit::DispatchPtr::operator bool): 19 (WebKit::adoptDispatch): 20 * NetworkProcess/cache/NetworkCacheStorageCocoa.mm: 21 (WebKit::NetworkCacheStorage::Data::Data): 22 (WebKit::NetworkCacheStorage::Data::data): 23 (WebKit::NetworkCacheStorage::NetworkCacheStorage): 24 (WebKit::createIOChannelForKey): 25 (WebKit::decodeEntry): 26 (WebKit::encodeEntryMetaData): 27 (WebKit::encodeEntry): 28 1 29 2015-01-30 Tim Horton <timothy_horton@apple.com> 2 30 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h
r179052 r179446 35 35 #include <wtf/text/WTFString.h> 36 36 37 #if PLATFORM(COCOA)38 #include <wtf/OSObjectPtr.h>39 #endif40 41 37 namespace WebCore { 42 38 class SharedBuffer; … … 52 48 class ShareableResource; 53 49 50 #if PLATFORM(COCOA) 51 template <typename T> class DispatchPtr; 52 template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject); 53 54 // FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms. 55 template<typename T> class DispatchPtr { 56 public: 57 DispatchPtr() 58 : m_ptr(nullptr) 59 { 60 } 61 DispatchPtr(const DispatchPtr& other) 62 : m_ptr(other.m_ptr) 63 { 64 if (m_ptr) 65 dispatch_retain(m_ptr); 66 } 67 ~DispatchPtr() 68 { 69 if (m_ptr) 70 dispatch_release(m_ptr); 71 } 72 73 DispatchPtr& operator=(const DispatchPtr& other) 74 { 75 auto copy = other; 76 std::swap(m_ptr, copy.m_ptr); 77 return *this; 78 } 79 80 T get() const { return m_ptr; } 81 explicit operator bool() const { return m_ptr; } 82 83 friend DispatchPtr adoptDispatch<T>(T); 84 85 private: 86 struct Adopt { }; 87 DispatchPtr(Adopt, T data) 88 : m_ptr(data) 89 { 90 } 91 92 T m_ptr; 93 }; 94 95 template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject) 96 { 97 return DispatchPtr<T>(typename DispatchPtr<T>::Adopt { }, dispatchObject); 98 } 99 #endif 100 54 101 class NetworkCacheStorage { 55 102 WTF_MAKE_NONCOPYABLE(NetworkCacheStorage); … … 62 109 Data(const uint8_t*, size_t); 63 110 #if PLATFORM(COCOA) 64 explicit Data( OSObjectPtr<dispatch_data_t>);111 explicit Data(DispatchPtr<dispatch_data_t>); 65 112 #endif 66 113 bool isNull() const; … … 74 121 private: 75 122 #if PLATFORM(COCOA) 76 mutable OSObjectPtr<dispatch_data_t> m_dispatchData;123 mutable DispatchPtr<dispatch_data_t> m_dispatchData; 77 124 #endif 78 125 mutable const uint8_t* m_data; … … 121 168 122 169 #if PLATFORM(COCOA) 123 mutable OSObjectPtr<dispatch_queue_t> m_ioQueue;124 mutable OSObjectPtr<dispatch_queue_t> m_backgroundIOQueue;170 mutable DispatchPtr<dispatch_queue_t> m_ioQueue; 171 mutable DispatchPtr<dispatch_queue_t> m_backgroundIOQueue; 125 172 #endif 126 173 }; -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm
r179327 r179446 81 81 82 82 NetworkCacheStorage::Data::Data(const uint8_t* data, size_t size) 83 : m_dispatchData(adopt OSObject(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))83 : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT))) 84 84 , m_data(nullptr) 85 85 , m_size(size) … … 87 87 } 88 88 89 NetworkCacheStorage::Data::Data( OSObjectPtr<dispatch_data_t> dispatchData)89 NetworkCacheStorage::Data::Data(DispatchPtr<dispatch_data_t> dispatchData) 90 90 { 91 91 const void* data; 92 m_dispatchData = adopt OSObject(dispatch_data_create_map(dispatchData.get(), &data, &m_size));92 m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &data, &m_size)); 93 93 m_data = static_cast<const uint8_t*>(data); 94 94 } … … 99 99 const void* data; 100 100 size_t size; 101 m_dispatchData = adopt OSObject(dispatch_data_create_map(m_dispatchData.get(), &data, &size));101 m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &data, &size)); 102 102 ASSERT(size == m_size); 103 103 m_data = static_cast<const uint8_t*>(data); … … 123 123 NetworkCacheStorage::NetworkCacheStorage(const String& directoryPath) 124 124 : m_directoryPath(directoryPath) 125 , m_ioQueue(adopt OSObject(dispatch_queue_create("com.apple.WebKit.Cache.Storage", DISPATCH_QUEUE_CONCURRENT)))126 , m_backgroundIOQueue(adopt OSObject(dispatch_queue_create("com.apple.WebKit.Cache.Storage.Background", DISPATCH_QUEUE_CONCURRENT)))125 , m_ioQueue(adoptDispatch(dispatch_queue_create("com.apple.WebKit.Cache.Storage", DISPATCH_QUEUE_CONCURRENT))) 126 , m_backgroundIOQueue(adoptDispatch(dispatch_queue_create("com.apple.WebKit.Cache.Storage.Background", DISPATCH_QUEUE_CONCURRENT))) 127 127 { 128 128 dispatch_set_target_queue(m_backgroundIOQueue.get(), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); … … 163 163 164 164 enum class IOChannelType { Read, Write }; 165 static OSObjectPtr<dispatch_io_t> createIOChannelForKey(const NetworkCacheKey& key, IOChannelType type, const String& cachePath, int& fd)165 static DispatchPtr<dispatch_io_t> createIOChannelForKey(const NetworkCacheKey& key, IOChannelType type, const String& cachePath, int& fd) 166 166 { 167 167 int oflag; … … 184 184 LOG(NetworkCacheStorage, "(NetworkProcess) opening %s type=%d", path.data(), type); 185 185 186 OSObjectPtr<dispatch_io_t> channel = adoptOSObject(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd, type](int error) {186 auto channel = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd, type](int error) { 187 187 close(fd); 188 188 if (error) … … 267 267 return nullptr; 268 268 269 auto headerData = adopt OSObject(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize));269 auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize)); 270 270 if (metaData.headerChecksum != hashData(headerData.get())) { 271 271 LOG(NetworkCacheStorage, "(NetworkProcess) header checksum mismatch"); … … 279 279 } 280 280 281 auto bodyData = adopt OSObject(dispatch_data_create(map, metaData.bodySize, dispatch_get_main_queue(), [map, mapSize] {281 auto bodyData = adoptDispatch(dispatch_data_create(map, metaData.bodySize, dispatch_get_main_queue(), [map, mapSize] { 282 282 munmap(map, mapSize); 283 283 })); … … 295 295 } 296 296 297 static OSObjectPtr<dispatch_data_t> encodeEntryMetaData(const EntryMetaData& entry)297 static DispatchPtr<dispatch_data_t> encodeEntryMetaData(const EntryMetaData& entry) 298 298 { 299 299 NetworkCacheEncoder encoder; … … 309 309 encoder.encodeChecksum(); 310 310 311 return adopt OSObject(dispatch_data_create(encoder.buffer(), encoder.bufferSize(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));312 } 313 314 static OSObjectPtr<dispatch_data_t> encodeEntry(const NetworkCacheKey& key, const NetworkCacheStorage::Entry& entry)311 return adoptDispatch(dispatch_data_create(encoder.buffer(), encoder.bufferSize(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)); 312 } 313 314 static DispatchPtr<dispatch_data_t> encodeEntry(const NetworkCacheKey& key, const NetworkCacheStorage::Entry& entry) 315 315 { 316 316 EntryMetaData metaData(key); … … 322 322 323 323 auto encodedMetaData = encodeEntryMetaData(metaData); 324 auto headerData = adopt OSObject(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));324 auto headerData = adoptDispatch(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData())); 325 325 if (!entry.body.size()) 326 326 return headerData; … … 329 329 size_t dataOffset = round_page(headerSize); 330 330 Vector<uint8_t, 4096> filler(dataOffset - headerSize, 0); 331 OSObjectPtr<dispatch_data_t> alignmentData = adoptOSObject(dispatch_data_create(filler.data(), filler.size(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));332 333 OSObjectPtr<dispatch_data_t> headerWithAlignmentData = adoptOSObject(dispatch_data_create_concat(headerData.get(), alignmentData.get()));334 335 return adopt OSObject(dispatch_data_create_concat(headerWithAlignmentData.get(), entry.body.dispatchData()));331 auto alignmentData = adoptDispatch(dispatch_data_create(filler.data(), filler.size(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)); 332 333 auto headerWithAlignmentData = adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get())); 334 335 return adoptDispatch(dispatch_data_create_concat(headerWithAlignmentData.get(), entry.body.dispatchData())); 336 336 } 337 337
Note:
See TracChangeset
for help on using the changeset viewer.