Changeset 179446 in webkit


Ignore:
Timestamp:
Jan 31, 2015, 12:43:33 PM (11 years ago)
Author:
Antti Koivisto
Message:

OSObjectPtr does not work with dispatch_data_t on Maverics
https://bugs.webkit.org/show_bug.cgi?id=141081

Reviewed by Zalan Bujtas.

Previous attempt to special case dispatch_data_t in OSObjectPtr didn't work in all cases
probably due to the context sensitivity of the definition of the dispatch_data_t type.

For now, add DispatchPtr for the cache code and use it.

  • NetworkProcess/cache/NetworkCacheStorage.h:

(WebKit::DispatchPtr::DispatchPtr):
(WebKit::DispatchPtr::~DispatchPtr):
(WebKit::DispatchPtr::operator=):
(WebKit::DispatchPtr::get):
(WebKit::DispatchPtr::operator bool):
(WebKit::adoptDispatch):

  • NetworkProcess/cache/NetworkCacheStorageCocoa.mm:

(WebKit::NetworkCacheStorage::Data::Data):
(WebKit::NetworkCacheStorage::Data::data):
(WebKit::NetworkCacheStorage::NetworkCacheStorage):
(WebKit::createIOChannelForKey):
(WebKit::decodeEntry):
(WebKit::encodeEntryMetaData):
(WebKit::encodeEntry):

Location:
trunk/Source/WebKit2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r179430 r179446  
     12015-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
    1292015-01-30  Tim Horton  <timothy_horton@apple.com>
    230
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h

    r179052 r179446  
    3535#include <wtf/text/WTFString.h>
    3636
    37 #if PLATFORM(COCOA)
    38 #include <wtf/OSObjectPtr.h>
    39 #endif
    40 
    4137namespace WebCore {
    4238class SharedBuffer;
     
    5248class ShareableResource;
    5349
     50#if PLATFORM(COCOA)
     51template <typename T> class DispatchPtr;
     52template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject);
     53
     54// FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms.
     55template<typename T> class DispatchPtr {
     56public:
     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
     85private:
     86    struct Adopt { };
     87    DispatchPtr(Adopt, T data)
     88        : m_ptr(data)
     89    {
     90    }
     91
     92    T m_ptr;
     93};
     94
     95template <typename T> DispatchPtr<T> adoptDispatch(T dispatchObject)
     96{
     97    return DispatchPtr<T>(typename DispatchPtr<T>::Adopt { }, dispatchObject);
     98}
     99#endif
     100
    54101class NetworkCacheStorage {
    55102    WTF_MAKE_NONCOPYABLE(NetworkCacheStorage);
     
    62109        Data(const uint8_t*, size_t);
    63110#if PLATFORM(COCOA)
    64         explicit Data(OSObjectPtr<dispatch_data_t>);
     111        explicit Data(DispatchPtr<dispatch_data_t>);
    65112#endif
    66113        bool isNull() const;
     
    74121    private:
    75122#if PLATFORM(COCOA)
    76         mutable OSObjectPtr<dispatch_data_t> m_dispatchData;
     123        mutable DispatchPtr<dispatch_data_t> m_dispatchData;
    77124#endif
    78125        mutable const uint8_t* m_data;
     
    121168
    122169#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;
    125172#endif
    126173};
  • trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm

    r179327 r179446  
    8181
    8282NetworkCacheStorage::Data::Data(const uint8_t* data, size_t size)
    83     : m_dispatchData(adoptOSObject(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
     83    : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
    8484    , m_data(nullptr)
    8585    , m_size(size)
     
    8787}
    8888
    89 NetworkCacheStorage::Data::Data(OSObjectPtr<dispatch_data_t> dispatchData)
     89NetworkCacheStorage::Data::Data(DispatchPtr<dispatch_data_t> dispatchData)
    9090{
    9191    const void* data;
    92     m_dispatchData = adoptOSObject(dispatch_data_create_map(dispatchData.get(), &data, &m_size));
     92    m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &data, &m_size));
    9393    m_data = static_cast<const uint8_t*>(data);
    9494}
     
    9999        const void* data;
    100100        size_t size;
    101         m_dispatchData = adoptOSObject(dispatch_data_create_map(m_dispatchData.get(), &data, &size));
     101        m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &data, &size));
    102102        ASSERT(size == m_size);
    103103        m_data = static_cast<const uint8_t*>(data);
     
    123123NetworkCacheStorage::NetworkCacheStorage(const String& directoryPath)
    124124    : m_directoryPath(directoryPath)
    125     , m_ioQueue(adoptOSObject(dispatch_queue_create("com.apple.WebKit.Cache.Storage", DISPATCH_QUEUE_CONCURRENT)))
    126     , m_backgroundIOQueue(adoptOSObject(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)))
    127127{
    128128    dispatch_set_target_queue(m_backgroundIOQueue.get(), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0));
     
    163163
    164164enum class IOChannelType { Read, Write };
    165 static OSObjectPtr<dispatch_io_t> createIOChannelForKey(const NetworkCacheKey& key, IOChannelType type, const String& cachePath, int& fd)
     165static DispatchPtr<dispatch_io_t> createIOChannelForKey(const NetworkCacheKey& key, IOChannelType type, const String& cachePath, int& fd)
    166166{
    167167    int oflag;
     
    184184    LOG(NetworkCacheStorage, "(NetworkProcess) opening %s type=%d", path.data(), type);
    185185
    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) {
    187187        close(fd);
    188188        if (error)
     
    267267        return nullptr;
    268268
    269     auto headerData = adoptOSObject(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize));
     269    auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize));
    270270    if (metaData.headerChecksum != hashData(headerData.get())) {
    271271        LOG(NetworkCacheStorage, "(NetworkProcess) header checksum mismatch");
     
    279279    }
    280280
    281     auto bodyData = adoptOSObject(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] {
    282282        munmap(map, mapSize);
    283283    }));
     
    295295}
    296296
    297 static OSObjectPtr<dispatch_data_t> encodeEntryMetaData(const EntryMetaData& entry)
     297static DispatchPtr<dispatch_data_t> encodeEntryMetaData(const EntryMetaData& entry)
    298298{
    299299    NetworkCacheEncoder encoder;
     
    309309    encoder.encodeChecksum();
    310310
    311     return adoptOSObject(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
     314static DispatchPtr<dispatch_data_t> encodeEntry(const NetworkCacheKey& key, const NetworkCacheStorage::Entry& entry)
    315315{
    316316    EntryMetaData metaData(key);
     
    322322
    323323    auto encodedMetaData = encodeEntryMetaData(metaData);
    324     auto headerData = adoptOSObject(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));
     324    auto headerData = adoptDispatch(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));
    325325    if (!entry.body.size())
    326326        return headerData;
     
    329329    size_t dataOffset = round_page(headerSize);
    330330    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 adoptOSObject(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()));
    336336}
    337337
Note: See TracChangeset for help on using the changeset viewer.