Changeset 70520 in webkit
- Timestamp:
- Oct 26, 2010 8:02:21 AM (14 years ago)
- Location:
- trunk/WebKit2
- Files:
-
- 6 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebKit2/ChangeLog
r70510 r70520 1 2010-10-26 Zoltan Horvath <zoltan@webkit.org> 2 3 Reviewed by Kenneth Rohde Christiansen. 4 5 [Qt] Implement SharedMemory for WebKit2 6 https://bugs.webkit.org/show_bug.cgi?id=47345 7 8 Implement unimplemented functions in SharedMemoryQt.cpp. 9 Rename MappedMemory.h to MappedMemoryPool.h, move MappedMemoryPool.{h|cpp} from 10 Shared/qt to Platform/qt. Modify affected lines of WebKit2.pro. 11 Move MappedMemory implementation into MappedMemoryPool. Remove unnecessary 12 methods of MappedMemoryPool. 13 14 * Platform/SharedMemory.h: Add a handle member for Qt. 15 * Platform/qt/MappedMemoryPool.cpp: Copied from WebKit2/Shared/qt/MappedMemoryPool.cpp. 16 (WebKit::MappedMemoryPool::searchForMappedMemory): 17 (WebKit::MappedMemoryPool::mapMemory): 18 (WebKit::MappedMemoryPool::mapFile): 19 * Platform/qt/MappedMemoryPool.h: Copied from WebKit2/Shared/qt/MappedMemory.h. 20 (WebKit::MappedMemoryPool::MappedMemory::mapSize): 21 (WebKit::MappedMemoryPool::MappedMemory::markUsed): 22 (WebKit::MappedMemoryPool::MappedMemory::markFree): 23 (WebKit::MappedMemoryPool::MappedMemory::isFree): 24 (WebKit::MappedMemoryPool::MappedMemory::data): 25 (WebKit::MappedMemoryPool::MappedMemoryPool): 26 Move MappedMemory implementation into MappedMemoryPool. 27 * Platform/qt/SharedMemoryQt.cpp: 28 (WebKit::SharedMemory::Handle::Handle): Implement. 29 (WebKit::SharedMemory::Handle::~Handle): 30 (WebKit::SharedMemory::Handle::isNull): Implement. 31 (WebKit::SharedMemory::Handle::encode): Implement. 32 (WebKit::SharedMemory::Handle::decode): Implement. 33 (WebKit::SharedMemory::create): Implement. 34 (WebKit::mapProtection): Added. 35 (WebKit::SharedMemory::~SharedMemory): Implement. 36 (WebKit::SharedMemory::createHandle): Implement. 37 (WebKit::SharedMemory::systemPageSize): Implement. 38 * Shared/qt/MappedMemory.h: Removed. 39 * Shared/qt/MappedMemoryPool.cpp: Removed. 40 * Shared/qt/UpdateChunk.cpp: 41 (WebKit::UpdateChunk::UpdateChunk): 42 (WebKit::UpdateChunk::decode): 43 Modify to use MappedMemoryPool. 44 * Shared/qt/UpdateChunk.h: 45 * WebKit2.pro: 46 Modify affected lines. 47 1 48 2010-10-25 Anders Carlsson <andersca@apple.com> 2 49 -
trunk/WebKit2/Platform/SharedMemory.h
r70453 r70520 31 31 #include <wtf/RefCounted.h> 32 32 33 #if PLATFORM(QT) 34 #include <wtf/text/WTFString.h> 35 #endif 36 33 37 namespace CoreIPC { 34 38 class ArgumentDecoder; … … 61 65 #elif PLATFORM(WIN) 62 66 mutable HANDLE m_handle; 67 #elif PLATFORM(QT) 68 mutable String m_fileName; 63 69 #endif 64 70 size_t m_size; -
trunk/WebKit2/Platform/qt/MappedMemoryPool.cpp
r70519 r70520 1 1 /* 2 2 * Copyright (C) 2010 University of Szeged 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 4 * All rights reserved. 4 5 * … … 25 26 */ 26 27 27 #include "MappedMemory .h"28 #include "MappedMemoryPool.h" 28 29 29 30 #include "StdLibExtras.h" 31 #include <QDir> 32 #include <QIODevice> 33 #include <QTemporaryFile> 30 34 31 35 namespace WebKit { 32 33 MappedMemoryPool::MappedMemoryPool()34 {35 connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), SLOT(cleanUp()));36 }37 36 38 37 MappedMemoryPool* MappedMemoryPool::instance() … … 42 41 } 43 42 44 size_t MappedMemoryPool::size() const 43 MappedMemory* MappedMemoryPool::searchForMappedMemory(uchar* p) 45 44 { 46 return m_pool.size(); 45 for (unsigned n = 0; n < m_pool.size(); ++n) { 46 MappedMemory& current = m_pool.at(n); 47 if (current.data() == p) 48 return reinterpret_cast<MappedMemory*>(¤t); 49 } 50 return 0; 47 51 } 48 52 49 MappedMemory & MappedMemoryPool::at(size_t i)53 MappedMemory* MappedMemoryPool::mapMemory(size_t size, QIODevice::OpenMode openMode) 50 54 { 51 return m_pool.at(i); 55 for (unsigned n = 0; n < m_pool.size(); ++n) { 56 MappedMemory& current = m_pool.at(n); 57 if (current.dataSize >= size && current.isFree()) { 58 current.markUsed(); 59 return ¤t; 60 } 61 } 62 MappedMemory newMap; 63 newMap.dataSize = size; 64 newMap.file = new QTemporaryFile(QDir::tempPath() + "/WebKit2UpdateChunk"); 65 newMap.file->open(openMode); 66 newMap.file->resize(newMap.mapSize()); 67 newMap.mappedBytes = newMap.file->map(0, newMap.mapSize()); 68 newMap.file->close(); 69 newMap.markUsed(); 70 m_pool.append(newMap); 71 return &m_pool.last(); 52 72 } 53 73 54 MappedMemory & MappedMemoryPool::append(const MappedMemory& newMap)74 MappedMemory* MappedMemoryPool::mapFile(QString fileName, size_t size, QIODevice::OpenMode openMode) 55 75 { 76 for (unsigned n = 0; n < m_pool.size(); ++n) { 77 MappedMemory& current = m_pool.at(n); 78 if (current.file->fileName() == fileName) { 79 ASSERT(!current.isFree()); 80 return ¤t; 81 } 82 } 83 MappedMemory newMap; 84 newMap.file = new QFile(fileName); 85 if (!newMap.file->open(openMode)) 86 return 0; 87 newMap.dataSize = size; 88 newMap.mappedBytes = newMap.file->map(0, newMap.mapSize()); 89 ASSERT(!newMap.isFree()); 90 newMap.file->close(); 91 newMap.file->remove(); // The map stays alive even when the file is unlinked. 56 92 m_pool.append(newMap); 57 return m_pool.last(); 58 } 59 60 void MappedMemoryPool::cleanUp() 61 { 62 size_t size = m_pool.size(); 63 64 for (size_t i = 0; i < size; ++i) { 65 MappedMemory& chunk = m_pool.at(i); 66 if (!chunk.isFree()) 67 chunk.file->unmap(chunk.mappedBytes); 68 chunk.file->remove(); 69 } 70 71 delete this; 93 return &m_pool.last(); 72 94 } 73 95 -
trunk/WebKit2/Platform/qt/MappedMemoryPool.h
r70519 r70520 26 26 */ 27 27 28 #ifndef MappedMemory _h29 #define MappedMemory _h28 #ifndef MappedMemoryPool_h 29 #define MappedMemoryPool_h 30 30 31 #include <QCoreApplication>32 31 #include <QFile> 33 32 #include <wtf/Vector.h> 34 33 35 34 namespace WebKit { 36 struct MappedMemory {37 QFile* file;38 struct Data {39 uint32_t isFree; // keep bytes aligned40 uchar bytes;41 };42 union {43 uchar* mappedBytes;44 Data* dataPtr;45 };46 size_t dataSize;47 35 48 size_t mapSize() const { return dataSize + sizeof(Data); } 49 void markUsed() { dataPtr->isFree = false; } 50 void markFree() { dataPtr->isFree = true; } 51 bool isFree() const { return dataPtr->isFree; } 52 uchar* data() const { return &dataPtr->bytes; } 53 }; 54 55 class MappedMemoryPool : public QObject { 56 Q_OBJECT 36 class MappedMemoryPool { 57 37 public: 58 38 static MappedMemoryPool* instance(); 59 size_t size() const; 60 MappedMemory& at(size_t i); 61 MappedMemory& append(const MappedMemory&); 39 40 struct MappedMemory { 41 QFile* file; 42 struct Data { 43 uint32_t isFree; // keep bytes aligned 44 uchar bytes; 45 }; 46 union { 47 uchar* mappedBytes; 48 Data* dataPtr; 49 }; 50 size_t dataSize; 51 52 size_t mapSize() const { return dataSize + sizeof(Data); } 53 void markUsed() { dataPtr->isFree = false; } 54 void markFree() { dataPtr->isFree = true; } 55 bool isFree() const { return dataPtr->isFree; } 56 uchar* data() const { return &dataPtr->bytes; } 57 }; 58 59 MappedMemory* mapMemory(size_t size, QIODevice::OpenMode openMode = QIODevice::ReadWrite); 60 MappedMemory* mapFile(QString fileName, size_t size, QIODevice::OpenMode openMode = QIODevice::ReadWrite); 61 MappedMemory* searchForMappedMemory(uchar* p); 62 62 63 63 private: 64 MappedMemoryPool(); 65 Q_SLOT void cleanUp(); 64 MappedMemoryPool() { }; 66 65 67 66 Vector<MappedMemory> m_pool; 68 67 }; 68 69 typedef MappedMemoryPool::MappedMemory MappedMemory; 70 69 71 } // namespace WebKit 70 #endif // MappedMemory_h 72 73 #endif // MappedMemoryPool_h -
trunk/WebKit2/Platform/qt/SharedMemoryQt.cpp
r70453 r70520 1 1 /* 2 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * Copyright (c) 2010 University of Szeged 4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 5 * 4 6 * Redistribution and use in source and binary forms, with or without … … 26 28 #include "SharedMemory.h" 27 29 28 #include "NotImplemented.h" 30 #include "ArgumentDecoder.h" 31 #include "ArgumentEncoder.h" 32 #include "MappedMemoryPool.h" 33 #include "WebCoreArgumentCoders.h" 34 #include <QIODevice> 35 #include <unistd.h> 36 #include <wtf/text/WTFString.h> 29 37 30 38 namespace WebKit { 31 39 40 static MappedMemoryPool* mappedMemoryPool = MappedMemoryPool::instance(); 41 32 42 SharedMemory::Handle::Handle() 43 : m_fileName() 44 , m_size(0) 33 45 { 34 notImplemented();35 46 } 36 47 37 48 SharedMemory::Handle::~Handle() 38 49 { 39 notImplemented(); 50 } 51 52 bool SharedMemory::Handle::isNull() const 53 { 54 return m_fileName.isNull(); 40 55 } 41 56 42 57 void SharedMemory::Handle::encode(CoreIPC::ArgumentEncoder* encoder) const 43 58 { 44 notImplemented(); 59 encoder->encodeUInt64(m_size); 60 encoder->encode(m_fileName); 61 m_fileName = String(); 45 62 } 46 63 47 64 bool SharedMemory::Handle::decode(CoreIPC::ArgumentDecoder* decoder, Handle& handle) 48 65 { 49 notImplemented(); 50 return false; 66 ASSERT(!handle.m_size); 67 ASSERT(handle.m_fileName.isEmpty()); 68 69 uint64_t size; 70 if (!decoder->decodeUInt64(size)) 71 return false; 72 73 String fileName; 74 if (!decoder->decode(fileName)) 75 return false; 76 77 handle.m_size = size; 78 handle.m_fileName = fileName; 79 80 return true; 51 81 } 52 82 53 83 PassRefPtr<SharedMemory> SharedMemory::create(size_t size) 54 84 { 55 notImplemented(); 56 return 0; 85 MappedMemory* mm = mappedMemoryPool->mapMemory(size, QIODevice::ReadWrite); 86 87 RefPtr<SharedMemory> sharedMemory(adoptRef(new SharedMemory)); 88 sharedMemory->m_size = size; 89 sharedMemory->m_data = reinterpret_cast<void*>(mm->data()); 90 91 return sharedMemory.release(); 92 } 93 94 static inline QIODevice::OpenMode mapProtection(SharedMemory::Protection protection) 95 { 96 switch (protection) { 97 case SharedMemory::ReadOnly: 98 return QIODevice::ReadOnly; 99 case SharedMemory::ReadWrite: 100 return QIODevice::ReadWrite; 101 } 102 103 ASSERT_NOT_REACHED(); 104 return QIODevice::NotOpen; 57 105 } 58 106 59 107 PassRefPtr<SharedMemory> SharedMemory::create(const Handle& handle, Protection protection) 60 108 { 61 notImplemented(); 62 return 0; 109 if (handle.isNull()) 110 return 0; 111 112 QIODevice::OpenMode openMode = mapProtection(protection); 113 114 MappedMemory* mm = mappedMemoryPool->mapFile(QString(handle.m_fileName), handle.m_size, openMode); 115 116 RefPtr<SharedMemory> sharedMemory(adoptRef(new SharedMemory)); 117 sharedMemory->m_size = handle.m_size; 118 sharedMemory->m_data = reinterpret_cast<void*>(mm->data()); 119 120 return sharedMemory.release(); 63 121 } 64 122 65 123 SharedMemory::~SharedMemory() 66 124 { 67 notImplemented(); 125 MappedMemory* mappedMemory = mappedMemoryPool->searchForMappedMemory(reinterpret_cast<uchar*>(m_data)); 126 if (mappedMemory) 127 mappedMemory->markFree(); 68 128 } 69 129 70 130 bool SharedMemory::createHandle(Handle& handle, Protection protection) 71 131 { 72 notImplemented(); 73 return false; 132 ASSERT(handle.m_fileName.isNull()); 133 ASSERT(!handle.m_size); 134 135 MappedMemory* mm = mappedMemoryPool->searchForMappedMemory(reinterpret_cast<uchar*>(m_data)); 136 137 if (!mm) 138 return false; 139 140 handle.m_fileName = mm->file->fileName(); 141 handle.m_size = m_size; 142 143 return true; 74 144 } 75 145 … … 78 148 static unsigned pageSize = 0; 79 149 150 if (!pageSize) 151 pageSize = getpagesize(); 152 80 153 return pageSize; 81 154 } -
trunk/WebKit2/Shared/qt/UpdateChunk.cpp
r70453 r70520 30 30 #include "ArgumentDecoder.h" 31 31 #include "ArgumentEncoder.h" 32 #include "Attachment.h"33 32 #include "WebCoreArgumentCoders.h" 34 #include <QDebug> 35 #include <QDir> 33 #include <QIODevice> 36 34 #include <QImage> 37 #include <QTemporaryFile>38 35 #include <WebCore/FloatRect.h> 39 36 #include <wtf/text/WTFString.h> … … 44 41 namespace WebKit { 45 42 46 static MappedMemory* mapMemory(size_t size) 47 { 48 MappedMemoryPool* pool = MappedMemoryPool::instance(); 49 for (unsigned n = 0; n < pool->size(); ++n) { 50 MappedMemory& current = pool->at(n); 51 if (current.dataSize >= size && current.isFree()) { 52 current.markUsed(); 53 return ¤t; 54 } 55 } 56 MappedMemory newMap; 57 newMap.dataSize = size; 58 newMap.file = new QTemporaryFile(QDir::tempPath() + "/WebKit2UpdateChunk"); 59 newMap.file->open(QIODevice::ReadWrite); 60 newMap.file->resize(newMap.mapSize()); 61 newMap.mappedBytes = newMap.file->map(0, newMap.mapSize()); 62 newMap.file->close(); 63 newMap.markUsed(); 64 return &pool->append(newMap); 65 } 66 67 static MappedMemory* mapFile(QString fileName, size_t size) 68 { 69 MappedMemoryPool* pool = MappedMemoryPool::instance(); 70 for (unsigned n = 0; n < pool->size(); ++n) { 71 MappedMemory& current = pool->at(n); 72 if (current.file->fileName() == fileName) { 73 ASSERT(!current.isFree()); 74 return ¤t; 75 } 76 } 77 MappedMemory newMap; 78 newMap.file = new QFile(fileName); 79 if (!newMap.file->open(QIODevice::ReadWrite)) 80 return 0; 81 newMap.dataSize = size; 82 newMap.mappedBytes = newMap.file->map(0, newMap.mapSize()); 83 ASSERT(!newMap.isFree()); 84 newMap.file->close(); 85 newMap.file->remove(); // The map stays alive even when the file is unlinked. 86 return &pool->append(newMap); 87 } 43 static MappedMemoryPool* mappedMemoryPool = MappedMemoryPool::instance(); 88 44 89 45 UpdateChunk::UpdateChunk() … … 94 50 UpdateChunk::UpdateChunk(const IntRect& rect) 95 51 : m_rect(rect) 96 , m_mappedMemory(map Memory(size()))52 , m_mappedMemory(mappedMemoryPool->mapMemory(size())) 97 53 { 98 54 } … … 125 81 return false; 126 82 chunk.m_rect = rect; 127 83 128 84 String fileName; 129 85 if (!decoder->decode(fileName)) 130 86 return false; 131 87 132 chunk.m_mappedMemory = map File(fileName, chunk.size());88 chunk.m_mappedMemory = mappedMemoryPool->mapFile(fileName, chunk.size()); 133 89 134 90 return chunk.m_mappedMemory->mappedBytes; -
trunk/WebKit2/Shared/qt/UpdateChunk.h
r70453 r70520 28 28 #define UpdateChunk_h 29 29 30 #include "MappedMemory .h"30 #include "MappedMemoryPool.h" 31 31 #include <QImage> 32 32 #include <WebCore/IntRect.h> -
trunk/WebKit2/WebKit2.pro
r70504 r70520 107 107 Platform \ 108 108 Platform/CoreIPC \ 109 Platform/qt \ 109 110 Shared \ 110 111 Shared/API/c \ … … 175 176 Platform/Module.h \ 176 177 Platform/PlatformProcessIdentifier.h \ 178 Platform/qt/MappedMemoryPool.h \ 177 179 Platform/RunLoop.h \ 178 180 Platform/SharedMemory.h \ … … 204 206 Shared/NotImplemented.h \ 205 207 Shared/StringPairVector.h \ 206 Shared/qt/MappedMemory.h \207 208 Shared/qt/PlatformCertificateInfo.h \ 208 209 Shared/qt/UpdateChunk.h \ … … 341 342 Platform/RunLoop.cpp \ 342 343 Platform/WorkQueue.cpp \ 344 Platform/qt/MappedMemoryPool.cpp \ 343 345 Platform/qt/ModuleQt.cpp \ 344 346 Platform/qt/RunLoopQt.cpp \ … … 361 363 Shared/MutableDictionary.cpp \ 362 364 Shared/qt/BackingStoreQt.cpp \ 363 Shared/qt/MappedMemoryPool.cpp \364 365 Shared/qt/NativeWebKeyboardEventQt.cpp \ 365 366 Shared/qt/UpdateChunk.cpp \
Note: See TracChangeset
for help on using the changeset viewer.